Start Debugging

Fix: Undefined name 'awaitNotRequired' bei material_ui oder cupertino_ui unter Flutter 3.44

material_ui 1.3.0 und cupertino_ui 1.1.0 verwenden eine Annotation, die Flutter 3.44 nicht exportiert. Beide sind zurückgezogen, aber eine Lockfile behält sie. Erst downgraden, dann upgraden, um bei 1.2.0 und 1.0.2 zu landen.

Ihre pubspec.lock pinnt material_ui 1.3.0 und/oder cupertino_ui 1.1.0, zwei Releases, die @awaitNotRequired verwenden. package:flutter/foundation.dart exportiert diese Annotation erst ab Flutter 3.47.0. Beide Versionen sind auf pub.dev inzwischen zurückgezogen (retracted), aber pub behält eine zurückgezogene Version, die Sie bereits gesperrt haben, und unter Flutter 3.44 wechselt selbst flutter pub upgrade nicht von ihr weg. Führen Sie flutter pub downgrade material_ui cupertino_ui gefolgt von flutter pub upgrade aus (Sie landen dann bei material_ui 1.2.0 und cupertino_ui 1.0.2), oder aktualisieren Sie Flutter auf 3.47. Alles Folgende wurde mit Flutter 3.44.8 (Dart 3.12.2) und Flutter 3.47.6 (Dart 3.13.5) am 2026-10-02 gemessen.

Der Fehler im Kontext

Der Analyzer bleibt still, flutter pub get gelingt, und erst der erste echte Compile schlägt im Pub-Cache fehl. Dies ist flutter build web unter 3.44.8; jedes andere Ziel führt dasselbe Dart-Frontend über dieselben Quellen aus, daher scheitert flutter run an denselben Zeilen:

Target dart2js failed: ProcessException: Process exited abnormally with exit code 1:
/Users/marius/.pub-cache/hosted/pub.dev/material_ui-1.3.0/lib/src/bottom_sheet.dart:1304:2:
Error: Undefined name 'awaitNotRequired'.
@awaitNotRequired
 ^^^^^^^^^^^^^^^^
/Users/marius/.pub-cache/hosted/pub.dev/material_ui-1.3.0/lib/src/carousel.dart:1982:4:
Error: Not a constant expression.
  @awaitNotRequired
   ^^^^^^^^^^^^^^^^
/Users/marius/.pub-cache/hosted/pub.dev/material_ui-1.3.0/lib/src/dialog.dart:1672:2:
Error: Undefined name 'awaitNotRequired'.
@awaitNotRequired
 ^^^^^^^^^^^^^^^^
...
/Users/marius/.pub-cache/hosted/pub.dev/cupertino_ui-1.1.0/lib/src/route.dart:1347:2:
Error: Undefined name 'awaitNotRequired'.
@awaitNotRequired
 ^^^^^^^^^^^^^^^^

material_ui 1.3.0 erzeugt acht dieser Fehler (showModalBottomSheet, CarouselController.animateToItem, showDatePicker, showDateRangePicker, showDialog, showAdaptiveDialog, showMenu, showTimePicker), und cupertino_ui 1.1.0 fügt zwei weitere hinzu (showCupertinoModalPopup, showCupertinoDialog). Die Variante Not a constant expression ist derselbe Fehler: Die Annotation an einer Instanzmethode wird vom Frontend nur anders gemeldet. Beachten Sie, dass flutter analyze in Ihrem Projekt nichts meldet, weil der Analyzer keine Fehler innerhalb von Abhängigkeiten anzeigt. Nur ein Compile-Schritt tut das.

Sie müssen nicht direkt von material_ui abhängen, um darauf zu stoßen. shimmer 4.0.0 hängt zum Beispiel von material_ui: ^1.0.1 ab, sodass flutter pub add shimmer unter Flutter 3.44 zwischen 2026-09-15 und der Rücknahme 1.3.0 transitiv hineingezogen hat. Genau so ist der Melder in flutter/flutter#192839 darauf gestoßen.

Warum Flutter 3.44 eine Annotation nicht sieht, die in seinem eigenen meta-Paket existiert

awaitNotRequired ist nicht neu. Es lebt seit 1.17.0 in package:meta, und Flutter 3.44.8 pinnt meta 1.18.0, das sie bereits enthält. Die Konstante liegt direkt in Ihrem Pub-Cache. Was 3.44 fehlt, ist der Re-Export.

material_ui und cupertino_ui importieren nie package:meta. Ihre Bibliotheksdateien importieren package:flutter/foundation.dart und verlassen sich auf das, was dieses aus meta re-exportiert. Unter Flutter 3.44 ist diese Liste abgeschlossen:

// packages/flutter/lib/foundation.dart, Flutter 3.44.8
export 'package:meta/meta.dart'
    show
        factory,
        immutable,
        internal,
        // ignore: experimental_member_use
        mustBeConst,
        mustCallSuper,
        nonVirtual,
        optionalTypeArgs,
        protected,
        required,
        visibleForOverriding,
        visibleForTesting;

