> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syntblaze.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Dart Null-Assert Pattern

The null-assert pattern (`!`) is a unary pattern that matches a value, asserts that the value is not null, and casts it to its underlying non-null type. If the matched value evaluates to null, the pattern immediately throws a runtime exception.

## Syntax

```dart theme={"dark"}
<subpattern>!
```

The pattern consists of a subpattern followed by the postfix `!` operator. It binds the non-null value to the subpattern.

## Evaluation Semantics

When the Dart runtime evaluates a null-assert pattern against a value `v`:

1. It checks if `v` is null.
2. If `v` is null, execution halts, and a `TypeError` is thrown.
3. If `v` is not null, `v` is cast to its non-null base type and passed to the inner `<subpattern>` for further matching or binding.

## Type Promotion and Binding

The primary mechanical function of the null-assert pattern is to force type promotion during destructuring or pattern matching.

```dart theme={"dark"}
// Variable declaration pattern
int? nullableValue = 10;
var (promotedValue!) = nullableValue; 
// promotedValue is strictly typed as 'int'
```

In control flow structures, the null-assert pattern alters standard exhaustiveness and fall-through behaviors. Because a null value triggers an exception rather than a match failure, it does not pass control to subsequent cases.

```dart theme={"dark"}
// Switch statement pattern
void processValue(String? input) {
  switch (input) {
    case String s!: 
      // 's' is promoted to non-nullable String.
      // If 'input' is null, this throws rather than skipping to another case.
      print(s);
  }
}
```

## Destructuring with Null-Assert

The pattern can be nested within record, list, object, or map patterns to assert the non-nullability of specific elements during extraction.

```dart theme={"dark"}
// Record destructuring
(int?, int?) coordinates = (5, 10);
var (x!, y!) = coordinates; 
// Both x and y are extracted and promoted to non-nullable 'int'.
// Throws if either element in the tuple is null.
```

## Contrast with Null-Check Pattern

Mechanically, the null-assert pattern (`!`) differs strictly from the null-check pattern (`?`). While `?` safely fails the match on a null value and allows the switch or if-case to evaluate the next branch, `!` acts as a hard assertion, terminating the control flow with an exception if a null value is encountered.

<div
  style={{ 
display: "flex", 
justifyContent: "space-between", 
alignItems: "center", 
maxWidth: "754px", 
padding: "1rem 0",
marginBottom: "24px"
}}
>
  <span style={{ fontWeight: "bold", fontSize: "1.25rem", color: "var(--tw-prose-headings)", fontFamily: "Inter, ui-sans-serif, system-ui, sans-serif" }}>Tired of Poor Dart Skills? Fix That With Deep Grasping!</span>

  <a
    href="https://syntblaze.com"
    target="_blank"
    style={{ 
  marginLeft: "24px",
  textDecoration: "none", 
  backgroundColor: "#007AFF",
  color: "#ffffff", 
  padding: "6px 16px", 
  borderRadius: "16px",
  fontSize: "0.9rem",
  fontWeight: "600",
  textAlign: "center",
  transition: "background-color 0.2s ease"
}}
  >
    Learn More
  </a>
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/skill-tracking.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=b9b0305c93bb501c9e767b5c76c88835" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/skill-tracking.png" />

  <img src="https://mintcdn.com/syntblazellc/23tyuOzaWS88qFlc/images/nuggets.png?fit=max&auto=format&n=23tyuOzaWS88qFlc&q=85&s=c86c80197299762989e9b882419b2109" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/nuggets.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/bite-sized-exercises.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=a65f9a38c37ff28ab73ed783c53c60e3" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/bite-sized-exercises.png" />
</div>

<div style={{ display: "flex", gap: "12px", flexWrap: "wrap", marginTop: "12px" }}>
  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/mastery-chain.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=748a1763454713e679260fbb95f154a2" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/mastery-chain.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-previews.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=242f61448ff5dd6deaaab2dccc13b507" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-previews.png" />

  <img src="https://mintcdn.com/syntblazellc/-L0ums_2lctDSZ1l/images/element-explanations.png?fit=max&auto=format&n=-L0ums_2lctDSZ1l&q=85&s=cf0fc1c31f9cd0fc26716781be05fbc9" style={{ width: "30%", minWidth: 60 }} width="621" height="1344" data-path="images/element-explanations.png" />
</div>
