What are the ?? double question marks in Dart?

DartOperators

Dart Problem Overview


The following line of code has two question marks:

final myStringList = prefs.getStringList('my_string_list_key') ?? [];

What is the meaning?

Dart Solutions


Solution 1 - Dart

The ?? double question mark operator means "if null". Take the following expression, for example.

String a = b ?? 'hello';

This means a equals b, but if b is null then a equals 'hello'.

Another related operator is ??=. For example:

b ??= 'hello';

This means if b is null then set it equal to hello. Otherwise, don't change it.

Reference

Terms

The Dart 1.12 release news collectively referred to the following as null-aware operators:

  • ?? -- if null operator

  • ??= -- null-aware assignment

  • x?.p -- null-aware access

  • x?.m() -- null-aware method invocation

Solution 2 - Dart

Dart offers some handy operators for dealing with values that might be null. One is the ??= assignment operator, which assigns a value to a variable only if that variable is currently null:

int a; // The initial value of a is null.
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

Another null-aware operator is ??, which returns the expression on its left unless that expression’s value is null, in which case it evaluates and returns the expression on its right:

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.

Solution 3 - Dart

This is especially useful in the copyWith method which is used in flutter very often to override. Here is an example below:

import './color.dart';
import './colors.dart';

class CoreState {
  final int counter;
  final Color backgroundColor;

  const CoreState({
    this.counter = 0,
    this.backgroundColor = Colors.white,
  });

  CoreState copyWith({
    int? counter,
    Color? backgroundColor,
  }) =>
      CoreState(
        counter: counter ?? this.counter,
        backgroundColor: backgroundColor ?? this.backgroundColor,
      );

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
          other is CoreState &&
              runtimeType == other.runtimeType &&
              counter == other.counter &&
              backgroundColor == other.backgroundColor;

  @override
  int get hashCode => counter.hashCode ^ backgroundColor.hashCode;


  @override
  String toString() {
    return "counter: $counter\n"
            "color:$backgroundColor";
  }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSuragchView Question on Stackoverflow
Solution 1 - DartSuragchView Answer on Stackoverflow
Solution 2 - DartallentiologyView Answer on Stackoverflow
Solution 3 - DartSolen DoganView Answer on Stackoverflow