# setState() or markNeedsBuild() called during build

- **ID:** `flutter/setstate-or-initstate-async`
- **Domain:** flutter
- **Category:** runtime_error
- **Verification:** ai_generated
- **Fix Rate:** 92%

## Root Cause

A widget's build method or its dependencies triggered setState() synchronously, violating Flutter's single-frame build constraint.

## Version Compatibility

| Version | Status | Introduced | Deprecated |
|---------|--------|------------|------------|
| Flutter 3.10 | active | — | — |
| Flutter 3.13 | active | — | — |
| Flutter 3.16 | active | — | — |

## Workarounds

1. **Use addPostFrameCallback to defer the setState call until after the current build frame:
WidgetsBinding.instance.addPostFrameCallback((_) {
  setState(() { /* update state */ });
});** (95% success)
   ```
   Use addPostFrameCallback to defer the setState call until after the current build frame:
WidgetsBinding.instance.addPostFrameCallback((_) {
  setState(() { /* update state */ });
});
   ```
2. **Restructure widget to avoid calling setState during build. Move the triggering logic to initState or a separate event handler that runs after the initial layout.** (85% success)
   ```
   Restructure widget to avoid calling setState during build. Move the triggering logic to initState or a separate event handler that runs after the initial layout.
   ```
3. **If the update is from a stream or future, use a StreamBuilder or FutureBuilder to handle asynchronous state changes without manual setState.** (90% success)
   ```
   If the update is from a stream or future, use a StreamBuilder or FutureBuilder to handle asynchronous state changes without manual setState.
   ```

## Dead Ends

- **Wrapping the setState() call in a Future.delayed(Duration.zero)** — Merely postpones the call to the next frame but does not address the root cause of calling setState during build. (40% fail)
- **Moving setState() to initState() without checking lifecycle** — initState() is called before build, but if the setState depends on BuildContext or inherited widgets not yet available, it can still cause issues. (50% fail)
- **Using a global variable to track build state and skip setState** — Brittle and error-prone; global state management often leads to other race conditions and missed updates. (60% fail)
