我有以下窗口小部件,该窗口小部件需要使用从DataClass
类提取的一些数据进行初始化:
class FooWidgetState extends State<FooWidget> {
List<String> _someUsefulData;
@override
void initState() {
super.initState();
_someUsefulData = DataClass.getUsefulData(context);
}
@override
Widget build(BuildContext context) {
return Column(
children: _someUsefulData.map(_buildUsefulWidgets).toList(),
);
}
}
DataClass
看起来像这样:
class DataClass {
static List<String> getUsefulData(BuildContext context) {
return [
BazLocalizations.of(context).usefulString1,
BazLocalizations.of(context).usefulString2,
];
}
}
和BazLocalizations
是用于检索本地化字符串的类。
问题在于,在运行上述代码时,会引发以下异常:
在FooWidgetState.initState()完成之前,调用了inheritFromWidgetOfExactType(_LocalizationsScope)或InheritedFromElement()。
我尝试过的事情:
遵循建议given here,我将通话包裹在initState
中,如下所示:
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
_someUsefulData = DataClass.getUsefulData(context);
});
}
但是,当我尝试在_someUsefulData
小部件中访问build
时,它始终是null
。
答案 0 :(得分:1)
由于您正在使用上下文获取该数据,因此必须在didChangeDependencies
方法中获取数据,该方法会在首次构建之前被调用。
如果您使用的是提供商,则可以查看以下链接:https://github.com/rrousselGit/provider#i-have-an-exception-when-obtaining-providers-inside-initstate-what-can-i-do
如果不是,则相同的概念适用于InheritedWidgets