Calling setState() during build without user interaction

夙愿已清 提交于 2020-03-22 09:24:45

问题


What I did :

  • I have integrated FCM (Firebase Cloud Messaging) in my flutter app.
  • I shared the context and the setState() of each page in static variables with these two lines getting called in all the build functions of my pages :
@override
Widget build(BuildContext context) {
    StaticClass.currentContext = context;
    StaticClass.currentSetState = this.setState;
    return ... ;
}
  • I created a callback to handle the coming notifications when the app is running
fcm.configure( onMessage: (){
    StaticClass.currentSetState((){
        Navigator.pushNamed(StaticClass.currentContext, "/notifications");
  });
});

What happened :

  • I got this error:
 ══╡ 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.
...

Explanations :

  • I can't update the page (by using context or calling setState()) when the framework is building
  • This problem doesn't happen when this function is called with a user interaction

What I want :

  • Is there a way to repair my code or am I doing something wrong ?

OR

  • Is there any other solution to go to another Page when onMessage() is triggered ?

OR

  • Is there a way to know when the build function completes, to setState() without any problem ?

Please Help I'm stuck here


回答1:


You can call setState after rendering is done by adding a post frame callback with addPostFrameCallback method. This will be called only once and after build process is done.

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


来源:https://stackoverflow.com/questions/54846280/calling-setstate-during-build-without-user-interaction

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!