flutter/flutter#181513 (“Add @awaitNotRequired annotation to flutter sdk”) hat awaitNotRequired am 2026-04-25 zu dieser show-Liste hinzugefügt. Der Change verpasste den 3.44-Branch und erschien in Flutter 3.47.0 am 2026-08-12. In jedem 3.44.x-Release (3.44.0 bis 3.44.9) ist der Bezeichner für Code, der nur foundation.dart importiert, schlicht nicht im Gültigkeitsbereich.

Die Pakete werden unterdessen gegen den Flutter-main-Channel entwickelt. flutter/packages#12622 und #12817 haben die Annotationen hinzugefügt, und material_ui 1.3.0 sowie cupertino_ui 1.1.0 erschienen am 2026-09-15 mit den Annotationen, aber mit demselben environment wie zuvor:

# material_ui 1.3.0 pubspec.yaml
environment:
  sdk: ^3.12.0
  flutter: ">=3.44.0"

Pub vertraut dieser Einschränkung, also wählte es unter Flutter 3.44 die Version 1.3.0 als neueste kompatible. Die Korrektur im Upstream bestand aus zwei Teilen: material_ui 1.4.0 und cupertino_ui 1.1.1 (beide 2026-09-21/22) hoben die Untergrenze auf flutter: ">=3.47.0" und sdk: ^3.13.0 an, und 1.3.0 sowie 1.1.0 wurden zurückgezogen. Das Issue wurde am 2026-09-21 geschlossen.

Minimales Reproduktionsbeispiel

Zurückgezogene Versionen lassen sich weiterhin über einen dependency_overrides-Pin erzwingen, was der einfachste Weg ist, den Build-Fehler gezielt nachzustellen:

# pubspec.yaml, Flutter 3.44.8 / Dart 3.12.2
name: repro
publish_to: 'none'
environment:
  sdk: ^3.12.0
dependencies:
  flutter:
    sdk: flutter
  material_ui: ^1.0.0
dependency_overrides:
  material_ui: 1.3.0
  cupertino_ui: 1.1.0
// lib/main.dart, Flutter 3.44.8, material_ui 1.3.0
import 'package:material_ui/material_ui.dart';

void main() => runApp(
  const MaterialApp(home: Scaffold(body: Center(child: Text('hi')))),
);

flutter pub get gelingt, flutter analyze meldet keine Fehler, und flutter build web scheitert mit der obigen Ausgabe. Ohne den Override lehnt flutter pub add material_ui:1.3.0 jetzt rundheraus ab mit Because repro depends on material_ui 1.3.0 which doesn't match any versions, version solving failed., da der Solver zurückgezogene Versionen verbirgt, sofern sie nicht gepinnt oder bereits gesperrt sind.

Warum die Rücknahme Ihr Projekt nicht repariert hat

Wenn Sie pub get ausgeführt haben, während 1.3.0 noch verfügbar war, steht in Ihrer pubspec.lock version: "1.3.0", und eine Rücknahme berührt keine Lockfiles. Die pub-Dokumentation stellt klar, dass eine gesperrte zurückgezogene Version weiter funktioniert. flutter pub outdated ist der schnellste Weg, um zu bestätigen, dass Sie in diesem Zustand sind:

Package Name              Current             Upgradable          Resolvable          Latest

direct dependencies:
material_ui               *1.3.0 (retracted)  *1.3.0 (retracted)  *1.3.0 (retracted)  1.5.0

transitive dependencies:
cupertino_ui              *1.1.0 (retracted)  *1.1.0 (retracted)  *1.1.0 (retracted)  1.1.1
...
material_ui
    Version 1.3.0 is retracted. See https://dart.dev/go/package-retraction
cupertino_ui
    Version 1.1.0 is retracted. See https://dart.dev/go/package-retraction

Sehen Sie sich die Spalten Upgradable und Resolvable an: Pub sagt selbst, dass es Sie nicht weiterbewegt. Dieselbe pub-Dokumentation empfiehlt dart pub upgrade <package>, um eine zurückgezogene Version zu verlassen, und unter Flutter 3.44 bewirkt das nichts:

$ flutter pub upgrade material_ui cupertino_ui
  cupertino_ui 1.1.0 (retracted, 1.1.1 available)
  material_ui 1.3.0 (retracted, 1.5.0 available)
No dependencies changed.

Der Grund liegt im Solver. In lib/src/solver/version_solver.dart gibt _getAllowedRetracted den Wert _lockFile.packages[package]?.version zurück, unabhängig davon, ob das Paket für das Upgrade entsperrt wurde. Während upgrade ist die gesperrte zurückgezogene Version also weiterhin ein zulässiger Kandidat. Jedes neuere Release (1.4.0, 1.5.0, 1.1.1) benötigt Flutter 3.47, daher ist die höchste Version, die der Solver unter 3.44 wählen kann, die zurückgezogene, die Sie bereits haben. Der Rat der Dokumentation funktioniert nur, wenn ein neueres kompatibles Release existiert, und unter 3.44 gibt es keines.

