Flutter:当物理键盘上按下某个键时,如何将焦点切换到另一个小部件



我正在Windows上开发一个桌面应用程序,当按下另一个文本字段上的ENTER键时,我正试图将焦点转移到一个文本域。我可以使用RawKeyboardListener检测到按键已被按下,但焦点没有更改为新字段。我该怎么做?

import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
late FocusNode _txtNode;
@override
void initState() {
super.initState();
_txtNode = FocusNode();
}
@override
void dispose() {
_txtNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Stack(
children: [
Container(
height: 400,
width: 500,
color: Colors.grey[350],
child: Column(
children: [
Container(
height: 100,
child: RawKeyboardListener(
focusNode: FocusNode(),
onKey: (event){
if (event.toString().contains('RawKeyDownEvent') && event.toString().contains('Enter')) {
print("pressed ENTER");
_txtNode.requestFocus();
}
},
child: TextField(readOnly: true,))
),
TextField(
),
TextField(
focusNode: _txtNode,
),
],
),
),
]
),
),
),
);
}
}

我通过修改您的代码片段实现了您的用例。请检查以下代码段。CCD_ 2用于将焦点移动到下一个。如果您想将焦点移动到特定的小部件。你就把它叫做focusNode.requestFocus()


class FocusDemo extends StatefulWidget {
@override
_FocusDemoState createState() => _FocusDemoState();
}
class _FocusDemoState extends State<FocusDemo> {
late FocusNode _txtNode;
@override
void initState() {
super.initState();
_txtNode = FocusNode();
}
@override
void dispose() {
_txtNode.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Focus(
focusNode: _txtNode,
onKey: (focusNode, event) {
if (event.runtimeType == RawKeyUpEvent &&
event.logicalKey == LogicalKeyboardKey.enter) {
focusNode.nextFocus();
return KeyEventResult.handled;
}
return KeyEventResult.ignored;
},
child: Container(
height: 400,
width: 500,
color: Colors.grey[350],
child: Column(
children: [
TextField(),
TextField(),
TextField(),
],
),
),
),
),
);
}
}