我对 Flutter 很陌生,所以我不确定我的想法是否有意义。我目前正在使用一个名为 EasyLocalization 的包来本地化我的应用程序。这样做时,我试图引用我的应用程序的当前区域设置,该区域设置是由 EasyLocalization 在完全独立于小部件的服务类中设置的,但该包提供的唯一方法是引用上下文
在他们的示例中,以下代码有效
print(context.locale.toString());
但是,由于我想要不使用小部件的“服务”类中的值,所以我根本无法调用任何上下文。因此,像这样的代码可以在我的小部件上运行,但不能在独立的服务类中运行,因为那里不存在上下文
var currentLocale = EasyLocalization.of(context)?.locale ?? 'en';
我还尝试了一些其他代码来获取本地化,但结果与我的应用程序同步到的实际本地化不同。例如,当我的应用程序在 EasyLocalization 中运行“zh”时,其他方法(例如下面的方法)仅返回“en-US”
print(Intl().locale);
print(Intl.getCurrentLocale());
我让它部分工作的一种方法是在我的小部件中创建一个函数,该函数在单击时设置全局值,然后引用该值,但感觉“hacky”并且不足以满足我获取数据的用例在应用程序启动时加载,然后使用上下文区域设置通过翻译函数传递。大多数其他搜索结果也只显示导航和小吃栏的信息,这似乎对我的用例没有帮助,所以我目前没有想法,并向 SO 寻求帮助。
下面是我的 MaterialApp() 如果有帮助的话
Widget build(BuildContext context) {
return ProviderScope(
child: MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
debugShowCheckedModeBanner: false,
// Todo: Implement dark mode color theme
theme: lightTheme,
onGenerateRoute: AppRouter.generateRoutes,
));
}
您可以使用导航键从任何地方访问当前上下文。您必须创建全局密钥并将其传递给材料应用程序。
//create key
final navigatorKey = new GlobalKey<NavigatorState>();
//pass it to material app
Widget build(BuildContext context) {
return ProviderScope(
child: MaterialApp(
navigatorKey: navigatorKey, //key
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
debugShowCheckedModeBanner: false,
// Todo: Implement dark mode color theme
theme: lightTheme,
onGenerateRoute: AppRouter.generateRoutes,
));
}
//access context
print(navigatorKey.currentContext.locale.toString());
您的服务类在设计上应与区域设置无关,因此将
locale
作为输入,例如:
class I18nService {
final String locale;
I18nService(this.locale);
String sayHello() {
if (locale == 'en_CA') {
return 'hello Canada';
}
return 'hello world';
}
}
我还建议查看 provider 包,您可以使用
ProxyProvider
实例化您的服务并在其中传递区域设置。