Flutter如何在for循环中动态调用TextEditingController变量
问题核心原因
Dart属于静态类型语言,不支持运行时通过字符串拼接变量名的方式直接访问对应变量实例,你写的a$iInput.text只会被识别为字符串拼接操作,不会关联到你提前声明的控制器变量。
最优解决方案:改用列表存储控制器
不要单独声明20个分散的控制器变量,直接将同组控制器存入列表,不仅可以完美满足循环取值的需求,还能简化声明代码:
// 初始化A组10个控制器,索引0对应原a0Input,索引1对应原a1Input...索引9对应原a9Input final List<TextEditingController> aInputs = List.generate(10, (index) => TextEditingController()); // B组同理 final List<TextEditingController> bInputs = List.generate(10, (index) => TextEditingController());
你原来的循环逻辑直接改写成如下即可:
for (var i = 1; i <= 9; i++) { var jData = { 'number': i, 'amount': aInputs[i].text, // 索引i对应a[i]Input }; } // 单独处理a0Input的话取aInputs[0].text即可
如果你的输入框是动态生成的,直接将列表索引和输入框一一绑定即可,后续维护也比分散声明变量简单很多。
兼容原有代码的方案:手动构建映射表
如果你不想改动原有分散声明的变量,可以手动构建一个字符串到控制器实例的映射表:
final Map<String, TextEditingController> controllerMap = { 'a1Input': a1Input, 'a2Input': a2Input, // 依次填充所有20个控制器的键值对 'b0Input': b0Input, };
循环时通过拼接的字符串key取值即可:
for (var i = 1; i <= 9; i++) { var jData = { 'number': i, 'amount': controllerMap['a${i}Input']?.text ?? '', }; }
这个方案需要额外维护映射表,新增/删除控制器时要同步修改,不如列表方案高效。
内容的提问来源于stack exchange,提问作者sid heart
相关产品推荐
相关产品推荐

