Flutter/Dart中为何在List.map()前使用...展开运算符?
为什么Flutter中Column的children必须用
...展开map的结果? 核心原因是Column的children要求是List<Widget>,每个元素必须是单个Widget,而map()返回的是一个包含多个Widget的集合对象,不是单个Widget,直接放进去会类型不匹配。
具体拆解:
- 你的代码里,
questions[questionIndex]['answers'].map((ans) => Answer(...))返回的是Iterable<Widget>(哪怕没加.toList(),也是一个可迭代的Widget集合)。如果直接把这个集合放进children列表,就相当于列表里多了一个元素——这个集合本身,而不是集合里的每个Widget,这就违反了children必须是List<Widget>的要求,所以会报类型错误。 ...展开运算符的作用就是把集合里的元素逐个拆出来,直接加入到children列表中。比如原本map()返回[Answer1, Answer2],用...之后,就会把这两个Answer分别作为独立元素放进children,最终列表变成[其他Widget, Answer1, Answer2],全部是Widget类型,符合要求。
为什么去掉.toList()也能运行?
因为Dart的展开运算符...支持所有Iterable类型,map()返回的Iterable不需要先转成List就能被直接展开,所以去掉.toList()不影响功能,只要用了...就能正确拆分元素。
举个直观的对比:
- 错误写法:
Column( children: [ Text('题目'), // 这里是把一个Iterable对象作为children的一个元素,类型不匹配 questions[questionIndex]['answers'].map((ans) => Answer(...)) ], ) - 正确写法:
Column( children: [ Text('题目'), // 把Iterable里的每个Answer拆出来,逐个加入children ...questions[questionIndex]['answers'].map((ans) => Answer(...)) ], )
内容的提问来源于stack exchange,提问作者GoodMan
相关产品推荐
相关产品推荐

