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'); 
    }