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 flatter:TextFormField:调用setState()后光标重置为开始_Flutter_Dart_Texteditingcontroller - Fatal编程技术网

Flutter flatter: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

我正在做一个问答申请来打发时间

问题列表中有问题。下面的代码为每个问题显示。一个问题可以有多种选择,但只有一个答案

每次我在TextFormField中键入时,光标都会重置到开头,这是我遇到的问题。我怎样才能避免呢?我需要使用setState,以便文本小部件实时更新

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列表。嗯,我希望您不介意我用帖子中的代码替换我的代码?另外,我还有一个按钮,可以从数组中删除项目…好的,编辑你的问题,我会看到情况。