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更新了我的答案。