如果从列表中删除窗口小部件,它会重置其下面所有窗口小部件的状态吗?

问题描述

使用浮动操作按钮可以添加问题,但是当删除特定问题时,它将重置列表中其下所有小部件的状态,其上方的所有内容均保持其状态。尽管我正在使用TextField,但是TextFieldController并没有保留数据。我不知道为什么会这样。

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:kaloory/constants.dart';


class AddQuestionsForTest extends StatefulWidget {
  AddQuestionsForTest({Key key}): super(key: key);

  @override
  _AddQuestionsForTestState createState() => _AddQuestionsForTestState();
}

class _AddQuestionsForTestState extends State<AddQuestionsForTest> {
  int count = 1;
  List<InputWidget> children;

  void removeInputWidget(index){
    setState(() {
      children.remove(index);
    });
  }
  @override
  void initState(){
    super.initState();
    setState(() {
      children = List.generate(count,(int i) => new InputWidget(removeInputWidget,key: ValueKey(i),));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(

        appBar: titleAppbar(title: "Create Test"),body: Container(
          color: backgroundColor,height: MediaQuery.of(context).size.height,child: ListView.builder(
            itemCount: children.length,itemBuilder: (context,index) {
              final child = children[index];
              return child;
            },),floatingActionButton: new FloatingActionButton(
          backgroundColor: primaryColor,splashColor: primaryColor.withOpacity(0.5),child: new Icon(Icons.add),onPressed: () {
            setState(() {
              children.add(InputWidget(removeInputWidget,key: ValueKey(count),));
              count = count + 1;

            });
          },));
  }

}

class InputWidget extends StatefulWidget {
  final Function(InputWidget) removeInputWidget;

  InputWidget(this.removeInputWidget,{Key key}): super(key: key);

  @override
  _InputWidgetState createState() => _InputWidgetState();
}

class _InputWidgetState extends State<InputWidget> {
  @override
  Widget build(BuildContext context) {
    return Container(
        margin: EdgeInsets.symmetric(horizontal: 30,vertical: 5),padding: EdgeInsets.symmetric(horizontal: 20,vertical: 10),decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(10),color: Colors.white,child: Column(
          crossAxisAlignment: CrossAxisAlignment.end,children: <Widget>[
            BuildDropDown(),Divider(),IconButton(icon: Icon(Icons.delete_outline),onPressed: (){
                widget.removeInputWidget(this.widget);
            })
          ],));
  }
}
class BuildDropDown extends StatefulWidget {

  @override
  _BuildDropDownState createState() => _BuildDropDownState();
}

class _BuildDropDownState extends State<BuildDropDown> {
  TextEditingController ques = TextEditingController();
  String newValue;
  @override
  Widget build( BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,children: [
        new Padding(
          padding: const EdgeInsets.symmetric(vertical: 10),child: new Column(
            mainAxisAlignment: MainAxisAlignment.start,children: <Widget>[
              new ListTile(
                title: Container(
                  padding: EdgeInsets.all(8),height: 40,decoration: BoxDecoration(
                      borderRadius: BorderRadius.circular(10),border: Border.all()),child: DropdownButtonHideUnderline(
                    child: new DropdownButton<String>(
                        hint: Text('Choose'),onChanged: (String changedValue) {
                          newValue = changedValue;
                          setState(() {
                            print(newValue);
                          });
                        },value: newValue,items: <String>[
                          'Multiple Choice','Short Answer Type','Long Answer Type'
                        ].map((String value) {
                          return new DropdownMenuItem<String>(
                            value: value,child: new Text(value),);
                        }).toList()),],Container(
          height: 40,margin: EdgeInsets.only(top: 10),padding: EdgeInsets.symmetric(horizontal: 20),decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(10),border: Border.all(color: Colors.black.withOpacity(0.5)),child: TextField(
            controller: ques,decoration: InputDecoration(
              border: InputBorder.none,focusedBorder: InputBorder.none,enabledBorder: InputBorder.none,errorBorder: InputBorder.none,disabledBorder: InputBorder.none,hintText: "Untitled Question",);
  }
}

解决方法

这是因为TextField具有其自身的内部状态,即使您已将键分配给父级,也不会保存它。

我认为解决方案是将文本值保存在小部件状态中的某个位置,然后在build()中检查controller.text!= _currentText的内容,如果它们不匹配,则注入最后一个已知的_currentText

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...