У меня есть решение ... но я все еще не совсем понимаю его. Я наконец-то начал использовать как можно больше примеров из 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));
},
),
),
);
}