Flutter 防止覆盖颤振中的值

Flutter 防止覆盖颤振中的值,flutter,dart,Flutter,Dart,如何防止在以下场景中覆盖我的值 我正在阅读Excel文件的每一行,将我的价格和产品保存在两个列表中,然后使用zip功能将这两个列表与第三个列表合并 for (var productsPricesStock in zip([ products, prices, row.sublist(3, maxCols), ])) { standValues[productsPricesStock[0

如何防止在以下场景中覆盖我的值

我正在阅读Excel文件的每一行,将我的价格和产品保存在两个列表中,然后使用zip功能将这两个列表与第三个列表合并

        for (var productsPricesStock in zip([
          products,
          prices,
          row.sublist(3, maxCols),
        ])) {
          standValues[productsPricesStock[0]] = {
            'name': productsPricesStock[0].toString(),
            'price': productsPricesStock[1].toString(),
            'stock': productsPricesStock[2].toString(),
          };
        }
然后保存这个值映射

        if (!startingStock[tourNumber].contains(standName)) {
          Map standObject = {standName: standValues};
          startingStock[tourNumber].add(standObject);
        }
我的问题是,我的条目被下一个条目的值覆盖: 这是第一行的第一个条目,例如:

这是第二行的第一个条目:

如您所见,第一行现在与第二行具有相同的条目:

这将发生在每一行,这意味着最后所有行都有最后一行的值

我很确定它与存储对值的引用(而不是值)有关,但我不确定如何防止这种情况

非常感谢您的帮助

功能的完整代码:

  List<dynamic> products = [];
  List<dynamic> prices = [];
  Map<String, dynamic> startingStock = {};
  Map<String, dynamic> standValues = {};

 Future<void> _readExcel() async {
    try {
      var bytes = _tempFile.readAsBytesSync();
      var excel = Excel.decodeBytes(bytes);
      for (var table in excel.tables.keys) {
        int maxCols = excel.tables[table].maxCols;
        for (var row in excel.tables[table].rows) {
          if (row[2] == 'Produkt') {
            row.removeWhere(
                (product) => product == null || product == 'Produkt');
            products = row;
          }
          if (row[2] == 'Preis') {
            row.removeWhere((price) =>
                price == null || price == 'Stand' || price == 'Preis');
            prices = row;
          }
        }
        for (var row in excel.tables[table].rows) {
          if (row[0] != 'TP-Master' && row[0] != null && row[1] != null) {
            var tourNumber = row[0].toString();
            var standName = row[1].toString();
            if (!startingStock.containsKey(tourNumber)) {
              startingStock[tourNumber] = [];
            }

            if (!startingStock[tourNumber].contains(standName)) {
              Map standObject = {standName: standValues};
              startingStock[tourNumber].add(standObject);
            }

            for (var productsPricesStock in zip([
              products,
              prices,
              row.sublist(3, maxCols),
            ])) {
              standValues[productsPricesStock[0]] = {
                'name': productsPricesStock[0].toString(),
                'price': productsPricesStock[1].toString(),
                'stock': productsPricesStock[2].toString(),
              };
            }
          }
        }
      }
      successSnackBar('Die Datei wurde erfolgreich gelesen!');
    } catch (err) {
      print(err);
      errorSnackBar('Beim lesen der Datei ist ein Fehler aufgetreten!');
    }
  }
standValues仅包含当前行的值,因此在本例中,它将包含最后一行的值。(北富勒2号看台)


我对您的代码进行了一些重构,并清理了一些类型,使它们更加具体。我希望这接近您想要的:

导入'dart:convert';
导入“dart:io”;
进口“包装:箭袋/箭筒.省道”;
导入“package:excel/excel.dart”;
Future main()异步{
等待_readExcel();
}
Future\u readExcel()异步{
最终启动库存=
{};
试一试{
final bytes=File('StackOverflow.xlsx').readAsBytesSync();
最终excel=excel.decodeBytes(字节);
for(excel.tables.values中的最终表格){
最终产品=[];
最终价格=[];
for(表中的最后一行。行){
如果(第[2]行=='Produkt'){
row.removehere(
(对象产品)=>product==null | | product=='Produkt');
products.addAll(row.map((objecte)=>e.toString());
}
如果(第[2]行=='Preis'){
行.删除其中((对象价格)=>
价格==null | |价格=='Stand'| |价格=='Preis');
addAll(row.map((objecte)=>e.toString());
}
}
for(表中的最后一行。行){
如果(第[0]行!=“TP主控”和第[0]行!=null和第[1]行!=null){
final tourNumber=行[0]。toString();
final standName=行[1]。toString();
最终标准值=起始库存
.putIfAbsent(tourNumber,()=>{})
.putIfAbsent(standName,()=>{});
适用于(最终产品)拉链制储物箱([
产品,
价格,
行.子列表(3,表.maxCols),
])) {
standValues[productsPricesStock[0]。toString()]={
“名称”:ProductsPricestock[0]。toString(),
“价格”:ProductsPriceStock[1]。toString(),
“库存”:ProductsPriceStock[2]。toString(),
};
}
}
}
}
打印(json.encode(startingStock));
印刷品(“Datei wurde erfolgreich gelesen!”);
}捕捉(错误){
打印(错误);
印刷品('Beim lesen der Datei ist ein Fehler aufgetreten!');
}
}
以格式化JSON格式输出:

{
   "T1":{
      "U-Stephansplatz":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"30.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"12.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"0.0"
         }
      },
      "Rugenbarg":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"25.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"124.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"34.0"
         }
      },
      "Blankenese":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"22.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"12.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"21.0"
         }
      },
      "Altona ZOB":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"22.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"42.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"22.0"
         }
      },
      "Holstenstraße":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"11.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"24.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"65.0"
         }
      }
   },
   "T2":{
      "Volksdorf":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"45.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"4.0"
         }
      },
      "Poppenbüttel":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"34.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"435.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"43.0"
         }
      },
      "Erdkampsweg":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"23.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"5.0"
         }
      },
      "Drosselstraße":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"432.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"53.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"6.0"
         }
      },
      "Fuhle Nord ":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"23.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"0.0"
         }
      }
   }
}

