Получить значение нажатия клавиши без фокуса текстового поля в веб-флаттере, используя RawKeyboardListener - PullRequest
0 голосов
/ 02 мая 2020

Я играю вокруг, пишу видеоигру "змея" для трепетной паутины. Я хотел бы использовать клавиши со стрелками для перемещения, но я не смог захватить нажатия клавиш с помощью RawKeyboardListener. Я считаю, что это связано с тем, что у меня нет правильного узла в фокусе. На данный момент я просто пытаюсь распечатать полученные нажатия клавиш.

Вот мой тестовый код:

Scaffold(
      appBar: AppBar(),
      body: RawKeyboardListener(
        focusNode: FocusNode(),      //<-- I'm not sure what to put here... and it's required.
        onKey: (RawKeyEvent event) {
          print(event.data.logicalKey.keyId);
        },
        child: GridView.builder(
          itemCount: 300,
          gridDelegate:
              SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 30),
          itemBuilder: (BuildContext context, int index) {
            return Container(
                padding: EdgeInsets.all(5.0),
                color: Colors.grey,
                child: getPixels(index));
          },
        ),
      ),
    );

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Попробуйте добавить autoFocus: true,

Согласно документации,

True if this widget will be selected as the initial focus when no other node in its scope is currently focused.
...
Defaults to false.
0 голосов
/ 03 мая 2020

У меня есть решение ... но я все еще не совсем понимаю его. Я наконец-то начал использовать как можно больше примеров из Textfield для RawKeyboardListener, и натолкнулся на ответ: Flutter RawKeyboardListener, прослушивающий дважды? , а также пример в этом выпуске: https://github.com/flutter/flutter/issues/50854

Используя общности в качестве шаблона, это код, который в итоге заработал, и я надеюсь, что он поможет кому-то еще (и я бы хотел понять, что именно происходит):

import 'package:flutter/services.dart';  //<-- needed for the keypress comparisons

FocusNode focusNode = FocusNode();  // <-- still no idea what this is.

  @override
  Widget build(BuildContext context) {
    FocusScope.of(context).requestFocus(focusNode); // <-- yup.  magic. no idea.
    return Scaffold(
        appBar: AppBar(),
        body: RawKeyboardListener(
          autofocus: true,
          focusNode: focusNode,   // <-- more magic
          onKey: (RawKeyEvent event) {
            if (event.data.logicalKey == LogicalKeyboardKey.arrowDown) {
               direction = "down";
               }
            if (event.data.logicalKey == LogicalKeyboardKey.arrowLeft) {
               direction = "left";
               }
            if (event.data.logicalKey == LogicalKeyboardKey.arrowRight) {
               direction = "right";
               }
            if (event.data.logicalKey == LogicalKeyboardKey.arrowUp) {
               direction = "up";
               }
          },
          child: GridView.builder(
              physics: NeverScrollableScrollPhysics(),
              itemCount: 300,
              gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 30),
              itemBuilder: (BuildContext context, int index) {
                return Container(
                    padding: EdgeInsets.all(5.0),
                    color: Colors.grey,
                    child: getPixels(index));
              },
            ),
          ),
      );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...