TextField 需要 MaterialLocalizations 元件
如果元件樹中沒有 MaterialLocalizations 元件, TextField 現在會拋出 assert 錯誤。
摘要
#
TextField 的實例必須在元件樹中
有 MaterialLocalizations 存在。
如果嘗試在沒有正確在地化設定的情況下建立 TextField,
將會出現如下的 assertion(斷言)錯誤:
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 是 MaterialApp 的子孫,
則 DefaultMaterialLocalizations 已經被實例化,
不需要對您現有的程式碼做任何更動。
如果 TextField 不是 MaterialApp 的子孫,
您可以使用 Localizations 元件(Widget)
來提供您自訂的在地化內容。
遷移指南
#
如果您遇到 assertion error(斷言錯誤),請確保
TextField 可以取得 locale(語系)資訊,
這可以透過上層的 MaterialApp
(會自動提供 Localizations),
或是自行建立 Localizations 元件(Widget)來達成。
遷移前的程式碼:
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 元件(Widget)提供在地化):
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 文件:
TextField-
Localizations -
MaterialLocalizations -
DefaultMaterialLocalizations -
MaterialApp - Internationalizing Flutter apps
相關 PR:
Unless stated otherwise, the documentation on this site reflects Flutter 3.44.0. Page last updated on 2026-06-14. View source or report an issue.