Start Debugging

修正: Flutter 3.44 で material_ui または cupertino_ui から出る Undefined name 'awaitNotRequired'

material_ui 1.3.0 と cupertino_ui 1.1.0 は、Flutter 3.44 がエクスポートしていないアノテーションを使っています。どちらも retract 済みですが、ロックファイルが残していることがあります。ダウングレードしてからアップグレードし、1.2.0 と 1.0.2 に着地させます。

pubspec.lock が material_ui 1.3.0 または cupertino_ui 1.1.0 (あるいはその両方) に固定されています。この 2 つのリリースは @awaitNotRequired を使っていますが、package:flutter/foundation.dart がこれをエクスポートするのは Flutter 3.47.0 以降です。どちらのバージョンも pub.dev ではすでに retract されていますが、pub は一度ロックした retract 済みバージョンを保持し続けるため、Flutter 3.44 では flutter pub upgrade でも抜け出せません。flutter pub downgrade material_ui cupertino_ui を実行してから flutter pub upgrade を実行するか (最終的に material_ui 1.2.0 と cupertino_ui 1.0.2 になります)、Flutter を 3.47 にアップグレードしてください。以下の内容はすべて、2026-10-02 に Flutter 3.44.8 (Dart 3.12.2) と Flutter 3.47.6 (Dart 3.13.5) で検証したものです。

エラーの実際の出方

アナライザーは何も報告せず、flutter pub get も成功し、最初の本格的なコンパイルで pub キャッシュ内部のコードが失敗します。以下は 3.44.8 での flutter build web の出力です。他のターゲットも同じソースに対して同じ Dart フロントエンドを実行するため、flutter run も同じ行で失敗します。

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 ではこのエラーが 8 件出ます (showModalBottomSheet、CarouselController.animateToItem、showDatePicker、showDateRangePicker、showDialog、showAdaptiveDialog、showMenu、showTimePicker)。cupertino_ui 1.1.0 ではさらに 2 件追加されます (showCupertinoModalPopup、showCupertinoDialog)。Not a constant expression は同じバグの別の現れ方で、インスタンスメソッド上のアノテーションがフロントエンドによって別の形で報告されたものです。なお、アナライザーは依存パッケージ内部のエラーを表示しないため、プロジェクトで flutter analyze を実行しても何も報告されません。検出できるのはコンパイル工程だけです。

この問題に遭遇するために material_ui を直接依存に入れている必要はありません。たとえば shimmer 4.0.0 は material_ui: ^1.0.1 に依存しているため、2026-09-15 から retract までの間に Flutter 3.44 で flutter pub add shimmer を実行すると、1.3.0 が推移的に入ってきました。flutter/flutter#192839 の報告者が遭遇したのもまさにこの経路です。

Flutter 3.44 が自身の meta パッケージにあるアノテーションを認識できない理由

awaitNotRequired は新しいものではありません。package:meta に 1.17.0 から存在しており、Flutter 3.44.8 が固定している meta 1.18.0 にもすでに含まれています。定数自体は pub キャッシュの中にあります。3.44 に欠けているのは再エクスポートです。

material_ui と cupertino_ui は package:meta をインポートしません。ライブラリファイルは package:flutter/foundation.dart をインポートし、それが meta から再エクスポートしているものに依存しています。Flutter 3.44 では、そのリストは次のように閉じています。

// 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”) は、2026-04-25 にこの show リストへ awaitNotRequired を追加しました。この変更は 3.44 ブランチには間に合わず、Flutter 3.47.0 (2026-08-12) で出荷されました。3.44.x のどのリリース (3.44.0 から 3.44.9) でも、foundation.dart だけをインポートしているコードからこの識別子はスコープ内にありません。

一方、パッケージ側は Flutter の main チャンネルに対して開発されています。flutter/packages#12622 と #12817 がアノテーションを追加し、material_ui 1.3.0 と cupertino_ui 1.1.0 は 2026-09-15 に、アノテーション付きで、しかし従来と同じ environment のまま公開されました。

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

pub はこの制約を信頼するため、Flutter 3.44 では 1.3.0 を互換性のある最新バージョンとして選択しました。上流での対応は二段構えでした。material_ui 1.4.0 と cupertino_ui 1.1.1 (どちらも 2026-09-21/22) が下限を flutter: ">=3.47.0" と sdk: ^3.13.0 に引き上げ、1.3.0 と 1.1.0 は retract されました。issue は 2026-09-21 にクローズされています。

最小の再現手順

retract 済みのバージョンも dependency_overrides で固定すれば強制できます。ビルド失敗をあえて再現する最も簡単な方法です。

# 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 は成功し、flutter analyze もエラーを報告せず、flutter build web が上記の出力で失敗します。オーバーライドなしで flutter pub add material_ui:1.3.0 を実行すると、現在は Because repro depends on material_ui 1.3.0 which doesn't match any versions, version solving failed. と拒否されます。ソルバーは、固定されているかすでにロックされている場合を除き、retract 済みバージョンを隠すためです。

retract してもプロジェクトが直らない理由

