<

TextField にはマテリアル ローカリゼーション ウィジェットが必要です

まとめ

のインスタンスTextFieldを持っている必要がありますMaterialLocalizationsウィジェットツリーに存在します。 をインスタンス化しようとしていますTextField適切なローカリゼーションがないと 結果は次のようなアサーションになります。

No MaterialLocalizations found.
TextField widgets require MaterialLocalizations to be provided by a Localizations widget ancestor.
The material library uses Localizations to generate messages, labels, and abbreviations.
To introduce a MaterialLocalizations, either use a MaterialApp at the root of your application to
include them automatically, or add a Localization widget with a MaterialLocalizations delegate.
The specific widget that could not find a MaterialLocalizations ancestor was:
  TextField

コンテクスト

もしTextFieldから派生しますMaterialAppDefaultMaterialLocalizationsすでにインスタンス化されています 既存のコードを変更する必要はありません。

もしTextFieldから降りていないMaterialApp、 を使用できますLocalizationsウィジェットへ 独自のローカリゼーションを提供します。

移行ガイド

アサーション エラーが表示された場合は、次のことを確認してください。 ロケール情報は、TextField、 先祖を通してMaterialApp(自動的に提供されますLocalizations)、 また 自分で作成することでLocalizationsウィジェット。

移行前のコード:

import 'package:flutter/material.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MediaQuery(
      data: const MediaQueryData(),
      child: Directionality(
        textDirection: TextDirection.ltr,
        child: Material(
          child: TextField(),
        ),
      ),
    );
  }
}

移行後のコード (MaterialApp):

import 'package:flutter/material.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Material(
        child: TextField(),
      ),
    );
  }
}

移行後のコード (Localizationsウィジェット):

import 'package:flutter/material.dart';

void main() => runApp(Foo());

class Foo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Localizations(
      locale: const Locale('en', 'US'),
      delegates: const <LocalizationsDelegate<dynamic>>[
        DefaultWidgetsLocalizations.delegate,
        DefaultMaterialLocalizations.delegate,
      ],
      child: MediaQuery(
        data: const MediaQueryData(),
        child: Directionality(
          textDirection: TextDirection.ltr,
          child: Material(
            child: TextField(),
          ),
        ),
      ),
    );
  }
}

タイムライン

リリースされたバージョン: 1.20.0-1.0.pre
安定版リリース: 1.20

参考文献

API ドキュメント:

関連する PR:

  • PR 58831: TextField で debugCheckHasmaterialLocalizations をアサートする
d8a14​​1eb-c5a2-40b3-8ea4-f7410d83098a