问题描述
我不能使用 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(...);
}
...