Home > Mobile >  non-nullable local variable 'key' must be assigned before it can be used
non-nullable local variable 'key' must be assigned before it can be used

Time:01-11

I am trying to assign values after a specific condition has been matched, but I get error saying the variable must be assigned before I can use it.

            return ListView(
              children: snapshot.data!.docs.map((doc) {
                Map<String, dynamic> data =
                    doc.data()! as Map<String, dynamic>;

                // user Id
                var userId = currentUser.uid;

                // Recipient Id
                var recipientId = data['latestMessage']['id'];

                // Defined variables
                String key;
                String name;

                generateChatId() {
                  if (userId.length > recipientId.length) {
                    return userId   '-'   recipientId;
                  } else {
                    return recipientId   '-'   userId;
                  }
                }

                if (doc.id == generateChatId()) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                } else if (recipientId == userId) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                }

                return ListTile(
                  title: Text(key),
                  subtitle: Text(name),
                )
              }).toList(),
            );

In the above code, variables key and name are defined, then assigned values in the if statements. Are the variable then not assigned outside the if statements, when used in the ListTile?

CodePudding user response:

return ListView(
              children: snapshot.data!.docs.map((doc) {
                Map<String, dynamic> data? =
                    doc.data()! as Map<String, dynamic>;

                // user Id
                late var userId = currentUser.uid;

                // Recipient Id
                late var recipientId = data['latestMessage']['id'];

                // Defined variables
                String? key;
                String? name;

                generateChatId() {
                  if (userId.length > recipientId.length) {
                    return userId   '-'   recipientId;
                  } else {
                    return recipientId   '-'   userId;
                  }
                }

                if (doc.id == generateChatId()) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                } else if (recipientId == userId) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                }

                return ListTile(
                  title: Text(key),
                  subtitle: Text(name),
                )
              }).toList(),
            );

try this one

CodePudding user response:

Null safety

The reason your code is getting an error is because of Dart's null safety feature. Null safety features added after Flutter 2.0.

'Key' or 'name' are defined and branches 'if' and 'else-if' are performed. However, if there is no value suitable for the condition of 'if' or 'else-if', no value is assigned to 'key' or 'name'.

This is why your code is caught by Dart's null safety error.

There are 3 ways to resolve errors in your code.

1. Use Nullable Type

    String? key;
    String? name;

2. Initialize key variable

    String key = "";  // "" is not Null
    String name = "";

3. Add else conditional statement

                ...

                if (doc.id == generateChatId()) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                } else if (recipientId == userId) {
                  key = data['latestMessage']['id'] as String;
                  name = data['latestMessage']['name'] as String;
                } else {
                  // add your code here
                }

                ...

good luck

  •  Tags:  
  • Related