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