在我的应用程序中,我有一个个人可以选择的卧室列表,如果用户选择1间和2间卧室,则会从这些选择中生成两个文本字段
_apartmentBedrooms.length > 0
? Container(
child: ListView.builder(
physics: NeverScrollableScrollPhysics(),
shrinkWrap: true,
itemCount: _apartmentBedrooms.length,
itemBuilder: (context, index) {
_controllers.add(new TextEditingController());
print(_controllers[index]);
return BlocBuilder<AddPropertyBloc, AddPropertyState>(
builder: (context, state) {
return Padding(
padding: const EdgeInsets.only(left: 15, right: 15, top: 10),
child: Container(
padding: EdgeInsets.only(right: 15, left: 10),
height: 40,
decoration: BoxDecoration(
color: ColorConfig.smokeLight,
borderRadius: BorderRadius.circular(5),
),
child: Padding(
padding: const EdgeInsets.only(bottom: 5.0),
child: TextFormField(
controller: _controllers[index],
onFieldSubmitted: (value) {
// BlocProvider.of<AddPropertyBloc>(context).add(EnteredPriceEvent(price: value));
print(_controllers[index].text);
prices.add(_controllers[index].text);
print(prices);
},
keyboardType: TextInputType.number,
style: TextStyle(
fontFamily: FontConfig.regular,
fontSize: Sizeconfig.small,
color: ColorConfig.dark,
),
decoration: InputDecoration(
hintText: _apartmentBedrooms[index].toString() + " bedroom Price*",
hintStyle: TextStyle(
fontFamily: FontConfig.regular,
fontSize: Sizeconfig.small,
color: ColorConfig.dark,
),
border: InputBorder.none,
),
),
),
),
);
},
);
},
),
)
: Text("choose bedrooms first"),
我有一个为每个选定卧室生成的文本编辑控制器列表。问题是,如果我使用onChanged,它最终会从任何更改的项目中添加到列表中的无限项目,当我使用onfieldsubitted并更改任何值时,它们会被添加为列表中我不想要的新项目。我想把每间卧室的价格省下来,不管是改的还是刚加的。我怎样才能做到这一点。
当索引没有控制器时,只需使用Map即可生成控制器。类似这样的东西:
Map<int, TextEditingController> _mapControllers = Map();
TextEditingController _controllerOf(int index) {
var item = _mapControllers[index];
if(item == null) {
item = TextEditingController();
_mapControllers[index] = item;
}
return item;
}
你可以这样使用它:
TextFormField(
controller: _controllerOf(index),
...
)
然后,您可以通过以下方式从控制器获取文本:
List<String> _textsOf(Map<int, TextEditingController> mapControllers) {
// Sort map by index of the builder.
var sortedKeys = mapControllers.keys.toList()..sort();
List<String> texts = [];
for(var key in sortedKeys) {
texts.add(mapControllers[key].text);
}
return texts;
}
请注意,我还没有测试代码。