dart - Flutter 中的远程配置设备语言更改

标签 dart flutter firebase-remote-config

我遇到了一个问题,本地化工作正常,但应用程序需要重新启动才能使更改传播

方向变化

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

语言变化

有没有像 LanguageBuilder 这样的东西?我自己找不到任何东西, flutter.io 上也找不到。 也不在 pub 。我读过this tutorial并了解 Locale,但我没有看到 LocaleStream

我的问题是在 iOSAndroid native 中更改语言真的很顺利。它会自动处理并与 Firebase Remote Config 等服务完美集成.

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

问题

所以我想问一下如何在设备语言更改时刷新我的远程配置

最佳答案

不,Locale 没有Builder

相反,有一个 InheritedWidget,您可以使用 Localizations.of 订阅它。

因为它是一个 InheritedWidget,所以所有调用 Localizations.of 的小部件都会在语言环境更改时自动刷新。

编辑:

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

假设您有以下包含翻译的类:

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 中(为什么不呢?)

import 'dart:async';

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

class MyCount {
  String count;

  MyCount({this.count});
}

class MyCountLocale extends LocalizationsDelegate<MyCount> {
  MyCount data;

  MyCountLocale(this.data);

  @override
  bool isSupported(Locale locale) {
    return true;
  }

  @override
  Future<MyCount> load(Locale locale) async {
    return data;
  }

  @override
  bool shouldReload(MyCountLocale old) {
    return old.data != data;
  }
}

Future<void> main() async {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  ValueNotifier<int> count = ValueNotifier<int>(0);
  LocalizationsDelegate myLocale;

  @override
  void initState() {
    count.addListener(() {
      setState(() {
        myLocale = MyCountLocale(MyCount(count: count.value.toString()));
      });
    });
    myLocale = MyCountLocale(MyCount(count: count.value.toString()));

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        myLocale,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      home: MyHomePage(count: count),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final ValueNotifier<int> count;

  MyHomePage({this.count});

  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      primary: true,
      appBar: AppBar(),
      body: Column(
        children: <Widget>[
          FloatingActionButton(
            onPressed: () => widget.count.value++,
            child: Icon(Icons.plus_one),
          ),
          ListTile(
            title: Text(Localizations.of<MyCount>(context, MyCount).count),
          ),
        ],
      ),
    );
  }
}

关于dart - Flutter 中的远程配置设备语言更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50978624/

相关文章:

routes - Flutter 重定向到 initState 上的页面

unit-testing - Flutter Mockito - 模拟抛出异常

html - 为什么YouTube加载速度如此之快,每次移动进度时,我都会尝试使用flutter代码多次,

ios - 为什么 Firebase 远程配置不更新值?

ios - Firebase Remote Config 推送多长时间?

dart - 引发了另一个异常:找不到 Material 小部件

flutter - 如何在单行小部件 flutter 上左、中、右对齐小部件

map - 如何从映射中将键和值导入变量?

Flutter - 如何测试本地化的小部件?

Firebase 远程配置, "AND condition",用户处于随机百分位数