跳至主要内容

TextField 需要一个 MaterialLocalizations 组件

摘要

#

TextField 的实例必须在 widget 树中包含一个 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 是从 MaterialApp 派生的,则 DefaultMaterialLocalizations 已经实例化,不需要对现有代码进行任何更改。

如果 TextField 不是从 MaterialApp 派生的,则可以使用 Localizations 组件来提供您自己的本地化。

迁移指南

#

如果看到断言错误,请确保区域信息可用于 TextField,可以通过祖先 MaterialApp(自动提供 Localizations)或通过创建自己的 Localizations 组件来实现。

迁移前的代码

dart
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 提供本地化)

dart
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 组件提供本地化)

dart
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