Как работать с сочетаниями клавиш
Я пишу приложение Flutter и хочу обрабатывать сочетания клавиш, такие как Ctrl+I, в веб-версии приложения.
Небольшой отказ от ответственности: похоже, что API Flutter для ярлыков недавно изменился. Найденная мною онлайн-документация устарела. я используюFlutter 1.19.0-0.0.pre • channel dev
.
Я нашел документ Actions API Design, который похож на текущий доступный API. На основе примера в документе я реализовал этот короткий фрагмент:
class MyIntent extends Intent {}
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: Shortcuts(
shortcuts: {
LogicalKeySet(LogicalKeyboardKey.control): MyIntent(),
},
child: Actions(
actions: {
MyIntent: CallbackAction(onInvoke: (i) {
print('Hello World!!!');
return null;
}),
},
child: Center(
child: Column(
children: <Widget>[
Text(
'Hello World',
),
],
),
),
),
),
);
}
}
Однако он не реагирует на нажатие клавиши Ctrl и не выводит ожидаемое сообщение. При отладке кода я заметил, что экземплярShortcutManager
который обрабатывает ключевое событие, содержит не мою комбинацию клавиш, как указано, а девять других комбинаций клавиш.
Кто-нибудь знает, как пользоваться Shortcuts
а также Actions
API реагировать на сочетания клавиш?
2 ответа
В вашем примере у вас есть правильная идея, но вам не хватает Focus
виджет. Если у виджета нет фокуса, то его предокShortcuts
виджет не получит ключевое событие для его обработки.
Посмотрите этот пример Dartpad, чтобы понять, что я имею в виду. Пример добавляет новое "Домашнее задание" при нажатии клавиш "Alt+N".
Вы также можете использовать FocusableActionDetector, который объединяетShortcuts
, Actions
, и обработка наведения курсора мыши в один виджет.
Я хочу добавить кое-что в ответ выше ( /questions/54578901/kak-rabotat-s-sochetaniyami-klavish/54578913#54578913):
Если вы хотите добавить более одной клавиши в одно сочетание клавиш, ваш код будет таким:
shortcuts: <ShortcutActivator, Intent> {
LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyL): MyIntent(),
},