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

Flutter TextField在导航到另一个屏幕后获得焦点,flutter,dart,keyboard,Flutter,Dart,Keyboard,在我的项目中,我将整个MaterialApp包装在一个gesturedector中,当用户使用这段代码点击屏幕时,它应该会关闭键盘 FocusScope.of(context).unfocus() 在测试了多个场景后,它不起作用,所以我决定用错误的方法来做 FocusScope.of(context).requestFocus(FocusNode()) 但现在我遇到了另一个问题。下面是我的代码,它是由MaterialApp的routesbuilder实例化的一个简单屏幕 import 'pa

在我的项目中,我将整个
MaterialApp
包装在一个
gesturedector
中,当用户使用这段代码点击屏幕时,它应该会关闭键盘

FocusScope.of(context).unfocus()
在测试了多个场景后,它不起作用,所以我决定用错误的方法来做

FocusScope.of(context).requestFocus(FocusNode())
但现在我遇到了另一个问题。下面是我的代码,它是由
MaterialApp
routes
builder实例化的一个简单屏幕

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'))
        ],
      ),
    );
  }
}

在搜索了大量与焦点管理相关的GitHub问题之后,似乎没有人知道什么是正确的方法。最后,这行代码解决了我的问题:

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

我不知道它的副作用,但它目前正在发挥作用。

在搜索了大量与焦点管理相关的GitHub问题后,似乎没有人知道什么是正确的方法。最后,这行代码解决了我的问题:

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

我不知道它的副作用,但它目前正在发挥作用。

您在这里面临两个问题:

  • 颤振中的预期行为是当推到新路线时,上一条路线的焦点持续存在,这意味着当您弹回
    TextField
    时,该焦点仍处于焦点上。请参阅此主题的讨论

  • 您有两个
    手势检测器
    ,它们由onTap指针手势触发。您用来解除焦点的包装器,以及用来导航到另一条路线的
    FlatButton
    。点击按钮时,底层的
    gestureRecognitor
    将此事件的hanlding控制权交给按钮,并且不会调用包装器
    GestureDetector
    opTap()(这意味着不会调用unfocus)


  • 您在这里面临两个问题:

  • 颤振中的预期行为是当推到新路线时,上一条路线的焦点持续存在,这意味着当您弹回
    TextField
    时,该焦点仍处于焦点上。请参阅此主题的讨论

  • 您有两个
    手势检测器
    ,它们由onTap指针手势触发。您用来解除焦点的包装器,以及用来导航到另一条路线的
    FlatButton
    。点击按钮时,底层的
    gestureRecognitor
    将此事件的hanlding控制权交给按钮,并且不会调用包装器
    GestureDetector
    opTap()(这意味着不会调用unfocus)


  • 兄弟,试试看,我想你没有回答这个问题。此库正在更改滚动行为@parthpitroda为什么不在按下时执行FocusScope.of(context).unfocus()?它不工作且
    TextField
    仍处于焦点@jitsm555是否先关闭键盘,然后导航?你的问题不清楚,兄弟,试试看,我想你没有回答这个问题。此库正在更改滚动行为@parthpitroda为什么不在按下时执行FocusScope.of(context).unfocus()?它不工作且
    TextField
    仍处于焦点@jitsm555是否先关闭键盘,然后导航?你的问题不清楚谢谢你的回答,但我认为你误解了这个问题。问题是,在取消“文本字段”的焦点后,当我按另一条路线时,键盘会弹出,询问您的答案,但我认为您误解了问题。问题是,在取消“文本字段”的焦点后,当我按下另一个路径时,键盘会弹出