我正在用MVC+S设计开发Flutter应用程序。我也使用了带有Notifylistener的提供程序,但是我经常得到消息setState() or markNeedsBuild() called during build.使用提供程序和Notfylistener来避免此问题的最佳做法是什么?我的代码如下所示:第一个
setState() or markNeedsBuild() called during build.
ovfsdjhp1#
您需要等待构建完成:
@override void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((timeStamp) async { locator<TestController>().FunctionA(); locator<TestController>().FunctionB(); }); }
velaa5lx2#
您得到异常的原因是您在尝试构建小部件时更新了状态。避免这种情况的最简单方法是使用addPostFrameCallback来确保在初始构建之后更新状态(这非常重要):
addPostFrameCallback
class TestState extends State<Test> { @override voide iniState() { WidgetsBinding.instance?.addPostFrameCallback((timeStamp){ locator<TestController>().FunctionA(); locator<TestController>().FunctionB(); }); super.initState(); } }
当您想要使用具有notfifyListeners()函数时,请小心地在dispose方法中使用addPostFrameCallback。快乐编码....
notfifyListeners()
dispose
ws51t4hk3#
不要在initState中调用提供程序,因为此时您的生成器仍在运行中,并且没有可用的BuildContext,为了避免这种情况,许多编码器使用Future Delay和mounted来检查BuildContext是否在initState中就绪。但是,当您处理未来数据时,FutureBuilder小部件是正确的选择。当数据可用时,这将自动构建小部件,您无需检查mounted。
3条答案
按热度按时间ovfsdjhp1#
您需要等待构建完成:
velaa5lx2#
您得到异常的原因是您在尝试构建小部件时更新了状态。
避免这种情况的最简单方法是使用
addPostFrameCallback
来确保在初始构建之后更新状态(这非常重要):当您想要使用具有
notfifyListeners()
函数时,请小心地在dispose
方法中使用addPostFrameCallback
。快乐编码....
ws51t4hk3#
不要在initState中调用提供程序,因为此时您的生成器仍在运行中,并且没有可用的BuildContext,
为了避免这种情况,许多编码器使用Future Delay和mounted来检查BuildContext是否在initState中就绪。
但是,当您处理未来数据时,FutureBuilder小部件是正确的选择。当数据可用时,这将自动构建小部件,您无需检查mounted。