This recipe also used some Dart language features that you might be unfamiliar with – null-aware operators and null coalescing operators. Let's look more carefully at this line of code:
tasks = model?.data['task']
?.map<Task>((task) => Task.fromModel(task))
?.toList() ?? <Task>[];
When you insert null-aware operators, a ? is inserted after any variable that might be null. Here, you are telling Dart that if this variable is null, then just skip everything after the question mark. In this example, the model property might be null, so if we tried to access the data property on a null, Dart would throw an exception. In this case, if a null is ever encountered, this code will be gracefully skipped.
The null coalescing operator, ??, is used almost like a ternary statement. This operator will return the value on the right-hand side of the question marks if the value on the left-hand side is...