Flutter 从外部上下文获取上下文值

问题描述 投票:0回答:2

我对 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,
    ));
  }
flutter dart
2个回答
0
投票

您可以使用导航键从任何地方访问当前上下文。您必须创建全局密钥并将其传递给材料应用程序。

//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());

0
投票

您的服务类在设计上应与区域设置无关,因此将

locale
作为输入,例如:

class I18nService {
  final String locale;
  
  I18nService(this.locale);
  
  String sayHello() {
    if (locale == 'en_CA') {
      return 'hello Canada';
    }
    return 'hello world';
  }
}

我还建议查看 provider 包,您可以使用

ProxyProvider
实例化您的服务并在其中传递区域设置。

© www.soinside.com 2019 - 2024. All rights reserved.