Map standObject={standName:standValues}
似乎有问题,因为您正在为所有创建的
standObject
共享相同的映射实例。这似乎是个问题,但我不确定如何将我的standValues分配给正确的standName。这将导致相同的结果:startingStock[tourNumber]。添加({standName:standValues});我很乐意为您提供一个解决方案,但我没有足够的细节来了解您想要实现的目标。此外,在执行代码之前,代码需要一个示例excel文件。如果有任何不清楚的地方,我会尝试添加更多信息,请告诉我!谢谢,我来看看。:)刚刚测试过,它就像一个符咒!非常感谢你,我在这件事上耽搁了很长时间。如果你有时间的话,我肯定会接受这个答案。你能不能快速解释一下错误是什么,以及将来如何预防?我认为你大部分问题的根源来自范围问题。我知道应该如何声明变量有不同的流派,但我认为最好是通过在需要的范围内定义变量来限制可用变量的数量。这将防止在很多情况下变量的值被重用到错误的位置。我还添加了更多的静态类型,使我更容易确保在正确的位置使用正确的类型。最后,我将初始化新映射的一些逻辑更改为使用
putIfAbsent
,这是一种很好的方法,您可以轻松地从映射中获取值,但如果尚未定义值,还可以在映射中插入值。再次感谢您的帮助!我会考虑到这一点:)祝你今天愉快。
standValues = [Spargel W: {name: Spargel W, price: 10.9, stock: 23} Spargel V: ..., Spargel W gestrig: ..., ...]
{
   "T1":{
      "U-Stephansplatz":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"30.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"12.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"0.0"
         }
      },
      "Rugenbarg":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"25.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"124.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"34.0"
         }
      },
      "Blankenese":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"22.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"12.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"21.0"
         }
      },
      "Altona ZOB":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"22.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"42.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"22.0"
         }
      },
      "Holstenstraße":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"11.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"24.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"65.0"
         }
      }
   },
   "T2":{
      "Volksdorf":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"45.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"4.0"
         }
      },
      "Poppenbüttel":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"34.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"435.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"43.0"
         }
      },
      "Erdkampsweg":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"23.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"5.0"
         }
      },
      "Drosselstraße":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"432.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"53.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"6.0"
         }
      },
      "Fuhle Nord ":{
         "Spargel W":{
            "name":"Spargel W",
            "price":"10.9",
            "stock":"23.0"
         },
         "Spargel V":{
            "name":"Spargel V",
            "price":"8.9",
            "stock":"34.0"
         },
         "Spargel W gestrig":{
            "name":"Spargel W gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Spargel V gestrig":{
            "name":"Spargel V gestrig",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 1":{
            "name":"Erdbeer 1",
            "price":"x",
            "stock":"0.0"
         },
         "Erdbeer 2":{
            "name":"Erdbeer 2",
            "price":"2.5",
            "stock":"0.0"
         }
      }
   }
}