Flutter自动化GUI构建插件flutter_auto_gui的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter自动化GUI构建插件flutter_auto_gui的使用

简介

flutter_auto_gui 是一个用于桌面应用程序的Flutter插件,允许通过控制鼠标和键盘来自动化与其他应用程序的交互。该插件受到了 Python 的 PyAutoGui 和 JavaScript 的 RobotJs 的启发,并尝试模仿这些库中的大部分可用方法。

目前,flutter_auto_gui 主要支持 Windows 10+ 操作系统,其他平台(如 Android、iOS、Linux 和 macOS)的支持正在开发中。

使用方法

1. 添加依赖

pubspec.yaml 文件中添加 flutter_auto_gui 作为依赖项:

dependencies:
  flutter_auto_gui: <version>
2. 导入包

在 Dart 文件中导入 flutter_auto_gui 包:

import 'package:flutter_auto_gui/flutter_auto_gui.dart';
3. 使用示例

以下是一个完整的示例项目,展示了如何使用 flutter_auto_gui 插件来控制鼠标、键盘和屏幕操作。

import 'dart:math';

import 'package:flutter/material.dart';
import 'package:flutter_auto_gui/flutter_auto_gui.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final TextEditingController controller = TextEditingController();

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Auto GUI'),
        ),
        body: SingleChildScrollView(
          child: Padding(
            padding: const EdgeInsets.all(8.0),
            child: Column(
              children: [
                TextField(
                  controller: controller,
                ),
                Row(
                  children: [
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Mouse API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: [
                              ElevatedButton(
                                onPressed: () async {
                                  // 获取当前鼠标位置
                                  Point<int>? p = await FlutterAutoGUI.position();
                                  controller.text = 'Mouse Position = ${p.toString()}';
                                },
                                child: const Text('Mouse Position'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 将鼠标移动到 (10, 10) 位置,持续时间为 1 秒
                                  await FlutterAutoGUI.moveTo(
                                    point: const Point(10, 10),
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Move to 10, 10'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 相对当前位置移动 (100, -100),持续时间为 1 秒
                                  await FlutterAutoGUI.moveToRel(
                                    offset: const Size(100, -100),
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Move to rel 100, -100'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,将鼠标从当前位置拖动到 (100, 100),持续时间为 1 秒
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.dragTo(
                                    point: const Point(100, 100),
                                    button: MouseButton.left,
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Drag to 100, 100'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,相对当前位置拖动 (200, 300),持续时间为 1 秒
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.dragToRel(
                                    offset: const Size(200, 300),
                                    button: MouseButton.left,
                                    duration: const Duration(seconds: 1),
                                  );
                                },
                                child: const Text('Drag to rel 200, 300'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,按下左键
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.mouseDown(
                                    button: MouseButton.left,
                                  );
                                },
                                child: const Text('Set Left Button Down'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,释放左键
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.mouseUp(
                                    button: MouseButton.left,
                                  );
                                },
                                child: const Text('Set Left Button Up'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,单击左键
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.click(
                                    button: MouseButton.left,
                                    clicks: 1,
                                  );
                                },
                                child: const Text('Single click left button'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,双击左键
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.click(
                                    button: MouseButton.left,
                                    clicks: 2,
                                  );
                                },
                                child: const Text('Double click left button'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,垂直滚动 5 次
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.scroll(
                                    axis: Axis.vertical,
                                    clicks: 5,
                                  );
                                },
                                child: const Text('Vertical Scroll up for 5 clicks'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,水平滚动 5 次
                                  await Future.delayed(const Duration(seconds: 2));
                                  await FlutterAutoGUI.scroll(
                                    axis: Axis.horizontal,
                                    clicks: 5,
                                  );
                                },
                                child: const Text('Horizontal Scroll right for 5 clicks'),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Keyboard API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: [
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,按下 W 键
                                  await Future.delayed(const Duration(seconds: 2));
                                  FlutterAutoGUI.keyDown(key: 'w');
                                },
                                child: const Text('W key down'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,释放 W 键
                                  await Future.delayed(const Duration(seconds: 2));
                                  FlutterAutoGUI.keyUp(key: 'w');
                                },
                                child: const Text('W key up'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,按两次 W 键,每次间隔 2 秒
                                  await Future.delayed(const Duration(seconds: 2));
                                  FlutterAutoGUI.press(
                                    key: 'w',
                                    times: 2,
                                    interval: const Duration(seconds: 2),
                                  );
                                },
                                child: const Text('Press W key 2 times over 2 seconds'),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,输入 "hellO wOrld!",每个字符间隔 50 毫秒
                                  await Future.delayed(const Duration(seconds: 2));
                                  FlutterAutoGUI.write(
                                    text: 'hellO wOrld!',
                                    interval: const Duration(milliseconds: 50),
                                  );
                                },
                                child: const Text('Writes \'hellO wOrld!\''),
                              ),
                              ElevatedButton(
                                onPressed: () async {
                                  // 延迟 2 秒后,按下组合键 Ctrl + Shift + Esc
                                  await Future.delayed(const Duration(seconds: 2));
                                  FlutterAutoGUI.hotkey(
                                    keys: ['ctrl', 'shift', 'esc'],
                                  );
                                },
                                child: const Text('Hotkey (control + shift + escape)'),
                              ),
                            ],
                          ),
                        ],
                      ),
                    ),
                    Expanded(
                      child: Column(
                        children: [
                          const Text('Screen API'),
                          Wrap(
                            spacing: 5,
                            runSpacing: 5,
                            children: const [],
                          ),
                        ],
                      ),
                    )
                  ],
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

更多关于Flutter自动化GUI构建插件flutter_auto_gui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter自动化GUI构建插件flutter_auto_gui的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用Flutter自动化GUI构建插件flutter_auto_gui的示例代码案例。请注意,由于flutter_auto_gui并非一个真实存在或广泛认知的Flutter插件(截至我最后的知识更新),我将基于一个假设的自动化GUI构建插件的概念来提供一个示例。如果flutter_auto_gui是一个实际存在的插件,其API和用法可能会有所不同,因此请参考官方文档进行调整。

假设flutter_auto_gui插件允许我们通过某种配置自动生成UI组件,以下是一个简化的示例,展示如何使用该插件来自动化构建一个简单的Flutter应用界面。

1. 添加依赖

首先,在pubspec.yaml文件中添加flutter_auto_gui依赖(假设它存在):

dependencies:
  flutter:
    sdk: flutter
  flutter_auto_gui: ^0.1.0  # 假设版本号

2. 导入插件

在你的Dart文件中导入flutter_auto_gui

import 'package:flutter/material.dart';
import 'package:flutter_auto_gui/flutter_auto_gui.dart';

3. 配置UI组件

假设flutter_auto_gui允许我们通过JSON或某种数据结构来配置UI组件,我们可以定义一个配置对象:

List<Map<String, dynamic>> uiConfig = [
  {
    "type": "Scaffold",
    "appBar": {
      "title": "自动化GUI示例",
    },
    "body": {
      "type": "Column",
      "children": [
        {
          "type": "Text",
          "data": "欢迎使用Flutter自动化GUI构建插件!",
          "style": {
            "fontSize": 24,
            "color": "#000000",
          },
        },
        {
          "type": "Button",
          "text": "点击我",
          "onPressed": "onButtonClick",
        },
      ],
    },
  },
];

4. 使用插件构建UI

然后,我们可以使用flutter_auto_gui提供的函数来根据配置构建UI:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: AutoGuiBuilder(config: uiConfig),
    );
  }
}

