'UserModel showing error for status of the user

Can somebody help me in resolving the error. There is an error in UserModel.fromDocumentSnapshot. ITs telling userstatus has to be initialized. I have initialized it but yet the error remains. Can somebody tell me what could be the error in tis code. Looking forward to resolve this error. Please do help me

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:get/get.dart';
import 'package:hogoco_meet_app/model/base_model.dart';
import 'package:hogoco_meet_app/services/firebasedb.dart';

enum UserStatus { Active, Inactive, None }

extension on String {
  UserStatus get getuserStatus {
    switch (this) {
      case 'Active':
        return UserStatus.Active;
        break;
      case 'Inactive':
        return UserStatus.Inactive;
        break;
      default:
        return UserStatus.None;
        break;
    }
  }
}

extension ExtendedUserStatus on UserStatus {
  bool get active => this == UserStatus.Active;
  bool get inactive => this == UserStatus.Inactive;
  bool get none => this == UserStatus.None;
  String get getuserStatus {
    switch (this) {
      case UserStatus.Active:
        return 'Active';
        break;
      case UserStatus.Inactive:
        return 'Inactive';
        break;
      default:
        return 'None';
        break;
    }
  }
}

class UserModel extends BaseModel {
  String? id;
  String? userProfilePhotoUrl;
  String? userFullName;
  String? userEmail;
  UserStatus userStatus;
  bool? userIsVerified;
  Timestamp? userRegDate;
  Timestamp? userLastLoginDate;
  List<UserModel>? userFriends;

  UserModel(
      {this.id,
      this.userProfilePhotoUrl,
      this.userFullName,
      this.userEmail,
      this.userStatus = UserStatus.Inactive,
      this.userIsVerified,
      this.userRegDate,
      this.userLastLoginDate,
      this.userFriends});

  @override
  String toString() {
    return '''UserModel: {userRegDate = ${this.userRegDate},id = ${this.id},userFullName = ${this.userFullName},userProfilePhotoURL = ${this.userProfilePhotoUrl},
    userEmail = ${this.userEmail},userFriends = ${this.userFriends},userIsVerified = ${this.userIsVerified},userStatus = ${this.userStatus}}''';
  }

  UserModel.fromDocumentSnapshot({DocumentSnapshot? documentSnapshot}) {
    final _userStatus = ((documentSnapshot!.data()! as Map<String, dynamic>)
            .containsKey('userStatus'))
        ? ((documentSnapshot.data()! as Map<String, dynamic>)["userStatus"]
                as String)
            .getuserStatus
        : UserStatus.None;

    id = documentSnapshot.id;
    userProfilePhotoUrl = (documentSnapshot.data()
        as Map<String, dynamic>)['userProfilePhotoUrl'];
    userFullName =
        (documentSnapshot.data() as Map<String, dynamic>)["userFullName"];
    userEmail = (documentSnapshot.data() as Map<String, dynamic>)["userEmail"];
    userStatus = _userStatus;
    userIsVerified =
        (documentSnapshot.data() as Map<String, dynamic>)["userIsVerified"];
    userRegDate =
        (documentSnapshot.data() as Map<String, dynamic>)['userRegDate'];
    userLastLoginDate =
        (documentSnapshot.data() as Map<String, dynamic>)['userLastLoginDate'];
    userFriends =
        (documentSnapshot.data() as Map<String, dynamic>)["userFriends"];
  }
}

class UserCrud {
  final FirebaseService<UserModel> firebaseService =
      Get.put(FirebaseService<UserModel>());

  static const String Collection = FirebaseCollections.USER;

  Stream<List<UserModel>> get getUsers {
    return firebaseService.getListStream(
      collection: Collection,
      returnVal: (query) {
        final retVal = <UserModel>[];
        query.docs.forEach((element) {
          retVal.add(UserModel.fromDocumentSnapshot(documentSnapshot: element));
        });
        return retVal;
      },
    );
  }
}

Error

error: Non-nullable instance field 'userStatus' must be initialized. (not_initialized_non_nullable_instance_field at [hogoco_meet_app] lib\model\user_model.dart:71)



Solution 1:[1]

The userStatus field is the only field that is declared non-nullable, which means you have to initialize it before the constructor is executed.

UserModel.fromDocumentSnapshot({DocumentSnapshot? documentSnapshot}) is called a named constructor, therefore to be able to use it you need to initialize the userStatus first and you can do that by adding it to the initializer list:

    UserModel.fromDocumentSnapshot({DocumentSnapshot? documentSnapshot}) : userStatus = UserStatus.Inactive {
    final _userStatus = ((documentSnapshot!.data()! as Map<String, dynamic>)
            .containsKey('userStatus'))
        ? ((documentSnapshot.data()! as Map<String, dynamic>)["userStatus"]
                as String)
            .getuserStatus
        : UserStatus.None;

    id = documentSnapshot.id;
    userProfilePhotoUrl = (documentSnapshot.data()
        as Map<String, dynamic>)['userProfilePhotoUrl'];
    userFullName =
        (documentSnapshot.data() as Map<String, dynamic>)["userFullName"];
    userEmail = (documentSnapshot.data() as Map<String, dynamic>)["userEmail"];
    userStatus = _userStatus;
    userIsVerified =
        (documentSnapshot.data() as Map<String, dynamic>)["userIsVerified"];
    userRegDate =
        (documentSnapshot.data() as Map<String, dynamic>)['userRegDate'];
    userLastLoginDate =
        (documentSnapshot.data() as Map<String, dynamic>)['userLastLoginDate'];
    userFriends =
        (documentSnapshot.data() as Map<String, dynamic>)["userFriends"];
  }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Peter Haddad