Flutter键盘快捷键管理插件keyboard_shortcuts的使用

Flutter键盘快捷键管理插件keyboard_shortcuts的使用

简介

keyboard_shortcuts 是一个用于在 Flutter 应用中管理键盘快捷键的插件。通过该插件,您可以轻松为应用添加全局或局部的键盘快捷键,从而提升用户体验。


示例

基本用法

1. 定义一个局部快捷键

在以下示例中,当按下 Control Left + P 键时,用户将被导航到 SecondPage() 页面,并且会在帮助菜单中显示 “Go to Second Page” 的标签。

KeyBoardShortcuts(
  keysToPress: {LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyP}, // 快捷键组合
  onKeysPressed: () => Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondPage()),
  ), // 快捷键触发的回调
  helpLabel: "Go to Second Page", // 帮助菜单中显示的标签
  child: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('You have pushed the button this many times:'), // 示例文本
        Text('$_counter', style: Theme.of(context).textTheme.headline4),
      ],
    ),
  ),
)

运行效果:


全局快捷键

2. 启用全局快捷键

如果设置 globalShortcuts: true,可以启用全局快捷键功能,例如按下 Home 键返回首页,按下方向键上下移动页面,按下 Esc 返回上一页。

KeyBoardShortcuts(
  globalShortcuts: true,
  child: Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('You have pushed the button this many times:'),
        Text('$_counter', style: Theme.of(context).textTheme.headline4),
      ],
    ),
  ),
)

自定义快捷键

3. 初始化自定义快捷键

通过 initShortCuts() 方法,您可以自定义快捷键的行为,包括设置主页、帮助菜单标题、图标等。

initShortCuts(
  HomePage(), // 主页
  helpTitle: "Help Menu", // 帮助菜单标题
  helpIcon: Icons.menu, // 帮助菜单图标
);

4. 创建全局快捷键

使用 initShortCuts() 方法创建全局快捷键,这些快捷键将在所有启用了 globalShortcuts 的页面中生效。

initShortCuts(
  HomePage(),
  keysToPress: {LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyP}, // 快捷键组合
  onKeysPressed: () => print("Work"), // 快捷键触发的回调
  helpLabel: "Print Work", // 帮助菜单中显示的标签
);

完整示例代码

