Flutter 2 - 设置自动完成 TextFormField 的初始值

问题描述

我不能使用 TextEditingController,因为 TextFormField 使用了 Autocomplete fieldviewbuilder TextEditingController

Autocomplete(
                optionsBuilder: (TextEditingValue textEditingValue) {
                  if (textEditingValue.text == '') return [];

                  return this
                      .productNames
                      .where((Map<String,dynamic> option) {
                    return option['ar']
                        .toLowerCase()
                        .contains(textEditingValue.text.toLowerCase());
                  });
                },fieldviewbuilder: (context,textEditingController,focusNode,onFieldSubmitted) =>
                    TextFormField(                             
                  controller: textEditingController,//uses fieldviewbuilder TextEditingController
                   focusNode: focusNode,),

解决方法

编辑

我刚刚意识到您正在使用 TextFormField,它有一个名为 initialValue 的参数。如果您不需要文本编辑控制器,则此答案应该有效

fieldViewBuilder: (context,textEditingController,focusNode,onFieldSubmitted) =>
                    TextFormField(                             
             
                   focusNode: focusNode,initialValue:"Your initial Value",),

或者如果您正在使用控制器,请尝试

fieldViewBuilder: (context,onFieldSubmitted) =>
                    TextFormField(                             
                  controller: textEditingController..text="Initial Value",focusNode: focusNode,

原答案

你为什么不使用那个文本编辑控制器本身。代码将是这样的

Autocomplete(
                optionsBuilder: (TextEditingValue textEditingValue) {
                  if (textEditingValue.text == '') return [];

                  return this
                      .productNames
                      .where((Map<String,dynamic> option) {
                    return option['ar']
                        .toLowerCase()
                        .contains(textEditingValue.text.toLowerCase());
                  });
                },fieldViewBuilder: (context,onFieldSubmitted){
                    textEditingController.text  = "Your initial text";// You can use the next snip of code if you dont want the initial text to come when you use setState((){});  
                    return TextFormField(                             
                  controller: textEditingController,//uses fieldViewBuilder TextEditingController
                   focusNode: focusNode,}
              ),

如果您正在使用 setState 并且上面的代码段不断用初始文本替换文本,请执行类似的操作

Autocomplete(
                optionsBuilder: (TextEditingValue textEditingValue) {
                  if (textEditingValue.text == '') return [];

                  return this
                      .productNames
                      .where((Map<String,onFieldSubmitted){
                    textEditingController.text = textEditingController.text  == ""? "Inital Text":textEditingController.text;// You can use the next snip of code if you dont want the initial text to come when you use setState((){});  
                    return TextFormField(                             
                  controller: textEditingController,

最后一个解决方案不太优雅但有效。如果我找到更好的解决方案,我会告诉你。您甚至可以将此 textEditingController 分配给在顶部声明的全局变量,并从代码中的任何位置访问它。而不是检查文本是否为空,而是在每次 setState 时增加一个新变量的值,如果值为 == 0,则可以设置初始文本

,

我认为@Siddharth Agrawal 的回答可能会有所改进

再添加一个像:

bool init=false;

 fieldViewBuilder: (context,onFieldSubmitted){
      if(!init){
           String initValue="Inital Text";
           textEditingController.value= TextEditingValue( text: initValue,selection:TextSelection.collapsed(offset:initValue.length));  
           init=true;
      }
       return TextFormField(                             
              controller: textEditingController,);
  }
,

这是我为 TextFormField 找到的解决方案。确保控制器在帧结束时更新。

fieldViewBuilder: (BuildContext context,TextEditingController fieldTextEditingController,FocusNode fieldFocusNode,VoidCallback onFieldSubmitted) {

  SchedulerBinding.instance?.addPostFrameCallback((_) { // <--- this part
    var initialValue = someValueThatGotUpdatedDuringBuild;

    fieldTextEditingController.text = initialValue;
  });
  return TextFormField(...);
}
...