微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flutter:如何在物理键盘上按下某个键时将焦点更改为另一个小部件

如何解决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,),],]
          ),);
  }
}

解决方法

我只是通过修改您的代码片段来实现您的用例。请检查以下代码片段。 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(),],),);
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。