Dart null safety

Goal & motivation

Fuchsia's Dart build transitioned from dartanalyzer to dart analyze in 2021. dart analyze supports checking sound null safety{: .external}. This means runtime null-dereference errors can be turned into edit-time analysis errors.

Dart code written before Fuchsia code was checked for null safety needs to be migrated to take advantage of the null safety check. We would like to migrate all Dart sources to support null safety, since this will eliminate a whole class of runtime errors in Dart and Flutter applications.

Technical background

With null safety, all of the variables in the following code are non-nullable:

// In null-safe Dart, none of these can ever be null.
var i = 42; // Inferred to be an int.
String name = getFileName();
final b = Foo();

To indicate that a variable might have the value null, just add ? to its type declaration:

int? aNullableInt = null;

See Dart's “Understanding null safety”{: .external} for more details.

How to help

Picking a task

Search for Dart source files containing // @dart=2.9 or TODO(https://fxbug.dev/84961), all these files need to be migrated. For example you can code search for "// @dart=2.9" lang:dart.

Doing a task

NOTE: You may see import_of_legacy_library_into_null_safe from Dart analysis. This means one of the dependencies does not support null safety yet, and should be migrated first. If this happens to be a third-party dependency, we unfortunately have to wait for them to migrate first{: .external}.

Make sure the Dart sources you are migrating are included in your build. Remove // @dart=2.9 and the TODO line above it, rebuild, then follow errors and suggestions from Dart analysis. See Dart's migration guide{: .external} for more suggestions.

After you are done fixing all the errors from Dart analysis, add null_safety = true to the build target in the corresponding BUILD.gn file containing the sources you migrated.

Completing a task

When your change is ready, send it out for the corresponding owners for review. Preferable you can create a bug in Monorail to track the progress. If you do, make sure to mark it blocking the main bug 84961{: .external}, and close it after your change has merged.

Examples

Sponsors

Reach out for questions or for status updates: