[英]How to prevent futureBuilder keep calling
当我从TextformField
选择一个值时,由于fututeBuilder
不断调用,该值不会改变。 它保持旧值。 解决办法是什么?
Widget _showBody(BuildContext context) {
return SingleChildScrollView(
child: Container(
child:
Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: controller.checkListSessions.length,
itemBuilder: (context, index) {
ChecklistSession checklistSession =
controller.checkListSessions[index];
return Padding(
padding: EdgeInsets.all(10),
child: Container(
color: Colors.white,
child: FutureBuilder<List<ChecklistSessionsItemData>>(
future: controller.fetchChecklistSessionItem(
id),
builder: (context, itemSnapshot) {
if (itemSnapshot.hasData) {
return ListView.builder(
physics: NeverScrollableScrollPhysics(),
itemCount: itemSnapshot.data?.length,
shrinkWrap: true,
itemBuilder: (context, itemIndex) {
ChecklistSessionsItemData _data =
itemSnapshot.data![itemIndex];
final dropText = <TextEditingController>[];
if (_data.inputType == "Drop Down Box") {
dropText.add(TextEditingController());
}
return _showDropBox(dropText, _data);
});
} else {
return Text("No Item");
}
})));
})
])));
}
Widget _showDropBox(
List<TextEditingController> list, ChecklistSessionsItemData data) {
var dropDownDatas = <String>[];
if (data.inputType == "Drop Down Box") {
dropDownDatas = data.inputValue.toString().split(",");
}
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Text(data.item ?? ""),
SizedBox(height: 10),
ListView.builder(
itemCount: list.length,
shrinkWrap: true,
itemBuilder: (context, index) {
return FutureBuilder<ChecklistAnswerItem>(
future: controller.selectChecklistItemAnswer(data.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
list[index].text = snapshot.data!.inputAnswer!;
return TextFormField(
onTap: () {
Global().hideKeyboard(context);
goToPickDropDown(
dropDownDatas, list[index], data.id!);
},
controller: list[index]);
} else {
return Text("No item");
}
});
})
]);
}
Future<void> goToPickDropDown(List<String> dropDownDatas,
TextEditingController list, String? map) async {
var a = await Get.to(() => PickItemPage(), arguments: [dropDownDatas]);
list.text = a;
}
这里是输出。 如您所见,先前的值为“5”。 当我选择“3”时,值仍然是“5”,因为futureBuilder
一直在调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.