Home > other >  Null safety problem - map contains non nullable values
Null safety problem - map contains non nullable values

Time:12-29

Why is there an error:

A value of type 'TestBloc?' can't be returned from the method 'createFromId' because it has a return type of 'TestBloc.

The map contains values of type TestBloc (not of type TestBloc?) so it is impossible to assign a null value.

class TestBloc {
  String id;
  TestBloc({
    required this.id,
  });
}

class TestBlocFactory {
  final Map<String, TestBloc> _createdElements = HashMap<String, TestBloc>();

  TestBloc createFromId(String id) {
    if (_createdElements.containsKey(id)) {
      return _createdElements[id]; // !! ERROR !!
    } else {
      TestBloc b = TestBloc(id: id);
      _createdElements[id] = b;
      return b;
    }
  }
}

CodePudding user response:

Since you are checking that the map contains the correct id with _createdElements.containsKey, you know for sure that it won't return null. So, it's safe to use the ! operator which says "I won't be null"

class TestBloc {
  String id;
  TestBloc({
    required this.id,
  });
}

class TestBlocFactory {
  final Map<String, TestBloc> _createdElements = HashMap<String, TestBloc>();

  TestBloc createFromId(String id) {
    if (_createdElements.containsKey(id)) {
      return _createdElements[id]!;
    } else {
      TestBloc b = TestBloc(id: id);
      _createdElements[id] = b;
      return b;
    }
  }
}

See also

CodePudding user response:

You may define you map as <String, TestBloc> but still _createdElements[id] may return a null value, because the id key may not available so it may return null but because you check it in your if condition you can use ! (as @MendelG said) or you can cast it like this:

if (_createdElements.containsKey(id)) {
  return _createdElements[id] as TestBloc; // <--- change this
} else {
  TestBloc b = TestBloc(id: id);
  _createdElements[id] = b;
  return b;
}
  • Related