我有一个带有 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(() {});
}
}
当状态更改时,尝试使用所需值或输入本身更新 TextFormField。 另外,如果您可以将此 TextFormField 的状态与触发状态分开,维护起来会更容易。