SECURITY WARNING: Never run commands you don't understand. Always review code before execution. Use at your own risk.
Dart New Added 26 September 2026

Flutter: Incorrect use of ParentDataWidget

Expanded, Flexible and Positioned only mean something to one kind of parent, and the tree has one of them under something else, usually because a Container or a Padding was inserted between it and the Row. The message names both the widget and the ancestor it actually found, and the layout beneath it is laid out wrongly rather than not at all.

Quick fix

Read the commands before running them. Anything that restarts a service, deletes data or changes permissions should be tried on a non-production system first.

Quick fix
// Wrong: Expanded's parent is Padding, not the Row
// Row(children: [Padding(padding: pad, child: Expanded(child: Text('a')))])

// Right: Expanded sits directly under the Flex, padding goes inside it
Row(children: [
  Expanded(child: Padding(padding: pad, child: const Text('a'))),
]);

// Which parent each one belongs to
// Expanded, Flexible  ->  Row, Column, Flex
// Positioned          ->  Stack
Stack(children: [Positioned(top: 0, left: 0, child: child)]);

// A helper that wraps children is the usual way one gets misplaced
// children: items.map((i) => Card(child: Expanded(child: Tile(i)))).toList()

# The inspector shows the real tree, which is quicker than reading the code
flutter run        # then press "w" to dump the widget hierarchy

// Inside a Column, give a ListView bounded height with Expanded on the list
// itself, not on the items

How to diagnose Dart errors

Dart errors are dominated by null safety at runtime and version solving at build time. The null-check operator failure (! on a null) is Dart's equivalent of a NullPointerException and almost always means an assumption about initialisation order was wrong. Pub version solving failures are dependency-graph conflicts and are solved by reading the constraint that pub reports as unsatisfiable, not by deleting the lockfile.

If the quick fix above does not resolve it, work through these steps. They apply to this whole class of error, not just to this one message, which is usually what saves the time.

  1. Read the full pub get output. It names the two packages whose constraints conflict. Deleting pubspec.lock hides that information without fixing anything.
  2. Replace ! with a null check plus a meaningful error, or with late final where initialisation genuinely happens before first use. The crash location is where the assumption broke.
  3. Run flutter doctor -v before debugging any build failure. It catches missing Android SDK components and licence acceptance, which produce misleading Gradle errors.
  4. Use dart pub deps --style=tree to see the resolved graph and find which transitive dependency is pinning an old version.
  5. Clear derived state with flutter clean only after you have read the error. It resets the symptom and loses the evidence.

Tools worth reaching for

  • flutter doctor -v
  • dart pub deps
  • dart analyze
  • flutter run --verbose

Authoritative references

Primary documentation for this error, worth reading before applying any fix in production.

api.flutter.dev api.flutter.dev

Related Dart errors

See all 20 Dart errors →

Browse other categories

Something missing or wrong?

This entry is maintained by hand. If the fix is out of date, incomplete, or you have a better one, email a correction and it will be reviewed.