Flutter flatter:TextFormField:调用setState()后光标重置为开始
我正在做一个问答申请来打发时间 问题列表中有问题。下面的代码为每个问题显示。一个问题可以有多种选择,但只有一个答案 每次我在TextFormField中键入时,光标都会重置到开头,这是我遇到的问题。我怎样才能避免呢?我需要使用setState,以便文本小部件实时更新Flutter flatter:TextFormField:调用setState()后光标重置为开始,flutter,dart,texteditingcontroller,Flutter,Dart,Texteditingcontroller,我正在做一个问答申请来打发时间 问题列表中有问题。下面的代码为每个问题显示。一个问题可以有多种选择,但只有一个答案 每次我在TextFormField中键入时,光标都会重置到开头,这是我遇到的问题。我怎样才能避免呢?我需要使用setState,以便文本小部件实时更新 class Question{ int answer; List<Answer> answers; } class Answer{ int index; String answer; } class
class Question{
int answer;
List<Answer> answers;
}
class Answer{
int index;
String answer;
}
class EditQuestionWidget extends StatefulWidget {
final List<Question> questions;
final int index;
EditQuestionWidget(this.questions, this.index);
@override
_EditQuestionWidgetState createState() => _EditQuestionWidgetState();
}
class _EditQuestionWidgetState extends State<EditQuestionWidget> {
@override
Widget build(BuildContext context) {
return Card( //For Each Question
child: ExpansionTile(
title: Text(widget.questions[widget.index].answer != null ? widget.questions[widget.index].answers[widget.questions[widget.index].answer].answer ?? 'Untitled Answer' : 'Untitled Answer'),
children: <Widget>[
ListView.builder( //For Each answer choice
itemCount: widget.questions[widget.index].answers.length,
itemBuilder: (context, i) {
TextEditingController answerController = TextEditingController(text: widget.questions[widget.index].answers[i].answer);
return Row(
children: <Widget>[
Expanded(
child: RadioListTile( //Select Answer
value: widget.questions[widget.index].answers[i].index,
groupValue: widget.questions[widget.index].answer,
onChanged: (int value) => setState(() => widget.questions[widget.index].answer = value),
title: TextFormField( //change answer choice text
controller: answerController,
onChanged: (text) {
setState(() {widget.questions[widget.index].answers[i].answer = text;}); // The cursor returns to beginning after executing this.
},
),
),
),
IconButton( //Remove Answer Function
onPressed: () {
//This method Works as intended.
if (widget.questions[widget.index].answers[i].index == widget.questions[widget.index].answer) widget.questions[widget.index].answer = null;
String answer = widget.questions[widget.index].answer != null ? widget.questions[widget.index].answers[widget.questions[widget.index].answer].answer : '';
widget.questions[widget.index].answers.remove(widget.questions[widget.index].answers[i]);
if (widget.questions[widget.index].answers.isEmpty) {
widget.questions[widget.index].answer = widget.questions[widget.index].answers.length;
widget.questions[widget.index].answers.add(new Answer(index: widget.questions[widget.index].answers.length));
}
for (int ii = 0; ii < widget.questions[widget.index].answers.length; ii++) {
widget.questions[widget.index].answers[ii].index = ii;
if (widget.questions[widget.index].answer != null && answer == widget.questions[widget.index].answers[ii].answer) widget.questions[widget.index].answer = ii;
}
setState(() {});
},
),
],
);
},
),
],
),
);
}
}
课堂提问{
int答案;
列出答案;
}
课堂答案{
整数指数;
字符串回答;
}
类EditQuestionWidget扩展了StatefulWidget{
最后问题清单;
最终整数指数;
EditQuestionWidget(this.questions,this.index);
@凌驾
_EditQuestionWidgetState createState()=>\u EditQuestionWidgetState();
}
类_EditQuestionWidgetState扩展状态{
@凌驾
小部件构建(构建上下文){
每个问题的返回卡(//)
子文件:扩展文件(
标题:文本(widget.questions[widget.index]。答案!=null?widget.questions[widget.index]。答案[widget.questions[widget.index]。答案]。答案??“无标题答案”:“无标题答案”),
儿童:[
ListView.builder(//对于每个答案选项
itemCount:widget.questions[widget.index].answers.length,
itemBuilder:(上下文,i){
text编辑控制器answerController=text编辑控制器(文本:widget.questions[widget.index].answers[i].answer);
返回行(
儿童:[
扩大(
子项:RadioListile(//选择答案
值:widget.questions[widget.index]。answers[i]。index,
组值:widget.questions[widget.index]。回答,
一旦更改:(int值)=>setState(()=>widget.questions[widget.index].answer=value),
标题:TextFormField(//更改答案选择文本
控制员:应答控制员,
一旦更改:(文本){
setState((){widget.questions[widget.index].answers[i].answer=text;});//执行此操作后,光标返回到开头。
},
),
),
),
IconButton(//删除应答函数
已按下:(){
//此方法按预期工作。
如果(widget.questions[widget.index].answers[i].index==widget.questions[widget.index].answer)widget.questions[widget.index].answer=null;
字符串answer=widget.questions[widget.index]。answer!=null?widget.questions[widget.index]。answers[widget.questions[widget.index]。answer]。答案:“”;
widget.questions[widget.index].answers.remove(widget.questions[widget.index].answers[i]);
if(widget.questions[widget.index].answers.isEmpty){
widget.questions[widget.index].answer=widget.questions[widget.index].answers.length;
widget.questions[widget.index].answers.add(新答案(索引:widget.questions[widget.index].answers.length));
}
对于(int ii=0;ii
每次文本更改时,您都在更新answerController的值,当更新发生时,光标会移到开头
要解决此问题,您可以在构建器外部创建文本编辑控制器的列表:
List<TextEditingController> controllers = [];
最后将控制器传递到文本字段:
controller: controllers[i],
每次文本更改时,您都会更新answerController的值,并且当此更新发生时,光标会移到开头 要解决此问题,您可以在构建器外部创建文本编辑控制器的列表:
List<TextEditingController> controllers = [];
最后将控制器传递到文本字段:
controller: controllers[i],
TextFormField需要在第一次构建时使用foo变量进行初始化。让我更新我的帖子。这不是我的全部代码。我的TextFormField位于ListView.builder小部件中。所以我不能把TextEditingController放在构建方法之外。目前,我的TextEditingController对象是在ListView.Builder小部件的itemBuilder属性中初始化的,因此每个TextFormField都有自己的TextEditingController。您可以在Builder之外创建TextEditingController列表。嗯,我希望您不介意我用帖子中的代码替换我的代码?另外,我还有一个按钮,可以从数组中删除项目…好的,编辑你的问题,我会看到情况。TextFormField需要在第一次构建时用foo变量初始化。让我更新我的帖子。这不是我的全部代码。我的TextFormField位于ListView.builder小部件中。所以我不能把TextEditingController放在构建方法之外。目前,我的TextEditingController对象是在ListView.Builder小部件的itemBuilder属性中初始化的,因此每个TextFormField都有自己的TextEditingController。您可以在Builder之外创建TextEditingController列表。嗯,我希望您不介意我用帖子中的代码替换我的代码?另外,我还有一个按钮,可以从数组中删除项目…好的,编辑你的问题,我会看到情况。