【问题标题】:Variable Independent of setState变量独立于 setState
【发布时间】:2022-02-07 08:24:08
【问题描述】:

假设我有一个地图并且在我的代码中的某个地方,我想保存它的当前状态。我将地图二设置为地图一,并继续更改地图一的值,希望保持地图二的值相同以供参考。如果我在更改地图一后调用 setState(() {}),它似乎也会更新地图二的所有值。这不是我想要的。我想设置地图二并且不更新,直到我想再次保存地图一的状态。很难在我的代码中演示这个问题而不倾倒整个事情,所以我将尝试说明我在下面谈论的内容。忽略这段代码实际上不会运行,这就是想法。地图二的值将在小部件中使用,但为了举例,该值只是被打印出来。此代码理论上会打印 foo。我希望它开始打印。在我看来,应该有一些像 const 或 final 之类的东西,我只是想念它设置一个变量并且不会使其相对。

Map mapOne = {
  'start' : 'start',
  'end' : 'end'
};
late Map mapTwo;

main() {
  mapTwo = mapOne;
  mapOne = {
    'start' : 'foo',
    'end' : 'foo'
  };
  
  setState(() {});
  
  print(mapTwo['start']);
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    当您将地图一分配给地图二时,您基本上是在设置地图一和地图二来引用同一个对象。所以要实现你想要的,你可以这样做:

    mapTwo = Map.from(mapOne);
    

    这是一个验证示例:

    void main() async {
      final a = {'a': 'b'};
      final b = Map.from(a);
      b['a'] = 'c';
      print(a);
      print(b);
    }
    

    【讨论】:

    • 我测试了它,它似乎仍然表现出相同的行为。也许这根本不可能?我真的不知道,但谢谢你的回答。
    • 那你还有其他问题。再次检查我的答案我为您提供了一个简单的代码,以验证它是否以这种方式正常工作。 @EthanCrosby
    【解决方案2】:

    我找到了答案here。问题是可变变量和不可变变量之间的区别。对我来说,解决方案是将我需要的值存储在字符串而不是映射中,因为映射在字符串不可变的情况下是可变的。我之前引用的帖子有更多详细信息。

    【讨论】:

      猜你喜欢
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 2015-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多