Null safety feedback: Null check should allow type promotion but doesn’t

I’m upgrading a personal package that is based on the Flutter framework. I noticed here in the Flutter Text widget source code that there is a null check:

if (textSpan != null) {
  properties.add(textSpan!.toDiagnosticsNode(name: 'textSpan', style: DiagnosticsTreeStyle.transition));
}

However, textSpan! is still using the ! operator. Shouldn’t textSpan be promoted to a non-nullable type without having to use the ! operator? However, trying to remove the operator gives the following error:

An expression whose value can be ‘null’ must be null-checked before it can be dereferenced.
Try checking that the value isn’t ‘null’ before dereferencing it.

Author: Fantashit

1 thought on “Null safety feedback: Null check should allow type promotion but doesn’t

  1. This is working as intended. Type promotion is only applicable to local variables. _currentTextRun is not local and textSpan may well be non-local as well (the example doesn’t show that). Promotion of an instance variable is not sound, because it could be overridden by a getter that runs a computation and returns a different object each time it is invoked. Cf. dart-lang/language#1188 for discussions about a mechanism which is similar to type promotion but based on dynamic checks, with some links to related discussions.

Comments are closed.