在构建过程中调用SetState(),而无需用户交互



我做了什么:

  • 我在我的flutter应用中已集成了FCM(firebase云消息传递)。
  • 我在静态变量中共享了context和每个页面的setState(),这两行被调用我的页面的所有构建函数:
@override
Widget build(BuildContext context) {
    StaticClass.currentContext = context;
    StaticClass.currentSetState = this.setState;
    return ... ;
}
  • 我创建了一个回调以处理应用程序运行时的即将到来的通知
fcm.configure( onMessage: (){
    StaticClass.currentSetState((){
        Navigator.pushNamed(StaticClass.currentContext, "/notifications");
  });
});

发生了什么:

  • 我有一个错误:
 ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══
...
setState() or markNeedsBuild() called during build.
This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets.
...

说明:

  • 我无法在框架构建时更新页面(通过使用上下文或调用setState())
  • 当用户交互调用此功能时,不会发生此问题

我想要什么:

  • 有没有办法修复我的代码或我做错了什么?

  • 触发OnMessage()时还有其他解决方案吗?

  • 有没有办法知道构建函数何时完成,setState()没有任何问题?

请帮助我陷入困境

您可以通过使用AddPostFrameCallback方法添加后帧回调后调用setState。这将仅称为一次,并且完成后完成后。

WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {}));

最新更新