Mateu
Mateu

Reputation: 2698

perform a navigation inside the build method of a widget? - flutter

Fast question: how can I perform a navigation inside the build method of a widget?

I have screen with a create form. When the user presses a button, it calls a REST api. While the call is being executed I display a circular progress. When the progress ends I want the screen to be popped (using navigation).

To display the job status I use a Stream in the bloc and a StreamBuilder in the widget. So I want to do something like this:

return StreamBuilder<Job<T>>(
    stream: jobstream,
    builder: (context, snapshot) {
      if (snapshot.hasData) {
        if (snapshot.data.jobStatus == JobStatus.progress)
          // job being executed, display progress
          return Center(child: CircularProgressIndicator());

        else if (snapshot.data.jobStatus == JobStatus.success)
          Navigator.pop(context); // Problem here!
          return Center(child: CircularProgressIndicator());
      } else {
          return DisplayForm();
      }
    });

I have problems with the line: Navigator.pop(context); Because navigation is not allowed during a build.

How can I do this navigation?

My currect dirty solution is using the following function, but its ugly:

  static void deferredPop(BuildContext context) async{
    Future.delayed(
      Duration(milliseconds: 1),
        () => Navigator.pop(context)
     );
   }

Upvotes: 3

Views: 2482

Answers (2)

Jasna
Jasna

Reputation: 71

'Because navigation is not allowed during a build.' that being said you should consider creating a separate function that will receive as an input something that you will take into consideration whether to pop that screen.

Upvotes: 2

Kris
Kris

Reputation: 3371

You can add a callback to be executed after the build method is complete with this line of code:

WidgetsBinding.instance.addPostFrameCallback((_) => Navigator.pop(context));

Upvotes: 3

Related Questions