class AutoGuiBuilder extends StatefulWidget {
  final List<Map<String, dynamic>> config;

  AutoGuiBuilder({required this.config});

  @override
  _AutoGuiBuilderState createState() => _AutoGuiBuilderState();
}

class _AutoGuiBuilderState extends State<AutoGuiBuilder> {
  void onButtonClick() {
    print("按钮被点击了!");
  }

  Widget buildWidgetFromConfig(Map<String, dynamic> config) {
    String type = config["type"] ?? "";
    switch (type) {
      case "Scaffold":
        return Scaffold(
          appBar: AppBar(title: Text(config["appBar"]?["title"] ?? "")),
          body: buildWidgetFromConfig(config["body"] ?? {}),
        );
      case "Column":
        return Column(
          children: (config["children"] ?? []).map(buildWidgetFromConfig).toList(),
        );
      case "Text":
        return Text(
          config["data"] ?? "",
          style: TextStyle(
            fontSize: config["style"]?["fontSize"] ?? 14,
            color: Color(int.parse(config["style"]?["color"] ?? "#000000")),
          ),
        );
      case "Button":
        return ElevatedButton(
          onPressed: () => {
            if (config["onPressed"] != null) {
              // 使用反射或其他机制调用对应的方法
              var methodName = config["onPressed"] as String;
              if (methodName == "onButtonClick") {
                onButtonClick();
              }
            }
          },
          child: Text(config["text"] ?? ""),
        );
      default:
        return Container();
    }
  }

  @override
  Widget build(BuildContext context) {
    return buildWidgetFromConfig(widget.config.first);
  }
}

注意事项

  1. 反射或回调处理:在上面的示例中,onButtonClick是通过硬编码的方式处理的。在实际应用中,你可能需要使用反射或其他机制来动态调用对应的方法。
  2. 错误处理:配置解析和UI构建过程中需要添加适当的错误处理逻辑。
  3. 性能优化:对于复杂的UI结构,需要注意性能优化,避免不必要的重建和渲染。
  4. 插件更新:如果flutter_auto_gui是一个真实存在的插件,请参考其官方文档和API指南进行实际开发。

这个示例提供了一个基本的框架,展示了如何通过配置数据自动生成Flutter UI。如果你使用的flutter_auto_gui插件有不同的API或用法,请根据实际情况进行调整。

回到顶部