如何获取存储在Map中的多个TextEditingController的文本值
问题根源
你遇到的报错本质是Dart的强类型特性和JS动态类型的差异导致的,核心有两个问题:
- Dart的嵌套Map如果没有显式指定类型,会被自动推断为
Map<String, Object>,你从内层Map取出的controller变量类型被推断为Object,自然无法直接访问TextEditingController专属的text属性。 - 你写的
controller!['text']是JS中对象属性访问的写法,Dart中只有Map类型支持[]操作符,普通类的属性必须用.访问,你这里报错是因为当前controller被推断为Object,不存在[]操作符,即便你后续转对类型,也不能用[]访问text属性。
解决方案
临时解决:手动强转类型
你只需要在取出controller的时候手动指定类型即可,修改后的_submitData代码如下:
_submitData() { for (var k in _ingredientsDataMap.keys) { var currentValue = _ingredientsDataMap[k] as Map<String, dynamic>; var controller = currentValue['controller'] as TextEditingController; // 直接访问text属性即可 print(controller.text); } }
规范方案:定义数据类替代嵌套Map
Dart不推荐像JS那样用嵌套Map存储结构化数据,更合适的方式是提前定义对应的数据类,后续不会有任何类型问题,代码可维护性也更高:
- 先定义数据类
class IngredientField { final String label; final TextEditingController controller; IngredientField({ required this.label, required this.controller, }); }
- 改写你的Map定义
final Map<String, IngredientField> _ingredientsDataMap = { 'IngredientName': IngredientField( label: 'Ingredient Name', controller: TextEditingController(), ), 'Amount': IngredientField( label: 'Amount', controller: TextEditingController(), ), 'Unit': IngredientField( label: 'Unit', controller: TextEditingController(), ), };
- 提交数据的代码可以简化为:
_submitData() { for (var field in _ingredientsDataMap.values) { print(field.controller.text); } }
内容的提问来源于stack exchange,提问作者ShowstopperCode1
相关产品推荐
相关产品推荐

