因此,我有这种演练,它将用户从一个屏幕推送到另一个屏幕(总共六个屏幕)。在最后一页中,我希望用户按“完成”,然后将他带回到第一个屏幕,而又无法弹出到先前的任何屏幕。
现在它将弹出最后一个屏幕,但不会弹出其他任何屏幕,因此它可以将我带回到我的原始屏幕,并且能够跳回到最后一个屏幕之前的屏幕(希望最后一句话对您有意义,因为弹出了最后一个屏幕,所以我需要回到上一个屏幕。
有人知道如何解决吗?
谢谢!
答案 0 :(得分:4)
要从导航堆栈中弹出多个屏幕,就像您给定的情况一样,我们可以使用Navigator.popUntil。它需要一个BuildContext
和一个RoutePredicate
作为参数。导航器将调用pop
,直到给定的RoutePredicate
返回的值为真为止。
这是一个非常基本的例子。它使用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('/'),
),
),
],
),
),
);
}
}
答案 1 :(得分:2)
您要查找的方法是popUntil()
,请看一下实现https://docs.flutter.io/flutter/widgets/Navigator/popUntil.html或https://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)。