如何使用 Navigator.popUntil Flutter

fan*_*dro 11 flutter

我正在做一个 Flutter 应用程序,我想从第 4 页返回到第 1 页。我有一个非常奇怪的错误:

坏状态:未来已经完成

我创建了一个简单的项目来重现这个错误:

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      onGenerateRoute: routes,
    );
  }
}

Route routes(RouteSettings settings) {
  if (settings.name == '/page1') {
    return MaterialPageRoute(
      builder: (context) {
        return Page1();
      },
    );
  } else if (settings.name == '/page2') {
    return MaterialPageRoute(
      builder: (context) {
        return Page2();
      },
    );
  } else if (settings.name == '/page3') {
    return MaterialPageRoute(
      builder: (context) {
        return Page3();
      },
    );
  } else if (settings.name == '/page4') {
    return MaterialPageRoute(
      builder: (context) {
        return Page4();
      },
    );
  } else {
    return MaterialPageRoute(
      builder: (context) {
        return Page1();
      },
    );
  }
}

class Page1 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Page 1'),
            RaisedButton(
              child: Text('Go Page 2'),
              onPressed: () {
                Navigator.of(context).pushNamed('/page2');
              },
            )
          ],
        ),
      ),
    );
  }
}

class Page2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Page 2'),
            RaisedButton(
              child: Text('Go Page 3'),
              onPressed: () {
                Navigator.of(context).pushNamed('/page3');
              },
            )
          ],
        ),
      ),
    );
  }
}

class Page3 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Page 3'),
            RaisedButton(
              child: Text('Go Page 4'),
              onPressed: () {
                Navigator.of(context).pushNamed('/page4');
              },
            )
          ],
        ),
      ),
    );
  }
}

class Page4 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Page 4'),
            RaisedButton(
              child: Text('Go Back Page 1'),
              onPressed: () {
                Navigator.of(context).popUntil(ModalRoute.withName('/page1'));
              },
            )
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

gee*_*kfa 24

代替:

          Navigator.of(context).push(
            MaterialPageRoute(
              builder: (context) => Page1(),
            ),
          );
Run Code Online (Sandbox Code Playgroud)

用:

          Navigator.of(context).push(
            MaterialPageRoute(
              settings: RouteSettings(name: "/Page1"),
              builder: (context) => Page1(),
            ),
          );
Run Code Online (Sandbox Code Playgroud)

然后你可以使用:

Navigator.of(context)
              .popUntil(ModalRoute.withName("/Page1"));
Run Code Online (Sandbox Code Playgroud)

  • 如果我有多条具有相同名称的路线,那么它将弹出到哪一条?堆栈中最新的还是堆栈中最后的? (3认同)

Kee*_*ani 5

这是重复的问题。参考这个这个

基本上发生的事情是 - 当您启动应用程序时,page1 打开,因为它进入最后一个 else 并且没有为其分配名称,因此当您执行 popuntil 该页面名称时,它根本找不到它。