Fix 1: Bei Flutter 3.44 bleiben und auf material_ui 1.2.0 zurückgehen

Die Lockfile soll 1.3.0 und 1.1.0 nicht mehr erwähnen. Am saubersten geht das mit Downgrade und anschließendem Upgrade, sodass die zurückgezogene Version aus der Sperre fällt, bevor das Upgrade läuft:

# Flutter 3.44.8: escape the retracted versions
flutter pub downgrade material_ui cupertino_ui
flutter pub upgrade

Der erste Befehl setzt beide Pakete auf die niedrigsten Versionen, die Ihre Einschränkungen erlauben (material_ui 1.0.0 und cupertino_ui 0.0.2 mit ^1.0.0), was auch die zurückgezogenen Einträge aus pubspec.lock entfernt. Der zweite klettert zurück zu den neuesten nicht zurückgezogenen Versionen, die 3.44 akzeptiert:

> cupertino_ui 1.0.2 (was 0.0.2) (1.1.1 available)
> material_ui 1.2.0 (was 1.0.0) (1.5.0 available)

Danach gelingt flutter build web unter 3.44.8. Dasselbe Ergebnis (1.2.0 und 1.0.2) erhalten Sie, wenn Sie die Einträge material_ui und cupertino_ui von Hand aus pubspec.lock löschen und flutter pub get ausführen, und ebenso, wenn Sie die ganze Lockfile löschen, wobei dann allerdings auch alles andere in Ihrem Graphen neu aufgelöst wird. Lassen Sie cupertino_ui nicht aus: Es ist meist eine transitive Abhängigkeit, und wenn Sie nur material_ui nennen, bleibt 1.1.0 gesperrt und weiterhin defekt.

Committen Sie die neue pubspec.lock. Wenn Ihre CI flutter pub get --enforce-lockfile ausführt, installiert sie genau das, was die committete Lockfile vorgibt, sodass der Build dort so lange fehlschlägt, bis die neue Lockfile eingecheckt ist.

Fix 2: Auf Flutter 3.47 wechseln, was die Pakete jetzt erwarten

material_ui 1.4.0 und höher erfordern Flutter 3.47, und neue Korrekturen landen nur dort. Wenn Sie aktualisieren können, ist das die langfristige Antwort:

# Flutter 3.47.6 / Dart 3.13.5
flutter upgrade
flutter pub upgrade

Unter 3.47.6 funktioniert das Upgrade so, wie es die pub-Dokumentation beschreibt, weil nun neuere kompatible Versionen existieren:

> cupertino_ui 1.1.1 (was 1.1.0)
> material_ui 1.5.0 (was 1.3.0)

Streng genommen brauchen Sie das Paket-Upgrade nicht einmal: Das zurückgezogene 1.3.0 kompiliert unter Flutter 3.47.6 einwandfrei, weil foundation.dart die Annotation jetzt re-exportiert. Ich empfehle trotzdem flutter pub upgrade, damit die Lockfile nicht mehr auf ein zurückgezogenes Release zeigt, was flutter pub outdated sonst weiter markieren wird.

Der Wechsel auf 3.47 ist ein größerer Eingriff als das Paket-Update. Er bringt Dart 3.13 mit (das unter anderem final bei gewöhnlichen Parametern ablehnt) und macht Impeller auf dem Desktop zum Standard-Renderer. Behandeln Sie ihn daher als geplantes Upgrade und nicht als Hotfix.

Fix 3: Eine Einschränkung in pubspec.yaml beibehalten, damit das unter 3.44 nicht wiederkehrt

Wenn Sie noch eine Weile bei 3.44 bleiben, begrenzen Sie die Pakete explizit. Das dokumentiert die Entscheidung und verhindert, dass das pub upgrade eines Teamkollegen abdriftet, falls ein weiteres Release mit falschem environment erscheint:

# pubspec.yaml, Flutter 3.44.x
dependencies:
  material_ui: ">=1.0.0 <1.3.0"
  cupertino_ui: ">=1.0.0 <1.1.0"

Fügen Sie cupertino_ui auch dann hinzu, wenn Sie es nicht importieren. Als ich nur material_ui begrenzt und flutter pub get gegen die defekte Lockfile ausgeführt habe, setzte pub material_ui auf 1.2.0, ließ aber das transitive cupertino_ui bei der zurückgezogenen 1.1.0, weil nichts eine Änderung erzwang. Mit beiden Begrenzungen setzte dasselbe flutter pub get sie auf 1.2.0 und 1.0.2.

Dinge, die wie Lösungen aussehen, aber keine sind

Wenn Sie nach der Migration auf die eigenständigen Pakete Undefined name für einen anderen Flutter-Bezeichner erhalten, liegt die Ursache meist im selben Muster in anderer Richtung: Code, der gegen ein neueres Framework kompiliert wurde als das installierte. flutter --version und der environment-Block des Pakets, das im Fehlerpfad genannt wird, zeigen schnell, welche Seite voraus ist.

Verwandte Artikel

Quellen

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Zurück