问题描述
我正在 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,),],]
),);
}
}
解决方法
我只是通过修改您的代码片段来实现您的用例。请检查以下代码片段。 FocusScope.of(context).nextFocus()
用于将焦点移到下一个。如果要将焦点移动到特定小部件。您只需将其称为 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(),],),);
}
}