繁体   English   中英

如何防止futureBuilder不断调用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM