firebase - 在没有用户交互的情况下在构建期间调用 setState()

标签 firebase dart flutter setstate

我做了什么:

  • 我在我的 Flutter 应用中集成了 FCM(Firebase 云消息传递)。
  • 我在静态变量中共享了每个页面的 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())
  • 通过用户交互调用此函数时不会发生此问题

我想要什么:

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

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

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

请帮助我被困在这里

最佳答案

您可以在渲染完成后通过使用 addPostFrameCallback 添加后帧回调来调用 setState方法。这只会在构建过程完成后被调用一次

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

关于firebase - 在没有用户交互的情况下在构建期间调用 setState(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54846280/

相关文章:

flutter - 小部件测试失败,未找到任何 MediaQuery 小部件

flutter - Flutter:如何通过从值中搜索来从列表中获取索引?

firebase - 火存储 : query where clause > nested field

javascript - 未捕获的语法错误 : Cannot use import statement outside a module (Using Firebase)

firebase - 如何在 Cloud Firestore 中使用 Stream 回调

dart - 如何在 flutter/dart 中检查 TextField 是否包含 unicode 字符?

flutter - Flutter如何删除GridView的顶部空间

flutter - 在 Dart 中显示本地化标签的问题

firebase - 为什么我在 Firestore(App 引擎)中有这些奇怪的配额数字?

javascript - 如何将Firebase数据显示在屏幕上