Te sugerimos que pruebes esta resolución en un entorno controlado antes de pasarlo a producción, saludos.
Solución:
envuelve tu MaterialApp
en un StreamBuilder
que se encargará de proporcionar la Locale
valor a su aplicación. Y le permitirá cambiarlo dinámicamente sin reiniciar su aplicación. Este es un ejemplo que usa el paquete rxdart para implementar la transmisión:
@override
Widget build(BuildContext context)
return StreamBuilder(
stream: setLocale,
initialData: Locale('ar',''),
builder: (context, localeSnapshot)
return MaterialApp(
// other arguments
locale: localeSnapshot.data,
);
);
Stream setLocale(int choice)
var localeSubject = BehaviorSubject() ;
choice == 0 ? localeSubject.sink.add( Locale('ar','') ) : localeSubject.sink.add( Locale('en','') ) ;
return localeSubject.stream.distinct() ;
La demostración anterior es solo una forma básica de cómo lograr lo que desea, pero para una implementación adecuada de las secuencias en su aplicación, debe considerar el uso de BloC en toda la aplicación, lo que mejorará significativamente la calidad de su aplicación al reducir la cantidad de construcciones innecesarias.
Si desea cambiar el idioma de la aplicación sin reiniciar la aplicación y también sin ningún complemento, puede seguir los pasos a continuación:
-
En el archivo principal de la aplicación, cambie el valor predeterminado
MyHomePage
a unStatefullWidget
enStatefullWedget
por ejemploMyHomePage
crear unstatic
métodosetLocal
de la siguiente maneraclass MyHomePage extends StatefulWidget MyHomePage(Key key) : super(key: key); static void setLocale(BuildContext context, Locale newLocale) async _MyHomePageState state = context.findAncestorStateOfType<_MyHomePageState>(); state.changeLanguage(newLocale); @override _MyHomePageState createState() => _MyHomePageState();
donde _MyHomePageState
es el state
de tu MyHomePage
artilugio
-
En tus
state
crear unstatic
métodochangeLanguage
:class _MyHomePageState extends State
Locale _locale; changeLanguage(Locale locale) setState(() _locale = locale; ); @override Widget build(BuildContext context) return MaterialApp( debugShowCheckedModeBanner: false, title: 'Afghanistan', theme: ThemeData(primaryColor: Colors.blue[800]), supportedLocales: [ Locale('fa', 'IR'), Locale('en', 'US'), Locale('ps', 'AFG'), ], locale: _locale, localizationsDelegates: [ AppLocalizationsDelegate(), GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate ], localeResolutionCallback: (locale, supportedLocales) for (var supportedLocale in supportedLocales) if (supportedLocale.languageCode == locale.languageCode && supportedLocale.countryCode == locale.countryCode) return supportedLocale; return supportedLocales.first; , initialRoute: splashRoute, onGenerateRoute: Router.generatedRoute, ); -
Ahora desde las páginas de su aplicación puede cambiar el idioma llamando al
setLocal
método y pasar un nuevoLocale
de la siguiente manera:Locale newLocale = Locale('ps', 'AFG'); MyHomePage.setLocale(context, newLocale);
-
Recuerde que debe crear un
LocalizationDelegate
, -
Aquí está el enlace al tutorial escrito y la aplicación de demostración
Es más fácil usar el paquete easy_localization.
Para cambiar el idioma, por ejemplo:
onTap: ()
EasyLocalization.of(context).locale = Locale('en', 'US');
Aprendí a usar este paquete con este video: Youtube Video Link
Comentarios y calificaciones
Si te mola el proyecto, tienes la opción de dejar un ensayo acerca de qué te ha impresionado de esta división.