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:
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):
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):
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:
TextField-
Localizations -
MaterialLocalizations -
DefaultMaterialLocalizations -
MaterialApp - Internacionalizar aplicaciones de Flutter
PR relevante:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.