我正在调用initial方法来使用initState从API加载数据。但它导致了一个错误。这里是错误:
Unhandled Exception: inheritFromWidgetOfExactType(_LocalizationsScope) or inheritFromElement() was called before _ScreenState.initState() completed.
When an inherited widget changes, for example if the value of Theme.of() changes, its dependent widgets are rebuilt. If the dependent widget's reference to the inherited widget is in a constructor or an initState() method, then the rebuilt dependent widget will not reflect the changes in the inherited widget.
我的代码是:
@override
void initState() {
super.initState();
this._getCategories();
}
void _getCategories() async {
AppRoutes.showLoader(context);
Map<String, dynamic> data = await apiPostCall(
apiName: API.addUser,
context: context,
parameterData: null,
showAlert: false,
);
if(data.isNotEmpty){
AppRoutes.dismissLoader(context);
print(data);
}else {
AppRoutes.dismissLoader(context);
}
}
6条答案
按热度按时间4xy9mtcn1#
您需要在
initState
完成后调用_getCategories
。此外,您可以使用addPostFrameCallback以不同的方式完成此任务。为了使此任务更容易,您可以创建一个mixin以添加到StatefulWidgets。
然后,你只需要将这个mixin插入到你的页面,就像这样:
hsvhsicv2#
使用didChangeDependencies方法,该方法在initState之后调用。
对于您的示例:
mrfwxfqh3#
Adding a frame callback可能比使用零持续时间的
Future.delayed
更好-它更明确和清晰地说明发生了什么,而这种情况正是帧回调的设计目的:k7fdbhmy4#
一种替代方案是将其放置在
PostFrameCallback
内部,其在initState
和Build
之间。9fkzdhlc5#
有很多方法可以解决这个问题,重写
initState
方法:SchedulerBinding
mixin:Future
类:Timer
类:hts6caw36#
我认为最好的解决方案是使用Widget构建的上下文。并在构建后将method _getCategories(context)粘贴到树的上下文中。因此,Widget树没有问题。