我遇到一个问题,在这里本地化工作正常,但是需要重新启动以更改传播。
我知道OrientationBuilder
,只要它检测到设备的 orientation 发生变化,就会调用它的构建器。就像设备语言的更改一样, Android 将被视为配置更改。
是否有类似 LanguageBuilder
的内容?我找不到自己的东西,也找不到 flutter.io 或 pub 上的东西。我已阅读this tutorial并了解Locale
,但没有看到Stream
的{{1}}。
我的问题是,在 iOS 和 Android 本机中更改语言确实很顺利。它会自动处理并与Firebase Remote Config之类的服务完美集成。
我真的很想知道是否有某种方法可以让我刷新本地化。
所以我要问的是,当设备语言更改时,如何刷新 Remote Config 。
答案 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
检测到设备语言更改。
最简单的方法是将其与State
(StatefulWidget
)中的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。