如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖
Posted
技术标签:
【中文标题】如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖【英文标题】:How to iterate over a list to create a map before returning a widget? Flutter - Dart 【发布时间】:2020-07-13 13:06:03 【问题描述】:我想创建一个小部件,它将基于地图上的循环生成多个 CheckboxListTiles。每个条目的键是一个 ProfessionalService,它的值是一个布尔值(表示该框是否被选中)。 ProfessionalIdentityModel 拥有一个 ProfessinalService 列表。我想遍历地图以创建多个 CheckBoxTiles。 我的代码看起来像:
Widget serviceTile(ProfessionalIdentityModel professionalIdentityModel)
Map boolServiceMap =
for (var service
in professionalIdentityModel.professionalServices.services)
service: false
;
return Column(
children: <Widget>[
boolServiceMap.forEach((service, boolean)
CheckboxListTile(
title: Text(service.name),
value: false,
onChanged: (bool value)
setState(()
service[boolean] = value;
);
,
);
)
],
);
我想根据我的 ProfessionalService 列表创建我的地图。必须在返回我的小部件之前完成。问题是仅填充了 1 个 CheckBoxTiles,因为我的地图仅包含 1 个元素。你能找到我的地图包含所有元素的解决方案吗?
你能帮帮我吗?非常感谢。
【问题讨论】:
我不明白你想要什么,你能详细说明一下吗?This is the case but for only 1 element
是什么意思?那么The list iterates only once and then return the column.
这就是你想要的吗?似乎没用。
@mFeinstein 抱歉,我编辑了我的帖子。希望澄清。
既然你确定professionalIdentityModel.professionalServices.services
有不止一项,我不知道为什么它只迭代一次。
@mFeinstein 感谢您尝试帮助我。当我使用这个return Column( children: <Widget>[ for (var service in professionalIdentityModel.professionalServices.services) CheckboxListTile( title: Text(service.name), value: false, onChanged: (bool newValue) setState(() ); , ) ], );
时,checkboxliststyles 会填充所有元素。
哦,好吧,我知道为什么第一个没有迭代,我会发布它作为解释它的答案。
【参考方案1】:
一个Map
需要有唯一键,如果你所有的services
有相同的对象,那么所有的键都是相等的而不是唯一的。
每次您要添加一个条目时,新键将与上一个键相同。当地图收到一个与他们已经拥有的另一个相同的键时,它们只会覆盖该键的值,这就是为什么您的 Map
只有一个项目。
你正在做的事情是这样的:
Map myMap = 'myInt': 1 ;
myMap['myInt'] = 2;
myMap['myInt'] = 3;
myMap['myInt'] = 4;
最后myMap
将只有一个条目:'myInt': 4
。
您的Map
可以工作的唯一方法是,如果您的所有服务都是不同的对象。
起初很难理解这一点,因为您没有发布服务的类型以及它们是如何构建的,所以我认为它们都是不同的,因为通常我们不会多次创建相同的服务,但是不同的服务做不同的事情(单一职责原则)。
【讨论】:
抱歉,我不确定是否理解。键是一种具有名称和价格作为属性的 ProfessionalService。确实有几个 ProfessionalService 但它们没有使它们独一无二的相同属性不是吗?如果我的 Map 类似于 'key1' = 3, 'key2' = 4,则键是 String 类型(并且不同),因此该映射仍然有效。我错过了一些东西,希望你有耐心解释我。谢谢 您只发布了部分代码,我需要猜测其余部分,不知何故,所有服务都是相同的,Map
每次看到相同的key
,所以它正在替换相同的一直都很有价值。检查 services
中的值并确保它们确实是唯一的,例如 services[0] != services[1]
因为 Map 使用 ==
和 hashcode
来比较键,所以如果你覆盖这些 Map
可以认为这些值是相等的,即使它们不是。
我已经测试过了,你是对的。 services[i] 总是等于 services[i+1]。所以这意味着这些变量指向同一个对象不是吗?
好像是,你应该看看这个。
感谢您的帮助以上是关于如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Firebase Firestore 获取数据并将其存储在列表中以在颤振小部件中使用?