1.3.0 が公開されている間に pub get を実行していた場合、pubspec.lock には version: "1.3.0" と書かれており、retract はロックファイルには影響しません。pub のドキュメントには、ロックされた retract 済みバージョンは引き続き動作すると明記されています。この状態かどうかを最も手早く確認できるのは flutter pub outdated です。

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

Upgradable 列と Resolvable 列を見てください。pub 自身が、移動させないと言っています。同じ pub のドキュメントは retract 済みバージョンから抜けるために dart pub upgrade <package> を勧めていますが、Flutter 3.44 では何も起きません。

$ 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.

原因はソルバーにあります。lib/src/solver/version_solver.dart の _getAllowedRetracted は、そのパッケージがアップグレードのためにアンロックされているかどうかに関係なく、_lockFile.packages[package]?.version を返します。そのため upgrade の間も、ロックされた retract 済みバージョンは有効な候補のままです。それより新しいリリース (1.4.0、1.5.0、1.1.1) はすべて Flutter 3.47 を必要とするので、3.44 でソルバーが選べる最高バージョンは、すでに持っている retract 済みのものになります。ドキュメントの助言が通用するのは、新しい互換性のあるリリースが存在する場合だけで、3.44 にはそれがありません。

修正 1: Flutter 3.44 のまま material_ui 1.2.0 に戻す

ロックファイルから 1.3.0 と 1.1.0 の記述を消したい場合、最もきれいな方法はダウングレードしてからアップグレードすることです。アップグレードの実行前に、retract 済みバージョンがロックから外れます。

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

最初のコマンドは、両パッケージを制約が許す最も低いバージョンに移動します (^1.0.0 なら material_ui 1.0.0 と cupertino_ui 0.0.2)。これにより pubspec.lock から retract 済みのエントリも消えます。2 番目のコマンドで、3.44 が受け付ける retract されていない最新バージョンまで戻ります。

> 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)

その後は、3.44.8 での flutter build web が成功します。pubspec.lock から material_ui と cupertino_ui のエントリを手で削除して flutter pub get を実行しても同じ結果 (1.2.0 と 1.0.2) になります。ロックファイル全体を削除しても同じですが、その場合は依存グラフ内の他のパッケージもすべて再解決されます。cupertino_ui を省略しないでください。多くの場合これは推移的依存であり、material_ui だけを指定すると 1.1.0 がロックされたまま残り、壊れたままです。

新しい pubspec.lock をコミットしてください。CI で flutter pub get --enforce-lockfile を実行している場合は、コミット済みのロックファイルの内容どおりにインストールされるため、新しいロックファイルが反映されるまでビルドは失敗し続けます。

修正 2: パッケージが現在想定している Flutter 3.47 に移行する

material_ui 1.4.0 以降は Flutter 3.47 を必要とし、新しい修正もそこにしか入りません。アップグレードできるなら、これが長期的な答えです。

# Flutter 3.47.6 / Dart 3.13.5
flutter upgrade
flutter pub upgrade

3.47.6 では、新しい互換バージョンが存在するため、アップグレードは pub のドキュメントが説明するとおりに動作します。

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

厳密には、パッケージのアップグレードすら必要ありません。retract 済みの 1.3.0 でも Flutter 3.47.6 ではコンパイルできます。foundation.dart がアノテーションを再エクスポートするようになったためです。それでも flutter pub upgrade の実行をお勧めします。ロックファイルが retract 済みリリースを指したままだと、flutter pub outdated が警告し続けるからです。

3.47 への移行は、パッケージのバージョンを上げるだけよりも大きな変更です。Dart 3.13 が付いてきて (とりわけ、通常のパラメーターへの final を拒否します)、デスクトップでは Impeller がデフォルトのレンダラーになります。そのため、緊急の修正ではなく計画的なアップグレードとして扱ってください。

修正 3: pubspec.yaml に制約を残して 3.44 での再発を防ぐ

しばらく 3.44 に留まるなら、パッケージに明示的に上限を設けてください。判断が記録として残り、別のリリースが誤った environment で公開されても、チームメンバーの pub upgrade で意図せず移動するのを防げます。

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

cupertino_ui はインポートしていなくても追加してください。material_ui だけに上限を付け、壊れたロックファイルに対して flutter pub get を実行したところ、pub は material_ui を 1.2.0 に移動しましたが、推移的な cupertino_ui は retract 済みの 1.1.0 のまま残しました。変更を強制するものが何もなかったためです。両方に上限を付けた状態で同じ flutter pub get を実行すると、1.2.0 と 1.0.2 に移動しました。

修正のように見えて効果がないもの

スタンドアロンパッケージへの移行後に、別の Flutter 識別子で Undefined name が出る場合、原因は通常、方向が逆なだけの同じパターンです。つまり、インストールされているものより新しいフレームワークに対してコンパイルされたコードです。flutter --version と、エラーパスに出ているパッケージの environment ブロックを見れば、どちらが先行しているかがすぐにわかります。

関連記事

参考資料

Comments

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

< 戻る