Flutter:无法将本地化与提供程序包结合在一起

时间:2019-11-28 12:03:04

标签: flutter dart

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

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

我正在从MultiProvider呼叫ContentPage

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

让我感到困惑的是,对AppLocalisation.of(context)的注释调用非常有效,但是在MultiProvider中的调用引发了以下异常:

  

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

据我所知,子上下文应该可以访问父上下文可用的所有元素。我缺少基本的东西吗?

2 个答案:

答案 0 :(得分:1)

您无法在Localizations.of内同步调用inheritFromWidgetOfExactType(它调用initState),因为此时仍在构建窗口小部件树,并且您无法访问继承的窗口小部件。您可以使用异步回调对其进行调用:

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

或来自帧后回调:

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

答案 1 :(得分:0)

我没有明确解决问题,但我设置了解决方法。首先,我创建了一个提供程序,其工作只是将上下文转换为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是常见的或具体的本地化类。