如何在不重新启动应用程序的情况下更改Flutter应用程序语言?

时间:2019-04-28 11:40:27

标签: flutter

在我的应用程序的设置页面中,我想添加一个控制应用程序语言的选项。

我可以在启动应用之前像这样设置语言:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // other arguments
      locale: Locale('ar'),
    );
  }

但是可以在不重新启动应用程序的情况下更改语言吗?

4 个答案:

答案 0 :(得分:1)

将您的MaterialApp包裹到StreamBuilder中,这将负责为您的应用程序提供Locale值。而且它将使您能够动态更改它,而无需重新启动应用程序。我使用rxdart package来实现流:

  @override
  Widget build(BuildContext context) {
    return StreamBuider(
      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() ;

  }

以上演示只是实现所需目标的基本方法,但是要在应用中正确实现流,您应考虑使用应用范围的BloC,这将通过降低应用范围来显着提高应用质量不必要的构建数量。

答案 1 :(得分:0)

您可以将MaterialApp小部件包装到ChangeNotifierProviderConsumer小部件中,并从模​​型中控制语言。

@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),
          ....

MainModel上,您要做的就是将preferredLanguageCode变量更改为所需的任何值(“ en”,“ ar”,“ es”等)。更改语言后,别忘了致电NotifyListeners()

此答案和另一个答案只有一个问题:context以上的任何MaterialApp都无法使用{{1}获取设备语言(例如,首次启动应用程序时) }。此方法需要Localizations.localeOf(context)波纹管context

为解决此问题,我使用this plugin来获取设备语言,而无需使用MaterialApp

应用启动后,您可以根据需要更改此语言的任何方式。用户更改语言后,我还使用context存储首选语言。

答案 2 :(得分:0)

如果您想在不重新启动应用程序且没有任何插件的情况下更改应用程序语言,则可以按照以下步骤操作:

  1. 在应用程序的主文件中,例如在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(); } 是您的_MyHomePageState小部件的state

  1. 在您的MyHomePage中创建一个state方法static

    changeLanguage
  2. 现在,您可以在应用程序页面中通过调用 class _MyHomePageState extends State<MyHomePage> { 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, ); } } 方法来更改语言,并按如下所示传递新的setLocal

    Locale
    1. 请记住,您需要创建一个Locale newLocale = Locale('ps', 'AFG'); MyHomePage.setLocale(context, newLocale);

    2. Here是演示应用程序的链接

答案 3 :(得分:0)

使用easy_localization软件包更容易。

例如,要更改语言:

onTap: (){
 EasyLocalization.of(context).locale = Locale('en', 'US'); 
}

我通过以下视频了解了如何使用此软件包:Youtube Video Link