.popUntil与嵌套导航器

时间:2019-10-26 21:15:42

标签: flutter dart flutter-navigation

我正在尝试使用.popUntil,但得到!_debugLocked不是真正的断言。所有在线解决方案都无法帮助我。我相信这是我设置导航的方式。

下面是我的main.dart文件,routes.dart(导航器文件)和pages.dart文件。请注意,这是我的代码的简化版本。但是,该结构类似于我的实际代码。代码的结构必须更改,因为我在代码中使用了嵌套的导航器!

main.dart

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(debugShowCheckedModeBanner: false, home: Routes());
  }
}

routes.dart

import 'package:flutter/material.dart';
import 'package:honeybee_flutter/screens/test/pages.dart';

class Routes extends StatelessWidget {

  Routes({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Navigator(
        initialRoute: 'route/one',
        onGenerateRoute: (RouteSettings settings) {
          switch (settings.name) {
            case 'route/one':
              return MaterialPageRoute(builder: (_) => Route1());
            case 'route/two':
              return MaterialPageRoute(builder: (_) => Route2());
            case 'route/three':
              return MaterialPageRoute(builder: (_) => Route3());
            default:
              throw MaterialPageRoute(builder: (_) => Route1());
          }
        });
  }
}

pages.dart

import 'package:flutter/material.dart';

class Route1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamed(context, 'route/two'),
              child: Text('route/one'))),
    );
  }
}

class Route2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamed(context, 'route/three'),
              child: Text('route/two'))),
    );
  }
}

class Route3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
          child: FlatButton(
              onPressed: () =>
                  Navigator.popUntil(context, ModalRoute.withName('route/one')), // This doesn't work, gives me !_debugLocked is not true
              child: Text('route/three'))),
    );
  }
}

在Route3中使用popUntil返回到Route1时,出现!_debugLocked错误。我尝试使用此解决方案(Error thrown on navigator pop until : "!_debugLocked': is not true."),但会出现黑屏,并且“在调度程序回调期间引发了以下StateError: 颤动:状态错误:将来已完成”错误。

我也尝试过pushNamedAndRemoveUntil,但不会正确弹出。例如,我将像这样从Route3弹出到Route2:


class Route3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(),
      body: Center(
          child: FlatButton(
              onPressed: () => Navigator.pushNamedAndRemoveUntil(
                  context, 'route/two', ModalRoute.withName('route/one')),
              child: Text('route/three'))),
    );
  }
}

我正在推动路线2,并删除所有路线,直到路线1。但是,当我按一下路线2,然后按返回按钮进入.pop时,我只会出现黑屏,而不是转到路线1。

不确定为什么会这样。

感谢您的帮助。谢谢

0 个答案:

没有答案