flutter - 防止覆盖抖动值

标签 flutter dart

在以下情况下,如何防止覆盖我的值。
我正在阅读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(),
          };
        }
然后,我保存此值(value) map
        if (!startingStock[tourNumber].contains(standName)) {
          Map standObject = {standName: standValues};
          startingStock[tourNumber].add(standObject);
        }
我的问题是我的条目被下一个的值覆盖:
例如,这是第一行的第一项:
enter image description here
这是第二行的第一项:
enter image description here
如您所见,第一行现在与第二行具有相同的条目:
enter image description here
每行都会发生这种情况,这意味着最后所有行都具有最后一行的值。
我很确定它与存储对值而不是值的引用有关,但是我不确定如何防止这种情况。
非常感谢您的帮助!
完整的功能代码:
  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!');
    }
  }
这是excel文件的一部分。
在第5行中,您可以看到所有产品。
在第6行中,您可以看到每种产品的价格。
在随后的各行中,您可以在第一列中看到游览编号和相关的商店名称以及商店每种产品的数量。
在我的代码中,我尝试以tournumber [shopname]格式存储数据,然后映射价格,产品名称和产品数量。
enter image description here
Excel测试:
https://docs.google.com/spreadsheets/d/1p9Z5yQ2u8sVDmEdbD9dYyYPwlQqdXWeZJp2BjvoexU4/edit?usp=sharing
结果将如下所示:
enter image description here
enter image description here
enter image description here
enter image description here
这就是用示例excel执行后的列表和 map 的样子。
    products = [
Spargel W, 
Spargel V, 
gestrig Spargel W, 
gestrigSpargel V, 
Erdbeer 1,  
Erdbeer 2
]
    prices = [10.90, 8.90, x, x, x, 2,50 ]
    startingStock = {
    'T1' : [U-Stephansplatz[
    Spargel W: {
    'name': Spargel W,
     'price': '10.9', 
    'stock': '30'
    }
    Spargel V: {
    ...
    } 
    Spargel W gestern: {
    ...
    } 
    ...
    ],
    Rugenbarg[
    Spargel W: {...}, 
    Spargel V: {...} 
    Spargel W gestern: {...} 
    ...]
    ] ...
    , 'T2': [
    Volksdorf : [
    Spargel W: {
    'name': Spargel W, 
    'price': '10.9', 
    'stock': '45'
    }
    Spargel V: {
    ...
    }
    Spargel W gestern: {
    ...
    } 
    ...],
    Poppenbüttel [
    Spargel W: {...}, 
    Spargel V: {...} 
    Spargel W gestern: {...} 
    ...]
    ] ...}
standValues仅包含当前行的值,因此在这种情况下,它将包含最后一行的值。 (T2站Fuhle Nord)
standValues = [Spargel W: {name: Spargel W, price: 10.9, stock: 23} Spargel V: ..., Spargel W gestrig: ..., ...]

最佳答案

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

import 'dart:convert';
import 'dart:io';
import 'package:quiver/iterables.dart';
import 'package:excel/excel.dart';

Future<void> main() async {
  await _readExcel();
}

Future<void> _readExcel() async {
  final startingStock =
      <String, Map<String, Map<String, Map<String, String>>>>{};

  try {
    final bytes = File('StackOverflow.xlsx').readAsBytesSync();
    final excel = Excel.decodeBytes(bytes);

    for (final table in excel.tables.values) {
      final products = <String>[];
      final prices = <String>[];

      for (final row in table.rows) {
        if (row[2] == 'Produkt') {
          row.removeWhere(
              (Object product) => product == null || product == 'Produkt');
          products.addAll(row.map((Object e) => e.toString()));
        }
        if (row[2] == 'Preis') {
          row.removeWhere((Object price) =>
              price == null || price == 'Stand' || price == 'Preis');
          prices.addAll(row.map((Object e) => e.toString()));
        }
      }

      for (final row in table.rows) {
        if (row[0] != 'TP-Master' && row[0] != null && row[1] != null) {
          final tourNumber = row[0].toString();
          final standName = row[1].toString();
          final standValues = startingStock
              .putIfAbsent(tourNumber, () => {})
              .putIfAbsent(standName, () => {});

          for (final productsPricesStock in zip<dynamic>([
            products,
            prices,
            row.sublist(3, table.maxCols),
          ])) {
            standValues[productsPricesStock[0].toString()] = {
              'name': productsPricesStock[0].toString(),
              'price': productsPricesStock[1].toString(),
              'stock': productsPricesStock[2].toString(),
            };
          }
        }
      }
    }
    print(json.encode(startingStock));
    print('Die Datei wurde erfolgreich gelesen!');
  } catch (err) {
    print(err);
    print('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"
         }
      }
   }
}

关于flutter - 防止覆盖抖动值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63483274/

相关文章:

flutter - 如何在 flutter 中使用拇指创建一个范围 slider 作为png图像

flutter - 如何增加onLongPress的时间限制?

android - Flutter with Redux : How to show alert from middleware? 在哪里可以获得 BuildContext

android - 三星手机中的 Flutter 构建失败,Permission Denial : broadcast from android asks to run as user -1 but is calling from user 0

flutter - BlocProvider 没有找到 Generic Flutter Bloc

flutter - 将 ListTiles 排成一行

ios - 为 Flutter 应用程序添加关联域权限

firebase - Flutter Firebase如何使用Google登录用户

json - Flutter:如何下载Json文件到本地然后访问

dart - 通过表达式填充 Polymer 属性