问题
What I did :
- I have integrated FCM (Firebase Cloud Messaging) in my flutter app.
- I shared the
contextand thesetState()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