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

Nom*_*nom 5 flutter

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

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

任何想法如何解决?

谢谢!

ten*_*obi 10

您正在寻找的方法是popUntil(),查看实现https://docs.flutter.io/flutter/widgets/Navigator/popUntil.htmlhttps://docs.flutter.io/flutter/widgets/NavigatorState/弹出直到.html

你可能不得不做类似的事情

Navigator.of(context).popUntil(ModalRoute.withName('/my-target-screen'));
Run Code Online (Sandbox Code Playgroud)

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

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


Nik*_*las 5

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

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

在此处输入图片说明

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('/'),
                  ),
            ),
          ],
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)