cre*_*not 1 dart flutter firebase-remote-config
我遇到一个问题,在这里本地化工作正常,但是需要重新启动应用程序才能传播更改。
我知道OrientationBuilder
,每当它检测到设备方向发生变化时,它将调用其生成器,例如在Android中将其视为配置更改,就像设备语言更改一样。
有类似的东西LanguageBuilder
吗?我自己找不到任何东西,在flutter.io或pub上也找不到。我已经阅读了本教程并知道Locale
,但是我没有看到Stream
for Locale
。
我的问题是,在iOS和Android本机中更改语言确实很顺利。它会自动处理,并与Firebase Remote Config之类的服务完美集成。
我真的很想知道是否有某种方法可以让我刷新本地化。
因此,我想问的是当设备语言更改时如何刷新远程配置。
没有没有Builder
为Locale
。
相反,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_localizations
到pubspec.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)
归档时间: |
|
查看次数: |
2275 次 |
最近记录: |