You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取存储在Map中的多个TextEditingController的文本值

问题根源

你遇到的报错本质是Dart的强类型特性和JS动态类型的差异导致的,核心有两个问题:

  1. Dart的嵌套Map如果没有显式指定类型,会被自动推断为Map<String, Object>,你从内层Map取出的controller变量类型被推断为Object,自然无法直接访问TextEditingController专属的text属性。
  2. 你写的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存储结构化数据,更合适的方式是提前定义对应的数据类,后续不会有任何类型问题,代码可维护性也更高:

  1. 先定义数据类
class IngredientField {
  final String label;
  final TextEditingController controller;

  IngredientField({
    required this.label,
    required this.controller,
  });
}
  1. 改写你的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(),
  ),
};
  1. 提交数据的代码可以简化为:
_submitData() {
  for (var field in _ingredientsDataMap.values) {
    print(field.controller.text);
  }
}

内容的提问来源于stack exchange,提问作者ShowstopperCode1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:39:02