Abdullah
Abdullah

Reputation: 373

Unhandled Exception: Bad state: Future already completed in flutter

hello I have this error when i navigate to another page in my app

i don't know why this error show up

#0      _AsyncCompleter.complete  (dart:async/future_impl.dart:39:31)
#1      Route.didComplete 
package:flutter/…/widgets/navigator.dart:203
#2      NavigatorState.pushReplacement.<anonymous closure> 
package:flutter/…/widgets/navigator.dart:1861
#3      TickerFuture.whenCompleteOrCancel.thunk 
package:flutter/…/scheduler/ticker.dart:389
#4      _rootRunUnary  (dart:async/zone.dart:1132:38)
#5      _CustomZone.runUnary  (dart:async/zone.dart:1029:19)
#6      _FutureListener.handleValue  (dart:async/future_impl.dart:137:18)
#7      Future._propagateToListeners.handleValueCallback  (dart:async/future_impl.dart:678:45)
#8      Future._propagateToListeners  (dart:async/future_impl.dart:707:32)
#9      Future._completeWithValue  (dart:async/future_impl.dart:522:5)
#10     Future._asyncComplete.<anonymous closure>  (dart:async/future_impl.dart:552:7)
#11     _rootRun  (dart:async/zone.dart:1124:13)
#12     <…> 

the Navigation code is

Navigator.pop(context);
Navigator.pushReplacementNamed(context, '/NavigationBar');

and the routes is like this

 routes: {
        "/": (BuildContext context) => LoginPage(),
        "/NavigationBar": (BuildContext context) => NavigationBarPage(),

      },

Upvotes: 2

Views: 10128

Answers (1)

chunhunghan
chunhunghan

Reputation: 54417

I have reproduce this bug with official example
Remove Navigator.pop(context); works fine

In Demo, First Screen click button go to Second screen.
You do not need Navigator.pop(context);
Just Navigator.pushReplacementNamed(context, '/second'); will work
code snippet

onPressed: () {
            //Navigator.pop(context); remove this line
            // Navigate to the second screen using a named route.
            Navigator.pushReplacementNamed(context, '/second');
          },

full code

import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    title: 'Named Routes Demo',
    // Start the app with the "/" named route. In this case, the app starts
    // on the FirstScreen widget.
    initialRoute: '/',
    routes: {
      // When navigating to the "/" route, build the FirstScreen widget.
      '/': (context) => FirstScreen(),
      // When navigating to the "/second" route, build the SecondScreen widget.
      '/second': (context) => SecondScreen(),
    },
  ));
}

class FirstScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Screen'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Launch screen'),
          onPressed: () {
            //Navigator.pop(context); remove this line
            // Navigate to the second screen using a named route.
            Navigator.pushReplacementNamed(context, '/second');
          },
        ),
      ),
    );
  }
}

class SecondScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Screen"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            // Navigate back to the first screen by popping the current route
            // off the stack.
            Navigator.pop(context);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}

Error message if have Navigator.pop(context); before Navigator.pushReplacementNamed

enter image description here

Upvotes: 4

Related Questions