Dart ';价值';can';不能用作setter,因为它';决赛

Dart ';价值';can';不能用作setter,因为它';决赛,dart,Dart,如何修复下一个错误?我需要设置值,但它似乎是最终的 Future.forEach<MapEntry>(map.entries, (jsonMap) async { if (jsonMap.value is List) { await Future.forEach(jsonMap.value, (listItem) async { await KVToTableInsert(jsonMap.key, listItem); });

如何修复下一个错误?我需要设置值,但它似乎是
最终的

Future.forEach<MapEntry>(map.entries, (jsonMap) async {
    if (jsonMap.value is List) {
      await Future.forEach(jsonMap.value, (listItem) async {
        await KVToTableInsert(jsonMap.key, listItem);
      });
    }
    else {
         if(jsonMap.value == null)
         {
          savedValue = 0; //
          jsonMap.value = 0; // 'value' can't be used as a setter because it's final.
         }
    // ...

Future.forEach(map.entries,(jsonMap)异步{
if(jsonMap.value为列表){
wait Future.forEach(jsonMap.value,(listItem)异步{
等待KVToTableInsert(jsonMap.key,listItem);
});
}
否则{
if(jsonMap.value==null)
{
savedValue=0//
jsonMap.value=0;//“value”不能用作setter,因为它是最终值。
}
// ...

问题在于
条目
中的
映射条目
对象是只读的,因为您不能从条目对象更新每个条目的键或值,而应该在地图上进行更新

当我看代码时,我认为主要的问题是在同一个forEach循环中做的太多了。因此我认为最简单的解决方案是从
KVToTableInsert
中spli“set jsonMap.value to 0”逻辑

更新地图时,您可以使用如下方法,例如
updateAll

void main() {
  final jsonMap = {'a': null, 'b': 5};
  print(jsonMap); // {a: null, b: 5}

  jsonMap.updateAll((key, value) => value ?? 0);
  print(jsonMap); // {a: 0, b: 5}
}
然后,您可以使用
forEach
方法迭代所有元素。这里的另一个注意事项是,当您大量使用
async
时,我认为在每个构造中使用a而不是使用
forEach
更具可读性

已更新

这里有一个更完整的例子来说明我的意思:

Future<void> main() async {
  final map = <String, dynamic>{
    'a': [1, 2, 3],
    'b': 5,
    'c': null
  };
  print(map); // {a: [1, 2, 3], b: 5, c: null}

  map.updateAll((key, dynamic value) => value ?? 0);
  print(map); // {a: [1, 2, 3], b: 5, c: 0}

  for (final jsonMap in map.entries) {
    if (jsonMap.value is List) {
      for (final listItem in jsonMap.value) {
        await KVToTableInsert(jsonMap.key, listItem);
      }
    } else {
      // ...
    }
  }
}
Future main()异步{
最终地图={
“a”:[1,2,3],
“b”:5,
“c”:空
};
打印(映射);//{a:[1,2,3],b:5,c:null}
map.updateAll((键,动态值)=>值??0);
打印(地图);//{a:[1,2,3],b:5,c:0}
for(map.entries中的最终jsonMap){
if(jsonMap.value为列表){
for(jsonMap.value中的最终列表项){
等待KVToTableInsert(jsonMap.key,listItem);
}
}否则{
// ...
}
}
}

您可以看到,通过使用normal for each循环,我们可以跳过大量的
async
声明,并使其更易于理解正在发生的事情。通过处理以前的
null=>0
映射,我们现在知道,如果要更新映射项,则不可能存在任何
value==null

>updateAll在地图上:。或者,您可以为每个循环创建一个正常值,并在需要时更新每个键。@julemand101您可以显示
updateAll
的语法吗?我已将下一个字符串复制到project中,并得到错误:``jsonMap.updateAll((键,值)=>value??0);//没有为“MapEntry”类型定义“updateAll”方法。“是的,因为您应该直接在
Map
上使用它。在您的情况下,它将是
Map
。甚至在运行第一个
Future之前就执行它。forEach
在您的情况下,它将是
Map
请告诉我它在codeOk中,我将尝试重写您的ex足够了,这样就行了。如果您提供了一个更完整的示例,这会更容易,但我可以正确地猜测类型是什么。@DmitryBubennkov更新了我的答案。