Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart 在Flatter中导航后,无法将焦点放在新页面中的文本字段上_Dart_Flutter_Dart 2 - Fatal编程技术网

Dart 在Flatter中导航后,无法将焦点放在新页面中的文本字段上

Dart 在Flatter中导航后,无法将焦点放在新页面中的文本字段上,dart,flutter,dart-2,Dart,Flutter,Dart 2,由于某些原因,在导航后的下一页上,我无法将注意力集中在文本字段上。选择文本字段时,键盘将自动关闭。如果我在文本字段上设置了autofocus:true,那么键盘将无限弹出,并立即一次又一次地关闭 当我的应用程序大小合理时,我遇到了这种情况,但我能够在一个简单的示例应用程序中重新创建这种情况 我将Dart 2.0.0-dev.55.0与颤振测试版v0.3.2一起使用 主页的代码: import 'package:flutter/material.dart'; import 'settings.da

由于某些原因,在导航后的下一页上,我无法将注意力集中在文本字段上。选择文本字段时,键盘将自动关闭。如果我在文本字段上设置了
autofocus:true
,那么键盘将无限弹出,并立即一次又一次地关闭

当我的应用程序大小合理时,我遇到了这种情况,但我能够在一个简单的示例应用程序中重新创建这种情况

我将Dart 2.0.0-dev.55.0与颤振测试版v0.3.2一起使用

主页的代码:

import 'package:flutter/material.dart';
import 'settings.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Helpful text.',),
            // ===== Where navigation happens =====
            RaisedButton(
              onPressed: () {
                Navigator.push(context, PageRouteBuilder(
                  pageBuilder: (_, __, ___) => SettingsPage()));
              },
              child: Text('Go to input page'),
            ),
          ],
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
导入“settings.dart”;
void main()=>runApp(新的MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回新材料PP(
标题:“颤振演示”,
主题:新主题数据(
主样本:颜色。蓝色,
),
主页:新MyHomePage(标题:“颤振演示主页”),
);
}
}
类MyHomePage扩展StatefulWidget{
MyHomePage({Key,this.title}):超级(Key:Key);
最后的字符串标题;
@凌驾
_MyHomePageState createState()=>new_MyHomePageState();
}
类_MyHomePageState扩展状态{
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(widget.title),
),
正文:中(
子:列(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
文本(“帮助文本”。,),
//====导航发生的位置=====
升起的按钮(
已按下:(){
Navigator.push(上下文,PageRouteBuilder(
页面生成器:(u,u,u,u,u)=>SettingsPage());
},
子项:文本(“转到输入页”),
),
],
),
),
);
}
}
下面是带有文本字段的页面的代码

import 'package:flutter/material.dart';

class SettingsPage extends StatefulWidget {
  SettingsPage({Key key}) :
   super(key: key);

  @override
  _SettingsPage createState() => new _SettingsPage();
}


class _SettingsPage extends State<SettingsPage> {

  @override
  Widget build(BuildContext context) {
    final key = GlobalKey<ScaffoldState>();
    return Scaffold(
      key: key,
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("Settings"),
      ),
      body: ListView(
        children: <Widget>[
          Text("Enter something"),
          // Can't focus on this widget
          TextField(),
        ],
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
类设置SPAGE扩展StatefulWidget{
设置页面({Key}):
超级(键:键);
@凌驾
_SettingsPage createState()=>new_SettingsPage();
}
类_setingspage扩展状态{
@凌驾
小部件构建(构建上下文){
final key=GlobalKey();
返回脚手架(
钥匙:钥匙,
背景颜色:Colors.white,
appBar:appBar(
标题:文本(“设置”),
),
正文:ListView(
儿童:[
文本(“输入某物”),
//无法关注此小部件
TextField(),
],
),
);
}
}

如果我把一个放在主页上,我可以很好地聚焦在文本字段上,但不能聚焦在设置页面的文本字段上。我想这与键盘没有优先于弹出的页面有关吧?或者发生了什么?如何让应用程序只关注导航页面上的输入字段?

因此问题来自于我向Scaffold提供GlobalKey的事实。移除密钥可以解决此问题。不太清楚原因,但这篇文章主要解释了这个问题


在验证输入时,当显示错误消息时,我使用该键使snackbar弹出,但现在我选择只在文本小部件中显示错误消息。

在全局键方面也有类似问题。正在查看颤振的架构redux示例中的类似示例

像这样用钥匙给我修好了

static final GlobalKey<FormFieldState<String>> _orderFormKey = GlobalKey<FormFieldState<String>>();
static final GlobalKey\u orderFormKey=GlobalKey();

我也遇到了这个问题,在文本字段中添加了一个焦点节点。删除焦点节点解决了我的问题。

若要解决此问题,请使用以下代码。

// Class private property
static final GlobalKey<FormFieldState<String>> _searchFormKey = GlobalKey<FormFieldState<String>>()

// Inside widget
TextFormField(
  key: _searchFormKey, // Use searchFormKey here like this
  decoration: InputDecoration(
    border: OutlineInputBorder(),
    labelText: 'Type here...',
  )
)
//类私有属性
静态最终GlobalKey _searchFormKey=GlobalKey()
//内部小部件
TextFormField(
key:\u searchFormKey,//在这里像这样使用searchFormKey
装饰:输入装饰(
边框:OutlineInputBorder(),
labelText:“在此处键入…”,
)
)

不确定您的问题是什么,因为我无法再复制它了。我刚刚在颤振通道测试版1.18.0-11.1.pre中试用了你的代码,一切正常,没有修改你的原始代码


它看起来更像是颤振的bug。

只需将
自动对焦添加为
true
,这将在导航到新屏幕时打开键盘

 TextField(
            autofocus: true,
          ),

在我的例子中,autofocus:true不仅在iOS模拟器上有效,而且在Android和iOS的真实设备上都有效。我想问题在于它在
列表视图中。你能把它搬出去吗。我最近也遇到过这种情况。我认为这是一个bug,但我可能也缺少知识@GünterZöchbauer我将设置页面中的body改为
body:TextField(),
,但我仍然无法专注于它。如果我将
列表视图
更改为
,也会发生同样的情况。我将进一步研究您链接的问题,但到目前为止,该漏洞似乎仍然存在。如果不是这样,我不知道。请删除“如果有人理解…”。如果你对某一行为的原因感兴趣,不要在回答中发布,因为这不是一个论坛。相反,要提出一个新问题。为什么要否决投票?使用此解决方案,您的键盘将保持稳定。对焦时,它不会弹出或弹出。它可以很好地处理有状态Widget问题是您在构建方法中创建了全局键。尝试将全局键初始化移到构建方法之外,一切正常:)