以下是完整的示例代码,展示了如何在 Flutter 应用中使用 keyboard_shortcuts 插件。

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:keyboard_shortcuts/keyboard_shortcuts.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;

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

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
        leading: IconButton(
          icon: Icon(Icons.list),
          onPressed: () => Navigator.push(
            context,
            MaterialPageRoute(builder: (context) => SecondPage()),
          ),
        ),
      ),
      body: KeyBoardShortcuts(
        keysToPress: {LogicalKeyboardKey.controlLeft, LogicalKeyboardKey.keyP}, // 局部快捷键
        onKeysPressed: () => Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => SecondPage()),
        ),
        helpLabel: "Go to Second Page", // 帮助菜单标签
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('You have pushed the button this many times:'),
              Text('$_counter', style: Theme.of(context).textTheme.headline4),
            ],
          ),
        ),
      ),
      floatingActionButton: KeyBoardShortcuts(
        keysToPress: shortCut(BasicShortCuts.creation), // 浮动按钮快捷键
        onKeysPressed: _incrementCounter,
        helpLabel: "Increment", // 帮助菜单标签
        child: FloatingActionButton(
          onPressed: _incrementCounter,
          tooltip: 'Increment',
          child: Icon(Icons.add),
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    List<String> generatedList = List<String>.generate(100, (counter) => "Item $counter");

    return Scaffold(
      appBar: AppBar(
        title: Text("Second Page"),
      ),
      body: KeyBoardShortcuts(
        globalShortcuts: true, // 启用全局快捷键
        child: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Expanded(
                child: ListView.builder(
                  itemCount: generatedList.length,
                  itemBuilder: (BuildContext ctxt, int index) => Center(
                    child: Text(generatedList[index]),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


keyboard_shortcuts 是一个用于在 Flutter 应用中管理键盘快捷键的插件。它允许你为特定的键盘组合键绑定回调函数,从而在用户按下这些组合键时执行相应的操作。以下是如何使用 keyboard_shortcuts 插件的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  keyboard_shortcuts: ^1.0.0

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

2. 导入包

在你的 Dart 文件中导入 keyboard_shortcuts 包:

import 'package:keyboard_shortcuts/keyboard_shortcuts.dart';

3. 使用 KeyboardShortcuts 组件

KeyboardShortcuts 是一个 Widget,你可以将它添加到你的 widget 树中,并为其指定快捷键和回调函数。

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Keyboard Shortcuts Example'),
        ),
        body: Center(
          child: KeyboardShortcuts(
            keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyS},
            onKeysPressed: () {
              print('Ctrl + S pressed');
              // 在这里执行你的操作
            },
            child: Text('Press Ctrl + S to trigger the shortcut'),
          ),
        ),
      ),
    );
  }
}

4. 解释代码

  • keysToPress: 这是一个 Set<LogicalKeyboardKey>,用于指定触发快捷键的键组合。例如,{LogicalKeyboardKey.control, LogicalKeyboardKey.keyS} 表示 Ctrl + S
  • onKeysPressed: 这是一个回调函数,当用户按下指定的键组合时,这个函数会被调用。
  • child: 这是 KeyboardShortcuts 的子 Widget,通常是你希望在屏幕上显示的内容。

5. 处理多个快捷键

你可以在同一个页面中使用多个 KeyboardShortcuts 组件来处理不同的快捷键组合。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Keyboard Shortcuts Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              KeyboardShortcuts(
                keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyS},
                onKeysPressed: () {
                  print('Ctrl + S pressed');
                },
                child: Text('Press Ctrl + S to save'),
              ),
              SizedBox(height: 20),
              KeyboardShortcuts(
                keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyQ},
                onKeysPressed: () {
                  print('Ctrl + Q pressed');
                },
                child: Text('Press Ctrl + Q to quit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

6. 处理全局快捷键

如果你需要处理全局快捷键(即无论焦点在哪个 Widget 上都能触发的快捷键),你可以将 KeyboardShortcuts 放在应用的顶层 Widget 中。

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: KeyboardShortcuts(
        keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyS},
        onKeysPressed: () {
          print('Ctrl + S pressed globally');
        },
        child: Scaffold(
          appBar: AppBar(
            title: Text('Global Keyboard Shortcuts Example'),
          ),
          body: Center(
            child: Text('Press Ctrl + S to trigger the global shortcut'),
          ),
        ),
      ),
    );
  }
}

7. 注意事项

  • keyboard_shortcuts 插件依赖于 Flutter 的 RawKeyboardLogicalKeyboardKey,因此它只能在支持键盘输入的平台上使用(如桌面和 Web 应用)。
  • 确保你使用的键组合在目标平台上是可用的,并且不会与系统或其他应用的快捷键冲突。

8. 更多功能

keyboard_shortcuts 插件还支持其他功能,如处理长按快捷键、自定义快捷键的优先级等。你可以查阅插件的官方文档以获取更多信息。

9. 示例代码

以下是一个完整的示例代码,展示了如何使用 keyboard_shortcuts 插件:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:keyboard_shortcuts/keyboard_shortcuts.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Keyboard Shortcuts Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              KeyboardShortcuts(
                keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyS},
                onKeysPressed: () {
                  print('Ctrl + S pressed');
                },
                child: Text('Press Ctrl + S to save'),
              ),
              SizedBox(height: 20),
              KeyboardShortcuts(
                keysToPress: {LogicalKeyboardKey.control, LogicalKeyboardKey.keyQ},
                onKeysPressed: () {
                  print('Ctrl + Q pressed');
                },
                child: Text('Press Ctrl + Q to quit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}
回到顶部