Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Flutter 在颤振模式下按/左键时,TextField将重新加载FutureBuilder_Flutter_Dart_Google Cloud Firestore - Fatal编程技术网

Flutter 在颤振模式下按/左键时,TextField将重新加载FutureBuilder

Flutter 在颤振模式下按/左键时,TextField将重新加载FutureBuilder,flutter,dart,google-cloud-firestore,Flutter,Dart,Google Cloud Firestore,用户可以使用InputChips输入答案,也可以在文本字段中手动键入答案。当我尝试输入芯片时,没有检测到正确的答案。当我尝试手动键入时,当我输入和离开文本字段时,FutureBuilder会重新加载。原因是什么? Future函数应该只调用一次,因为它从Firestore获取一个随机文档,拆分字符串并对不同部分进行置乱。这是一种测验形式 类(buildstate){ 文本编辑控制器; 字符串_text=首字母; @凌驾 无效初始状态{ _c=新文本编辑控制器; super.initState;

用户可以使用InputChips输入答案,也可以在文本字段中手动键入答案。当我尝试输入芯片时,没有检测到正确的答案。当我尝试手动键入时,当我输入和离开文本字段时,FutureBuilder会重新加载。原因是什么? Future函数应该只调用一次,因为它从Firestore获取一个随机文档,拆分字符串并对不同部分进行置乱。这是一种测验形式

类(buildstate){ 文本编辑控制器; 字符串_text=首字母; @凌驾 无效初始状态{ _c=新文本编辑控制器; super.initState; } @凌驾 无效处置{ _c.处置; 超级处理; } @凌驾 小部件构建上下文上下文{ 最终参数args=ModalRoute.ofcontext.settings.Arguments; var height=MediaQuery.ofcontext.size.height; var width=MediaQuery.ofcontext.size.width; //TODO:实现构建 返回脚手架 正文:专栏 儿童:[ Flexibleflex:2,子:_buildRestcontext,, Flexibleflex:5, 孩子:未来建设者 future:getEverythingargs.colName, 生成器:上下文、快照{ 如果!snapshot.hasData{ 返回中心子对象:循环前进指示器,; }否则{ 返回列 儿童:[ Flexibleflex:1,子项:Textsnapshot.data[1],, 分隔器, Flexibleflex:2,子:容器 孩子:TextField 一旦更改:t{ _text+=$t; if_c.text==snapshot.data[0]{ 返回正确答案; } }, 控制员:, textAlign:textAlign.center, 启用:对, , ,, Flexibleflex:3, 子项:ListView.builder 滚动方向:轴水平, itemCount:snapshot.data.length-2, itemBuilder:上下文、索引{ iIndex>snapshot.data.length-2{ 返回null; }否则{ 返回填充 填充:const EdgeInsets.all4.0, 孩子:输入芯片 标签:Textsnapshot.data[索引+2], 按下按钮:{ _c、 text+=${snapshot.data[index+2]}; }, , ; } }, ], ; } }, , ], ; } }
让我们分部分来解决这个问题

当我尝试手动输入时,FutureBuilder会在我输入和离开文本字段时重新加载。原因是什么

这是因为当键盘显示或隐藏时,颤振框架调用小部件的构建方法,而这种默认行为正是FutureBuilder重新加载的原因。您应该避免在build方法中调用网络方法,我建议您使用BLoC模式来处理小部件的状态

不过,我的未来需要从另一条路径传递的字符串。请参阅参数args=。。。。你知道我是怎么得到它的吗

如果您需要上下文实例来获取这个字符串,您就不能在initState方法中访问当前上下文,因为您的小部件还没有完全初始化。在您的情况下,解决此问题的一个简单方法是验证数据是否已从网络中获取,这不是最好的方法

Future _myNetworkFuture; // declare this as member of your stateWidgetClass

Widget build(BuildContext context){
   final Arguments args = ModalRoute.of(context).settings.arguments;
   var height = MediaQuery.of(context).size.height;
   var width = MediaQuery.of(context).size.width;

   // this line says if(_myNetworkFuture == null) do the thing.
   _myNetworkFuture ??= getEverything(args.colName);

   return ...
   Flexible(flex: 5,
        child: FutureBuilder(
          future: _myNetworkFuture,
          builder: (context, snapshot){ 
           // ...
          }
}

当颤振框架调用build方法时,如果您已经获取了数据,则使用这种方法,您不会再次下载数据。但我真的建议你在这种情况下使用集团模式。

你必须在初始状态下初始化你的未来。请注意:@RubensMelo我的未来需要从另一条路径传递的字符串。请参阅参数args=。。。。知道我是如何在initState中获得它的吗?你可以使用widget.args访问它。colName@RubensMelo我不知道如何确定我的未来。在您发送的示例中,它是future=future.value42;。在我的情况下,我必须将我的未来移动到类中并初始化如下:getEverythingwidget.args.colName=Future.value???正确的方法是什么?谢谢在应用程序的某个部分使用bloc模式可以吗?还是我必须在每个地方都实现它?哇,谢谢你的回答!帮助我,我找到了 它很快就消失了。