导航到另一个屏幕后,TextField 获得焦点

问题描述 投票:0回答:3

在我的项目中,我将整个

MaterialApp
包装在
GestureDetector
中,当用户点击屏幕时,应该使用这段代码来关闭键盘

FocusScope.of(context).unfocus()

在测试了多个场景后,它不起作用,所以我决定以错误的方式进行

FocusScope.of(context).requestFocus(FocusNode())

但现在我遇到了另一个问题。这是我的简单屏幕代码,由

MaterialApp
routes
构建器实例化。

import 'package:flutter/material.dart';

class TestScreen extends StatefulWidget {
  @override
  _TestScreenState createState() => _TestScreenState();
}

class _TestScreenState extends State<TestScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Column(
        children: <Widget>[
          TextFormField(),
          FlatButton(
              onPressed: () => Navigator.push(context,
                  MaterialPageRoute(builder: (context) => TestScreen())),
              child: Text('Test'))
        ],
      ),
    );
  }
}

重现错误的步骤是:1-开始编辑

TextField
。 2-通过点击屏幕上的某处来取消对焦
TextField
。 3-点击按钮导航到另一个屏幕。这是结果:

enter image description here

当我尝试通过按键盘的完成按钮来取消焦点

TextField
时,不会发生此行为。根据源代码,当按下完成按钮时,
TextField
正在调用
clearComposing
上的
TextEditingController
。我什至尝试过,但没有运气。我该如何修复它?还有其他人有更好的解决方案来处理 Flutter 中关闭键盘的问题吗?

这也是我的

flutter doctor
结果:

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.17.5, on Mac OS X 10.15.5 19F101, locale en-US)
 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
[✓] Xcode - develop for iOS and macOS (Xcode 11.6)
[✓] Android Studio (version 4.0)
[✓] VS Code (version 1.47.3)
[✓] Connected device (2 available)

• No issues found!
flutter dart keyboard
3个回答
5
投票

最后这行代码解决了我的问题:

WidgetsBinding.instance.focusManager.primaryFocus?.unfocus();

我不知道它的副作用,但它现在有效。


0
投票

为文本字段设置一个焦点节点,推送新路由后,聚焦下一个节点并取消当前节点的焦点,如:

// push your new route here

myNode.nextFocus();
myNode.unfocus();
// myNode needs to be the last text field

当您按返回时,从新路线开始,焦点将不再自动重新出现。

为我工作。


0
投票

这对我有用

FocusManager.instance.primaryFocus?.unfocus();
© www.soinside.com 2019 - 2024. All rights reserved.