Flutter 如何在不重新启动应用程序的情况下更改颤振应用程序语言?
在我的应用程序的设置页面中,我想添加一个控制应用程序语言的选项 我可以在启动应用程序之前设置语言,如下所示:Flutter 如何在不重新启动应用程序的情况下更改颤振应用程序语言?,flutter,Flutter,在我的应用程序的设置页面中,我想添加一个控制应用程序语言的选项 我可以在启动应用程序之前设置语言,如下所示: @覆盖 小部件构建(构建上下文){ 返回材料PP( //其他论点 locale:locale('ar'), ); } 但是,是否可以在不重新启动应用程序的情况下更改语言?将您的MaterialApp包装到一个StreamBuilder中,它将负责向您的应用程序提供区域设置值。它将使您能够在不重新启动应用程序的情况下动态更改它。这是一个使用实现流的示例: @override Wi
@覆盖
小部件构建(构建上下文){
返回材料PP(
//其他论点
locale:locale('ar'),
);
}
但是,是否可以在不重新启动应用程序的情况下更改语言?将您的
MaterialApp
包装到一个StreamBuilder
中,它将负责向您的应用程序提供区域设置
值。它将使您能够在不重新启动应用程序的情况下动态更改它。这是一个使用实现流的示例:
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: setLocale,
initialData: Locale('ar',''),
builder: (context, localeSnapshot) {
return MaterialApp(
// other arguments
locale: localeSnapshot.data,
);
}
);
}
Stream<Locale> setLocale(int choice) {
var localeSubject = BehaviorSubject<Locale>() ;
choice == 0 ? localeSubject.sink.add( Locale('ar','') ) : localeSubject.sink.add( Locale('en','') ) ;
return localeSubject.stream.distinct() ;
}
@覆盖
小部件构建(构建上下文){
返回流生成器(
流:setLocale,
initialData:Locale('ar',''),
生成器:(上下文,localeSnapshot){
返回材料PP(
//其他论点
locale:localeSnapshot.data,
);
}
);
}
流setLocale(int选项){
var localeSubject=BehaviorSubject();
choice==0?localeSubject.sink.add(Locale('ar',''):localeSubject.sink.add(Locale('en','');
返回localeSubject.stream.distinct();
}
以上演示只是实现你想要的一种基本方式,但是为了在你的应用程序中正确地实现流,你应该考虑使用App EngultCube,这将通过减少不必要的构建数量显著提高应用程序的质量。
您可以使用ChangeNotifierProvider
和Consumer
小部件包装MaterialApp
小部件,并从模型中控制语言
@override
Widget build(BuildContext context) {
return ChangeNotifierProvider(
builder: (context) => MainModel(context: context),
child: Consumer<MainModel>(builder: (context, mainModel, child) {
return MaterialApp(
locale: Locale(mainModel.preferredLanguageCode),
....
@覆盖
小部件构建(构建上下文){
返回ChangeNotifierProvider(
生成器:(上下文)=>MainModel(上下文:上下文),
子项:使用者(生成器:(上下文、主模型、子项){
返回材料PP(
语言环境:语言环境(mainModel.preferredLanguageCode),
....
在main模型上
,只需将preferredLanguageCode
变量更改为所需的任何值('en'、'ar'、'es'等)。更改语言后,不要忘记调用NotifyListeners()
这和另一个答案只有一个问题:任何context
上面的MaterialApp
都无法使用本地化获取设备语言(例如,当应用程序第一次启动时)。localeOf(context)
。此方法需要context
下面的MaterialApp
为了解决这个问题,我使用了无需上下文的设备语言
一旦应用程序启动,您可以按照您希望的任何方式更改语言,以使此方法发挥作用。一旦用户更改了首选语言,我也会使用SharedReferences
来存储该语言。如果您想更改应用程序语言而不重新启动应用程序,也不需要任何插件,您可以按照以下步骤操作:
在应用程序的主文件中,将默认的MyHomePage
更改为StatefullWidget
,在StatefullWedget
中,例如MyHomePage
创建一个static
方法setLocal
,如下所示
class 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();
}
现在,在应用程序的页面中,您可以通过调用setLocal
方法更改语言,并传递一个新的Locale
,如下所示:
Locale newLocale = Locale('ps', 'AFG');
MyHomePage.setLocale(context, newLocale);
请记住,您需要创建一个本地化委托
是指向书面教程和演示应用程序的链接
这个软件包更容易使用
用于更改语言,例如:
onTap: (){
EasyLocalization.of(context).locale = Locale('en', 'US');
}
通过这段视频,我学会了如何使用这个软件包:Intrest,我记得在Android上,在不失去状态的情况下更改语言非常麻烦。但这是可以做到的。但是当我们从应用程序的其他部分调用setLocale时,streamBuilder不会得到重建非常有用的答案。简单的颤振逻辑。非常有用!谢谢你这应该是被接受的答案回答。如果我重新启动应用程序,该语言将消失。有没有办法用firestore实现它?谢谢,干净!
onTap: (){
EasyLocalization.of(context).locale = Locale('en', 'US');
}