【问题标题】:Flutter: Failing to combine localisation with Provider packageFlutter:未能将本地化与 Provider 包结合起来
【发布时间】:2019-11-28 12:03:04
【问题描述】:

我正在尝试使用本地化,以便可以在我自己的 Flutter 插件中使用它。为此,我使用了一个名为CoreLocalisation 的抽象基类,它由我的具体AppLocalisation 类实现。然后我正在使用

List<SingleChildCloneableWidget> uiConsumableProviders = <SingleChildCloneableWidget>[
  ...
  Provider<CoreLocalisation>(
    create: (context) => AppLocalisation.of(context)
  )
];

我从ContentPage 拨打MultiProvider

@override Widget build(BuildContext context) {
  //final localisation = AppLocalisation.of(context);
  return MultiProvider(
    providers: uiConsumableProviders,
    child: ...
  );
}

让我感到困惑的是,注释掉的对 AppLocalisation.of(context) 的调用运行良好,但在 MultiProvider 中的调用会引发以下异常:

FlutterError (inheritFromWidgetOfExactType(_LocalizationsScope) 或 inheritFromElement() 被调用 在 BuilderStateDelegate.initDelegate() 完成之前。

据我了解,子上下文应该可以访问父上下文可用的所有元素。我错过了一些基本的东西吗?

【问题讨论】:

  • 错误并不是说树中没有这样的元素。相反,它是说你在错误的时间调用它。

标签: flutter dart


【解决方案1】:

您不能在initState 内同步调用Localizations.of(它调用inheritFromWidgetOfExactType),因为此时小部件树仍在构建中,您无法访问继承的小部件。您可以使用异步回调调用它:

Timer.run(() {
  AppLocalizations.of(this.context);
});

或来自帧后回调:

WidgetsBinding.instance.addPostFrameCallback((_) {
  AppLocalizations.of(this.context);
});

【讨论】:

    【解决方案2】:

    我没有明确解决问题,但我设置了一个解决方法。首先,我创建了一个提供者,其工作只是将上下文转换为CoreLocalisation 的具体实例。它在插件中使用了这个类:

    class CoreLocalisationProvider {
      final CoreLocalisation Function(BuildContext) of;
    
      CoreLocalisationProvider(this.of);
    }
    

    那么消费应用中的提供者看起来像这样:

    Provider<CoreLocalisationProvider>.value(value: CoreLocalisationProvider((context) => AppLocalisation.of(context)))
    

    我可以将以下语法糖添加到CoreLocalisation

    static CoreLocalisation of(BuildContext context) => Provider.of<CoreLocalisationProvider>(context).of(context);
    

    诚然,这看起来很笨拙,但它允许我在整个代码库中使用熟悉的语法 CoreLocalisation.of(context),就好像 CoreLocalisation 是一个普通或花园的具体本地化类。

    【讨论】:

      猜你喜欢
      • 2022-11-14
      • 2021-01-19
      • 2020-12-17
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      相关资源
      最近更新 更多