未处理的异常:错误状态:未来已经在颤动中完成

Unhandled Exception: Bad state: Future already completed in flutter

你好,当我导航到我的应用程序中的另一个页面时出现此错误

我不知道为什么会出现这个错误

#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     <…> 

导航代码是

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

路线是这样的

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

      },

我已经用官方例子复现了这个bug
删除 Navigator.pop(context); 工作正常

在Demo中,First Screen点击按钮进入Second screen。
你不需要 Navigator.pop(context);
只需 Navigator.pushReplacementNamed(context, '/second'); 即可
代码片段

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

完整代码

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!'),
        ),
      ),
    );
  }
}

如果有 Navigator.pop(context) 则出现错误消息;在 Navigator.pushReplacementNamed

之前