我正在尝试使用本地化,以便可以在我自己的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()完成之前。
据我所知,子上下文应该可以访问父上下文可用的所有元素。我缺少基本的东西吗?
答案 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
是常见的或具体的本地化类。