如何在返回小部件之前遍历列表以创建地图?颤振 - 飞镖

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: &lt;Widget&gt;[ 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 获取数据并将其存储在列表中以在颤振小部件中使用?

在颤振地图功能在列小部件中不起作用

在颤振列表视图中检测焦点小部件

如何迭代对象列表并使用颤振在小部件中获取它们的属性?

如何创建自定义颤振 sdk 小部件,重建颤振和使用新的小部件

颤振小部件测试 - 如何执行“返回上一个屏幕”的测试