Flutter鼠标事件处理插件mouse_event的使用

Flutter鼠标事件处理插件mouse_event的使用

屏幕录制

Flutter 插件用于在 Windows 上捕获鼠标事件,即使你在使用其他程序时也能捕获。

该插件使用 Windows 的 SetWindowsHookEx API。点击链接以获取更多详细信息。

WH_MOUSE_LL: 安装一个钩子过程来监控低级别的鼠标输入事件。有关更多信息,请参阅 LowLevelMouseProc 钩子过程

开始使用

请参阅 示例代码

// 开始监听
MouseEventPlugin.startListening((mouseEvent) {
});

// 停止监听
MouseEventPlugin.cancelListening();

示例代码

以下是完整的示例代码:

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

import 'package:flutter/services.dart';
import 'package:mouse_event/mouse_event.dart';

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

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

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  final List<String> _err = [];
  final List<String> _event = [];
  int eventNum = 0;
  bool listenIsOn = false;

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

  // 平台消息是异步的,所以我们初始化在一个异步方法中。
  Future<void> initPlatformState() async {
    String? platformVersion;
    List<String> err = [];
    
    // 平台消息可能会失败,所以我们使用 try/catch PlatformException。
    try {
      platformVersion = await MouseEventPlugin.platformVersion;
    } on PlatformException {
      err.add('获取平台版本失败。');
    }
    
    // 如果窗口小部件从树中移除时异步平台消息仍在飞行,则我们希望丢弃回复而不是调用
    // setState 来更新我们的不存在的外观。
    if (!mounted) return;

    setState(() {
      if (platformVersion != null) _platformVersion = platformVersion;
      if (err.isNotEmpty) _err.addAll(err);
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('插件示例应用'),
        ),
        body: LayoutBuilder(
          builder: (BuildContext context, BoxConstraints viewportConstraints) {
            return SingleChildScrollView(
              child: Row(
                children: [
                  const SizedBox(
                    width: 20,
                  ),
                  Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    children: [
                      Text('运行于: $_platformVersion'),
                      Row(
                        children: [
                          const Text('点击按钮切换鼠标监听: '),
                          Switch(
                            value: listenIsOn,
                            onChanged: (bool newValue) {
                              setState(() {
                                listenIsOn = newValue;
                                if (listenIsOn == true) {
                                  // 开始监听鼠标事件
                                  MouseEventPlugin.startListening((mouseEvent) {
                                    setState(() {
                                      eventNum++;
                                      _event.add(mouseEvent.toString());
                                      if (_event.length > 20) {
                                        _event.removeAt(0);
                                      }
                                      debugPrint(mouseEvent.toString());
                                    });
                                  });
                                } else {
                                  // 停止监听鼠标事件
                                  MouseEventPlugin.cancelListening();
                                }
                              });
                            },
                          ),
                        ],
                      ),
                      Row(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              ElevatedButton.icon(
                                onPressed: () {
                                  setState(() => _event.clear());
                                },
                                icon: const Icon(Icons.delete),
                                label: const Text('清除'),
                              ),
                              Text(
                                _event.join('\n'),
                                overflow: TextOverflow.ellipsis,
                                maxLines: 20,
                              ),
                            ],
                          ),
                        ],
                      ),
                      const SizedBox(
                        height: 20,
                      ),
                    ],
                  ),
                ],
              ),
            );
          },
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            initPlatformState();
          },
        ),
      ),
    );
  }
}

更多关于Flutter鼠标事件处理插件mouse_event的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter鼠标事件处理插件mouse_event的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用mouse_event插件来处理鼠标事件的示例代码。这个插件允许你在Flutter桌面应用中捕获和处理鼠标事件。

首先,你需要在你的pubspec.yaml文件中添加mouse_event插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  mouse_event: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们编写一个示例应用,展示如何使用这个插件来捕获鼠标事件。

主代码文件(main.dart

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Mouse Event Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MouseEventDemo(),
    );
  }
}

class MouseEventDemo extends StatefulWidget {
  @override
  _MouseEventDemoState createState() => _MouseEventDemoState();
}

class _MouseEventDemoState extends State<MouseEventDemo> {
  String _mouseEventInfo = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Mouse Event Demo'),
      ),
      body: MouseRegion(
        onEnter: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse entered at: ${details.position}';
          });
        },
        onExit: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse exited at: ${details.position}';
          });
        },
        onHover: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse hovered at: ${details.position}';
          });
        },
        onDown: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse down at: ${details.position}, button: ${details.button}';
          });
        },
        onUp: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse up at: ${details.position}, button: ${details.button}';
          });
        },
        onMove: (details) {
          setState(() {
            _mouseEventInfo = 'Mouse moved to: ${details.position}';
          });
        },
        child: Padding(
          padding: const EdgeInsets.all(20.0),
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Move your mouse over this area and watch the events being logged below.',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                _mouseEventInfo,
                style: TextStyle(fontSize: 18),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

解释

  1. 依赖添加:首先,我们在pubspec.yaml文件中添加了mouse_event插件的依赖。

  2. 主应用结构MyApp是一个基本的Flutter应用,包含一个MouseEventDemo组件。

  3. 事件处理MouseEventDemo是一个有状态的组件,它使用MouseRegion小部件来捕获鼠标事件。MouseRegion小部件提供了多个回调方法,如onEnteronExitonHoveronDownonUponMove,分别用于处理鼠标进入、离开、悬停、按下、释放和移动事件。

  4. 状态更新:每当捕获到鼠标事件时,我们通过调用setState方法来更新_mouseEventInfo字符串,并重新构建UI以显示最新的鼠标事件信息。

  5. UI布局:我们使用Column小部件来垂直排列文本和事件信息,并提供一些内边距来美化布局。

这个示例展示了如何使用mouse_event插件在Flutter桌面应用中处理鼠标事件。你可以根据需要进一步扩展和修改这个示例。

回到顶部