在构建期间调用 setState(),无需用户交互

2024-01-30

我做了什么 :

  • 我已将 FCM(Firebase 云消息传递)集成到我的 flutter 应用程序中。
  • 我分享了contextsetState()每个页面的静态变量中的这两行在我的页面的所有构建函数中被调用:
@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())
  • 当通过用户交互调用此函数时,不会发生此问题

我想要的是 :

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

OR

  • 触发 onMessage() 时是否有其他解决方案可以转到另一个页面?

OR

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

请帮助我被困在这里


您可以致电setState通过添加后帧回调完成渲染后添加PostFrameCallback https://api.flutter.dev/flutter/scheduler/SchedulerBinding/addPostFrameCallback.html方法。这只会被调用once并在构建过程完成后。

WidgetsBinding.instance.addPostFrameCallback((_) => setState(() {}));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在构建期间调用 setState(),无需用户交互 的相关文章

随机推荐