Flutter中的设备语言更改

时间:2018-06-21 23:12:00

标签: dart flutter firebase-remote-config

我遇到一个问题,在这里本地化工作正常,但是需要重新启动以更改传播

方向改变

我知道OrientationBuilder,只要它检测到设备的 orientation 发生变化,就会调用它的构建器。就像设备语言的更改一样, Android 将被视为配置更改。

语言更改

是否有类似 LanguageBuilder 的内容?我找不到自己的东西,也找不到 flutter.io pub 上的东西。我已阅读this tutorial并了解Locale,但没有看到Stream的{​​{1}}。

我的问题是,在 iOS Android 本机中更改语言确实很顺利。它会自动处理并与Firebase Remote Config之类的服务完美集成。

我真的很想知道是否有某种方法可以让我刷新本地化。

问题

所以我要问的是,当设备语言更改时,如何刷新 Remote Config

3 个答案:

答案 0 :(得分:5)

没有Builder的{​​{1}}。

相反,您可以使用Locale来订阅InheritedWidget

由于它是Localizations.of,因此所有调用InheritedWidget的窗口小部件都会在区域设置更改时自动刷新。

编辑

有关如何使用Flutter Locale系统实时重新加载文本的示例:

让我们假设您拥有以下包含翻译的课程:

Localizations.of

然后您将拥有一个包含此类数据的class MyData { String title; MyData({this.title}); } 。愚蠢的实现如下:

LocalizationsDelegate

要使用它,只需将其传递到class MyLocale extends LocalizationsDelegate<MyData> { MyData data; MyLocale(this.data); @override bool isSupported(Locale locale) { return true; } @override Future<MyData> load(Locale locale) async { return data; } @override bool shouldReload(MyLocale old) { return old.data != data; } } (确保将MaterialApp.localizationsDelegates添加到您的flutter_localizations):

pubspec.yaml

然后您可以通过将LocalizationsDelegate myLocale = MyLocale(MyData(title: "Foo")); ... MaterialApp( localizationsDelegates: [ myLocale, GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, ], ); 替换为新的myLocale实例来自由地实时重新加载翻译。

这是点击计数器应用的完整示例。但是当前计数存储在MyLocale内的位置(因为为什么不呢?)

Locale

答案 1 :(得分:1)

可以使用WidgetsBindingObserver检测到

设备语言更改

最简单的方法是将其与StateStatefulWidget)中的with WidgetsBindingObserver一起使用:

class _MyWidgetState extends State<MyWidget> with WidgetsBindingObserver {
  @override
  void didChangeLocales(List<Locale> locale) {
    // The device language was changed when this is called.
  }

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }
  ...
}

这意味着您现在可以在RemoteConfig重新加载您的didChangeLocales

@override
void didChangeLocales(List<Locale> locale) {
  _updateRemoteConfig();
}

Future<void> _updateRemoteConfig() async {
  final remoteConfig = await RemoteConfig.instance;
  await remoteConfig.activateFetched(); // This will apply the new locale.
}

答案 2 :(得分:0)

显然,当前无法解决我的远程配置问题。
我已经创建了an issue on GitHub

针对与我的问题无关的答案,并说明了如何使用flutter_localizations来获得反应性的本地化内容refer to Rémi's answer