【问题标题】:Flutter Unhandled Exception: LateInitializationError: Local 'name' has not been initializedFlutter Unhandled Exception: LateInitializationError: Local 'name' has not been initialized
【发布时间】:2022-01-06 08:02:49
【问题描述】:

我有一个颤振应用程序,它试图比较两组应用程序版本号,第一个版本号使用 hive 在本地存储,第二个版本号来自 firestore。我可以从 firestore 获取数据,但我无法比较两者,因为从 firestore 获取数据需要一段时间。

这是从 firestore 获取数据的代码

  late final Box detailsBox;

  @override
  void initState() {
    super.initState();
    detailsBox = Hive.box('appDetails');
    updateApplication();
  }

  CollectionReference groceries =
      FirebaseFirestore.instance.collection('updates');

  late String? name;
  late String? version;
  late String? downloadUrl;

  getData()  {
    groceries.orderBy('name').snapshots().listen((gets) {
      try {
        for (var gettt in gets.docs) {
          name = gettt['name'] ?? 'null';
          version = gettt['version'] ?? 'null';
          downloadUrl = gettt['download url'] ?? 'null';

          debugPrint('name: $name');
          debugPrint('version: $version');
          debugPrint('downloadUrl: $downloadUrl');

          _addInfo(name!, version!, downloadUrl!);        }
      } catch (e) {
        print(e);
      }
    });
  }

这是比较版本号的代码

  int getExtendedVersionNumber(String version) {
    List versionCells = version.split('.');
    if (kDebugMode) {
      print(versionCells);
    }
    versionCells = versionCells.map((i) => int.parse(i)).toList();
    return versionCells[0] * 10000 + versionCells[1] * 100 + versionCells[2];
  }

  Future compareData() async {
    await getData();

    String localName = detailsBox.get('name');
    String localVersion = detailsBox.get('version');
    String downloadLink = detailsBox.get('downloadLink');

    debugPrint(
        'Info retrieved from detailsBox below:\n $localName\n ($localVersion) \n $downloadLink');

    debugPrint(
        'Info retrieved from firebase below:\n $name\n ($version) \n $downloadUrl');

    int version1Number = getExtendedVersionNumber(localVersion); // return 102003
    int version2Number = getExtendedVersionNumber(version!); // return 102003

    if (kDebugMode) {
      print(version1Number == version2Number);
      print(version1Number > version2Number);
      print(version1Number < version2Number);
    }
    if (version2Number > version1Number) {
      debugPrint('true');
      debugPrint(downloadUrl);
    }   
  }

当它到达这一点时 debugPrint( 'Info retrieved from firebase below:\n $name\n ($version) \n $downloadUrl'); 我得到了后期初始化错误 [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field 'name' has not been initialized.

如何修改代码,以便在运行时我可以考虑获取数据所需的时间,然后最终比较版本

【问题讨论】:

  • 如果 nameversiondownloadUrl late 已经可以为空,为什么还要创建它们?虽然合法,但这样做并没有太大的实际意义。 late 通常用于避免使用可空类型。
  • 至于让compareData 等待getData 完成:await getData() 不会等待,因为getData 不会返回FutureYou could make getData use a Completer 得到一个在第一次迭代后完成的Future,或者你可以让getData 使用await for 而不是listen 来等待所有元素(假设它是一个有限集)。
  • @jamesdlin 我找到了解决方法。我在getData() 中的try catch 中调用了compareData()。它现在解决了我的问题
  • 很高兴听到您的问题得到解决。如果您可以发布答案,将对社区成员有所帮助。

标签: firebase flutter google-cloud-firestore flutter-future


【解决方案1】:

只是改变

late String? name;

String? name;

【讨论】:

    猜你喜欢
    • 2023-02-24
    • 2021-12-25
    • 2021-09-08
    • 2022-01-12
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    相关资源
    最近更新 更多