Saltar al contenido principal

TextField requiere un widget MaterialLocalizations

TextField ahora lanza un error de aserción (assert error) si no hay un widget MaterialLocalizations en el árbol de widgets.

Resumen

#

Las instancias de TextField deben tener un MaterialLocalizations presente en el árbol de widgets. Intentar instanciar un TextField sin las localizaciones adecuadas resulta en una aserción como la siguiente:

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

Contexto

#

Si el TextField desciende de un MaterialApp, el DefaultMaterialLocalizations ya está instanciado y no requerirá ningún cambio en tu código existente.

Si el TextField no desciende de MaterialApp, puedes usar un widget Localizations para proporcionar tus propias localizaciones.

Guía de migración

#

Si ves un error de aserción, asegúrate de que la información de configuración regional esté disponible para el TextField, ya sea a través de un MaterialApp ancestro (que proporciona automáticamente Localizations), o creando tu propio widget Localizations.

Código antes de la migración:

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(),
        ),
      ),
    );
  }
}

Código después de la migración (Proporcionando localizaciones usando 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(),
      ),
    );
  }
}

Código después de la migración (Proporcionando localizaciones a través del widget 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(),
          ),
        ),
      ),
    );
  }
}

Timeline

#

Llegó en la versión: 1.20.0-1.0.pre
En la versión estable: 1.20

Referencias

#

Documentación de la API:

PR relevante: