如何杀死导航堆栈?弹出Flutter中的所有先前屏幕?

时间:2018-11-13 16:37:38

标签: flutter

因此,我有这种演练,它将用户从一个屏幕推送到另一个屏幕(总共六个屏幕)。在最后一页中,我希望用户按“完成”,然后将他带回到第一个屏幕,而又无法弹出到先前的任何屏幕。

现在它将弹出最后一个屏幕,但不会弹出其他任何屏幕,因此它可以将我带回到我的原始屏幕,并且能够跳回到最后一个屏幕之前的屏幕(希望最后一句话对您有意义,因为弹出了最后一个屏幕,所以我需要回到上一个屏幕。

有人知道如何解决吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

要从导航堆栈中弹出多个屏幕,就像您给定的情况一样,我们可以使用Navigator.popUntil。它需要一个BuildContext和一个RoutePredicate作为参数。导航器将调用pop,直到给定的RoutePredicate返回的值为真为止。

这是一个非常基本的例子。它使用ModalRoute.withName创建RoutePredicate

enter image description here

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      routes: {
        '/': (BuildContext context) => Home(),
        '/another': (BuildContext context) => Another()
      },
    );
  }
}

class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Home'),
            RaisedButton(
              child: Text('Take me to another screen!'),
              onPressed: () => Navigator.pushNamed(context, '/another'),
            )
          ],
        ),
      ),
    );
  }
}

class Another extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            RaisedButton(
              child: Text('Next screen.'),
              onPressed: () => Navigator.pushNamed(context, '/another'),
            ),
            RaisedButton(
              child: Text('Pop em all.'),
              onPressed: () => Navigator.popUntil(
                    context,
                    ModalRoute.withName('/'),
                  ),
            ),
          ],
        ),
      ),
    );
  }
}

答案 1 :(得分:2)

您要查找的方法是popUntil(),请看一下实现https://docs.flutter.io/flutter/widgets/Navigator/popUntil.htmlhttps://docs.flutter.io/flutter/widgets/NavigatorState/popUntil.html

您可能必须做类似

的操作
Navigator.of(context).popUntil(ModalRoute.withName('/my-target-screen'));

(看看https://docs.flutter.io/flutter/widgets/ModalRoute/withName.html

或使用一些自定义功能(https://docs.flutter.io/flutter/widgets/RoutePredicate.html)。