Skip to main content
The ! operator, formally known as the null assertion operator, is a postfix unary operator in Dart’s sound null safety system. It forcefully casts an expression of a nullable type (T?) to its underlying non-nullable type (T). By appending this operator, you explicitly instruct the static analyzer to bypass compile-time null checks, asserting that the value will definitively not be null at runtime. Syntax
Compile-Time Behavior When applied, the ! operator alters the static type of the expression. If a variable x has the type String?, the expression x! is evaluated by the compiler as type String. This allows the expression to be assigned to non-nullable variables or passed as arguments to parameters that strictly require non-nullable types. Runtime Behavior During execution, the Dart runtime evaluates the expression preceding the ! operator:
  1. If the expression evaluates to a non-null value, execution proceeds normally, yielding that value.
  2. If the expression evaluates to null, the runtime immediately throws a TypeError (specifically, a null assertion failure), terminating the current execution flow unless caught.
Mechanics Visualization
Operator Precedence The ! operator shares the highest precedence level in Dart’s grammar, alongside other postfix operators like . (member access) and [] (subscript). It binds tightly to the expression immediately preceding it, meaning an expression like a.b! asserts that the property b is non-null, whereas a!.b asserts that the object a is non-null before attempting to access b.
Tired of Poor Dart Skills? Fix That With Deep Grasping!Learn More