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

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

使用浮动操作按钮可以添加问题,但是当删除特定问题时,它将重置列表中其下所有小部件的状态,其上方的所有内容均保持其状态。尽管我正在使用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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?