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