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

cre*_*not 1 dart flutter firebase-remote-config

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

方向变化

我知道OrientationBuilder,每当它检测到设备方向发生变化时,它将调用其生成器,例如在Android中将其视为配置更改,就像设备语言更改一样。

语言变更

有类似的东西LanguageBuilder吗?我自己找不到任何东西,在flutter.iopub上也找不到。我已经阅读了本教程并知道Locale,但是我没有看到Streamfor Locale

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

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

因此,我想问的是设备语言更改时如何刷新远程配置

Rém*_*let 5

没有没有BuilderLocale

相反,InheritedWidget您可以使用进行订阅Localizations.of

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

编辑

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

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

class MyData {
  String title;

  MyData({this.title});
}
Run Code Online (Sandbox Code Playgroud)

然后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;
  }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,只需将其传递给MaterialApp.localizationsDelegates(一定要添加flutter_localizationspubspec.yaml):

LocalizationsDelegate myLocale = MyLocale(MyData(title: "Foo"));
...


MaterialApp(
  localizationsDelegates: [
    myLocale,
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
);
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过替换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),
          ),
        ],
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 当您调用“Localization.of(context, type)”时,只要关联的语言环境发生更改,此方法就会重建“context” (2认同)