如何在 Flutter 中以编程方式更改应用程序的语言?

Zub*_*eru 10 android localization dart flutter

目前,我正在使用它flutter_localizations来翻译应用程序中的字符串。它工作得很好,但需要能够通过按按钮或从下拉列表中选择语言来从应用程序的设置切换本地化。对于此应用程序,使用BLoC设计模式。

您能否建议解决此问题的任何潜在解决方案?提前致谢 :)

Bre*_*oro 7

对于未来的读者,您可以通过以下方式实现这一目标:

由小部件内函数返回的结果Locale定义。localeResolutionCallbackMaterialApp

就我而言,我将 a 传递final Locale defaultValue;给我的应用程序根目录,即树中的第一个小部件(在 中声明runApp())。

此时,我只需进行此验证:

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

import 'package:intl/intl.dart';

import '../../localization.dart';
import '../views/home_view.dart';

class App extends StatelessWidget {
  App({Key key, this.defaultLanguage}) : super(key: key);
  final Locale defaultLanguage;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeView(),
      localizationsDelegates: [
        AppLocalization.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', null),
        const Locale('pl', null),
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        if (defaultLanguage != null) {
          Intl.defaultLocale = defaultLanguage.toLanguageTag();
          return defaultLanguage;
        }
        if (locale == null) {
          Intl.defaultLocale = supportedLocales.first.toLanguageTag();
          return supportedLocales.first;
        }
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode) {
            Intl.defaultLocale = supportedLocale.toLanguageTag();
            return supportedLocale;
          }
        }
        Intl.defaultLocale = supportedLocales.first.toLanguageTag();
        return supportedLocales.first;
      },
    );
  }
}

Run Code Online (Sandbox Code Playgroud)

如果defaultLanguage由上面的块传递,则在应用程序中使用它,否则它会执行标准验证以从设备获取区域设置。

请记住,您可能需要通过验证变量是否defaultLanguage属于受支持的区域设置来保护检查。就我而言,这已得到处理,所以这就是我不打扰的原因。