Kevnlan
Kevnlan

Reputation: 567

Flutter Unhandled Exception: LateInitializationError: Local 'name' has not been initialized

I have a flutter app which tries to compare two sets of app version numbers, the first version number is stored locally using hive and the second version number is from firestore. I can fetch the data from firestore but I cannot get to compare both since it takes a while to fetch data from firestore.

This is the code to fetch data from 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);
      }
    });
  }

This is the code to compare the version numbers

  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);
    }   
  }

When it gets to this point debugPrint( 'Info retrieved from firebase below:\n $name\n ($version) \n $downloadUrl'); I get the late initialization error [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: LateInitializationError: Field 'name' has not been initialized.

How can I modify the code such that when it runs I can account for the time it takes to get data then finally compare the versions

Upvotes: 1

Views: 615

Answers (1)

Vishal_VE
Vishal_VE

Reputation: 2127

Just change

late String? name;

to

String? name;

Upvotes: 1

Related Questions