列表视图中的TextFormField无法在颤动中单击按钮时保留列表刷新时的值

问题描述 投票:0回答:1

我有一个带有 TextFormField 的列表视图。我可以通过单击按钮添加/删除这些值。列表中的某些数据在创建时就已存在。它是从数组更新的。但是,当我在新的 TextFormField 中输入任何新数据并按任何按钮时,数据将从 TextFormField 中丢失。尽管我在数组源和更新状态下分配它。名单如下:

    Widget taxInfoListView() {
    return ListView.builder(
      itemCount: taxResidencyList.length,
      scrollDirection: Axis.vertical,
      shrinkWrap: true,
      physics: const NeverScrollableScrollPhysics(),
      itemBuilder: (context, index) => TaxDetailItem(
        taxResidence: taxResidencyList[index],
        textEditingController: controllers[index],
        countrySelectionChanged: getUpdatedCountryCode,
        index: index,
        taxCountryRemove: removeTaxCountry,
        isError: (errorIndex == index) ? true : false,
      ),
    );
  }

列表项代码:

    Widget build(BuildContext context) {
    textEditingController.value = TextEditingValue(text: taxResidence.id);
    return Padding(
      padding: const EdgeInsets.only(bottom: 15),
      child: Column(
        mainAxisAlignment: MainAxisAlignment.start,
        children: [
          Text(
            'WHICH COUNTRY SERVES AS YOUR PRIMARY TAX RESIDENCE?*',
            textAlign: TextAlign.left,
            style: Theme.of(context).textTheme.bodyMedium,
          ),
          const SizedBox(height: 10),
          ModalDropDownButton(
            selectedItem: searchByCountryCode(),
            items: getCountryListItems(),
            searchItemHint: 'Search for Country',
            itemSelectionChanged: countrySelectionChanged,
            listitemIndex: index,
          ),
          const SizedBox(height: 10),
          Text('TAX IDENTIFICATION NUMBER*',
              textAlign: TextAlign.left,
              style: Theme.of(context).textTheme.bodyMedium),
          const SizedBox(height: 10),
          SizedBox(
            height: 40.0,
            child: TextFormField(
              decoration: const InputDecoration(
                  contentPadding:
                      EdgeInsets.symmetric(vertical: 0, horizontal: 5),
                  hintText: 'Tax ID or N/A'),
              controller: textEditingController,
            ),
          ),
          Visibility(visible: isError, child: Text('Please enter Tax id and select country', style: TextStyle(color: Colors.red) )),
          index > 0 ? Row(
            children: [
              Spacer(),
              ElevatedButton(style: ElevatedButton.styleFrom(
                elevation: 0,
                side: BorderSide(width: 0, color: Colors.white),
              ), onPressed: () => {
                taxCountryRemove(index)
              },
                  child: Text('-REMOVE', style: TextStyle(color: Colors.red),))
            ],
          ) : Container()
        ],
      ),
    );
  }

以下是我管理状态的方式:

    Widget addMoreTaxCountry() {
    return Row(
      children: [
        ElevatedButton(
            style: ElevatedButton.styleFrom(
              elevation: 0,
              side: const BorderSide(width: 0, color: Colors.white),
            ),
            onPressed: () {
              myBloc.add(OnAddTaxCountryEvent());
            },
            child: Text(
              '+ ADD ANOTHER',
              style: TextStyle(color: Theme.of(context).primaryColor),
            )),
        const Spacer()
      ],
    );
  }
BlocListener<TaxDetailBloc, TaxDetailState>(
          listener: (context, state) {
if (state is AddNewTaxCountryState) {
              taxResidencyList.add(state.taxResidence);
              TextEditingController controller = TextEditingController();
              controllers.add(controller);
              setState(() {});
            }
}
flutter dart listview
1个回答
0
投票

当状态更改时,尝试使用所需值或输入本身更新 TextFormField。 另外,如果您可以将此 TextFormField 的状态与触发状态分开,维护起来会更容易。

© www.soinside.com 2019 - 2024. All rights reserved.