Flutter全局快捷键管理插件galactic_hotkeys的使用

Flutter全局快捷键管理插件galactic_hotkeys的使用

使用

要使用Galactic Hotkeys,你需要将你的主部件包裹在GalacticHotkeys部件中,并提供所需的快捷键和一个回调函数来处理当快捷键被按下时的操作。

GalacticHotkeys<String>(
  shortcuts: {
    '保存': [
      [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyS],
      [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyS],
    ],
    '复制': [
      [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyC],
      [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyC],
    ],
    // 添加更多快捷键
  },
  onShortcutPressed: (String identifier, List<LogicalKeyboardKey> pressedKeys) {
    // 处理快捷键按下事件
    print('快捷键已按下: $identifier');
  },
  child: const Container(),
)

在这个例子中,GalacticHotkeys部件用于捕获键盘快捷键并触发带有相应标识符的onShortcutPressed回调。

此外,你还可以使用GalacticHotkeysBuilder部件来根据当前按下的按键构建你的UI。

GalacticHotkeysBuilder(
  builder: (context, List<LogicalKeyboardKey> pressedKeys) {
    // 示例:检查是否仅Control键被按下
    final onlyControlIsPressed = pressedKeys.length == 1 && pressedKeys.first == LogicalKeyboardKey.controlLeft;
    
    // 使用pressedKeys信息来根据条件构建你的自定义部件
    return YourCustomWidget(
      showControlMessage: onlyControlIsPressed,
    );
  },
)

在这个例子中,GalacticHotkeysBuilder用于获取当前按下的按键列表,并根据仅Control键被按下的条件来构建一个自定义部件。根据你的应用需求定制builder函数。 注意: GalacticHotkeysBuilder应在组件树中有一个父级的GalacticHotkeys部件才能正常工作。确保你已经用GalacticHotkeys或其等效祖先部件包装了你的主部件。

示例代码

以下是完整的示例代码:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:galactic_hotkeys/galactic_hotkeys_widget.dart';

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

class ExampleGalacticHotkeys extends StatelessWidget {
  const ExampleGalacticHotkeys({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Galactic Hotkeys 示例',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: const _HomePage(),
    );
  }
}

enum Shortcut {
  撤销,
  重做,
  剪切,
  复制,
  粘贴,
}

class _HomePage extends StatefulWidget {
  const _HomePage({super.key});

  [@override](/user/override)
  State<_HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<_HomePage> {
  Shortcut? _latestPressedShortcut;
  Timer? _delayToClearShortcutPressed;

  [@override](/user/override)
  void dispose() {
    _delayToClearShortcutPressed?.cancel();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Galactic Hotkeys'),
      ),
      body: GalacticHotkeys<Shortcut>(
        shortcuts: const {
          Shortcut.撤销: [
            [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyZ],
            [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyZ],
          ],
          Shortcut.重做: [
            [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyY],
            [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyY],
            [
              LogicalKeyboardKey.controlLeft,
              LogicalKeyboardKey.shiftLeft,
              LogicalKeyboardKey.keyZ
            ],
            [
              LogicalKeyboardKey.metaLeft,
              LogicalKeyboardKey.shiftLeft,
              LogicalKeyboardKey.keyZ
            ],
          ],
          Shortcut.剪切: [
            [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyX],
            [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyX],
          ],
          Shortcut.复制: [
            [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyC],
            [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyC],
          ],
          Shortcut.粘贴: [
            [LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyV],
            [LogicalKeyboardKey.metaLeft, LogicalKeyboardKey.keyV],
          ],
        },
        onShortcutPressed: (Shortcut shortcut, pressedKeys) {
          setState(() => _latestPressedShortcut = shortcut);

          _delayToClearShortcutPressed?.cancel();
          _delayToClearShortcutPressed = Timer(const Duration(seconds: 2), () {
            if (mounted) {
              setState(() => _latestPressedShortcut = null);
            }
          });
          // switch (shortcut) {
          //   case Shortcut.撤销:
          //     break;
          //   case Shortcut.重做:
          //     break;
          //   case Shortcut.剪切:
          //     break;
          //   case Shortcut.复制:
          //     break;
          //   case Shortcut.粘贴:
          //     break;
          // }
        },
        child: ListView(
          children: [
            for (final shortcut in Shortcut.values)
              ListTile(
                title: Text(
                  shortcut.name,
                  style: TextStyle(
                    color: shortcut == _latestPressedShortcut ? Colors.red : null,
                  ),
                ),
              ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter全局快捷键管理插件galactic_hotkeys的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter全局快捷键管理插件galactic_hotkeys的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何使用 galactic_hotkeys 插件在 Flutter 应用中实现全局快捷键管理的代码示例。这个插件允许你在桌面平台上(如 Windows、macOS 和 Linux)监听和处理全局快捷键。

首先,确保你的 Flutter 项目已经添加了 galactic_hotkeys 依赖。在 pubspec.yaml 文件中添加以下依赖:

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

然后运行 flutter pub get 以获取依赖。

接下来,你需要进行一些平台特定的设置。对于 Windows 和 macOS,你需要在 CMakeLists.txtInfo.plist 中进行一些配置,但这里我们主要关注 Flutter 代码部分。

示例代码

以下是一个简单的 Flutter 应用示例,演示如何使用 galactic_hotkeys 插件注册和处理全局快捷键。

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
  late HotkeyManager hotkeyManager;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
    hotkeyManager = HotkeyManager();

    // 注册全局快捷键
    hotkeyManager.registerHotkey(
      Hotkey(LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyA),
      onHotkeyPressed,
    );

    // 启动监听
    hotkeyManager.startListening();
  }

  @override
  void dispose() {
    hotkeyManager.stopListening();
    WidgetsBinding.instance?.removeObserver(this);
    super.dispose();
  }

  void onHotkeyPressed() {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text('全局快捷键 Ctrl+A 被按下!'),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Galactic Hotkeys 示例'),
        ),
        body: Center(
          child: Text('按下 Ctrl+A 查看效果'),
        ),
      ),
    );
  }
}

说明

  1. 依赖导入:首先导入 galactic_hotkeys 包。
  2. HotkeyManager:创建一个 HotkeyManager 实例来管理快捷键。
  3. 注册快捷键:使用 hotkeyManager.registerHotkey 方法注册一个快捷键(例如 Ctrl+A),并指定一个回调函数 onHotkeyPressed
  4. 启动监听:调用 hotkeyManager.startListening 方法开始监听全局快捷键。
  5. 处理快捷键事件:在 onHotkeyPressed 回调函数中处理快捷键按下事件,这里只是简单地显示一个 Snackbar。
  6. 资源释放:在 dispose 方法中停止监听并移除观察者,以防止内存泄漏。

注意事项

  • 这个示例代码适用于桌面平台(Windows、macOS、Linux)。
  • 确保在桌面平台上运行这个应用,因为移动平台不支持全局快捷键。
  • 根据你的需求,你可以注册多个快捷键并处理不同的事件。

希望这个示例代码能帮助你理解如何在 Flutter 应用中使用 galactic_hotkeys 插件进行全局快捷键管理。如果你有任何进一步的问题,欢迎继续提问!

回到顶部