Flutter 如何在flatter中处理android的back按钮

Flutter 如何在flatter中处理android的back按钮,flutter,Flutter,我从一个页面导航到另一个页面,就像从页面上的按钮导航一样 1st Page <---> 2nd Page <---> 3rd Page <---> 4th Page 第1页第2页第3页第4页 如果在点击安卓系统的后退按钮后我在任何页面上,我想导航到主页,而不是上一页 比如,如果我在第2页,如果我按下后退按钮,我会进入第1页,但我想弹出堆栈上的所有元素,然后进入主主页 Future<bool> pushPage(BuildContext c

我从一个页面导航到另一个页面,就像从页面上的按钮导航一样

1st Page <---> 2nd Page <--->  3rd Page <--->   4th Page
第1页第2页第3页第4页
如果在点击安卓系统的后退按钮后我在任何页面上,我想导航到主页,而不是上一页

比如,如果我在第2页,如果我按下后退按钮,我会进入第1页,但我想弹出堆栈上的所有元素,然后进入主主页

Future<bool> pushPage(BuildContext context) {
// return   Navigator.of(context).pop(true);
  return Navigator.of(context).pushNamedAndRemoveUntil('/quiz2', 
 ModalRoute.withName("/landingPage"));
}
 class _Quiz1State extends State<Quiz1> {
bool hasSolved = false;
int solvedOption = 0;
@override
Widget build(BuildContext context) {
return WillPopScope(
  onWillPop: () async {
    pushPage(context);
    return false;
  },
      child: Scaffold(
    body: Stack(
        alignment: Alignment.topCenter,
        children: [
          Container(
    decoration: BoxDecoration(
      gradient: LinearGradient(
        begin: Alignment.bottomCenter,
        end: Alignment.topCenter,
        colors: [
          Color(0xffBD00FF),
          Color(0xffF1509E),
        ],
      ),
    ),
          ),
          mainQuiz(),
          Container(
    child: uiElements(context),
    margin: EdgeInsets.only(top: 16),
          ),
        ],
      ),
  ),
);
}
未来推送页(构建上下文){
//返回Navigator.of(context.pop)(true);
返回Navigator.of(context.pushNamedRemoveUntil('/quiz2',
ModalRoute.withName(“/landingPage”);
}
类Quiz1State扩展状态{
bool hasSolved=false;
int solvedOption=0;
@凌驾
小部件构建(构建上下文){
返回式示波器(
onWillPop:()异步{
pushPage(上下文);
返回false;
},
孩子:脚手架(
主体:堆栈(
对齐:alignment.topCenter,
儿童:[
容器(
装饰:盒子装饰(
梯度:线性梯度(
开始:对齐.bottomCenter,
结束:对齐。上止点,
颜色:[
颜色(0xffBD00FF),
颜色(0xffF1509E),
],
),
),
),
mainquick(),
容器(
子元素:uiElements(上下文),
页边距:仅限边缘集(顶部:16),
),
],
),
),
);
}

mainquick()函数是第二页函数,在第一页之后使用Navigator.push替换Navigator.push

您也可以使用此选项进入第一页:

Navigator.of(context).popUntil((route) => route.isFirst);
我们知道Navigator.pop()会将页面移到堆栈中可用的最上面的页面。还有另一个名为Navigator.poptuntil()的函数,它会不断从堆栈中弹出页面,直到到达所需页面为止

首先(如果您还没有这样做),您需要为所有页面命名。当您在函数中引用这些页面时,它们将充当该页面的ID卡。对于小部件MaterialApp所在树的最顶部,请执行以下操作:

MaterialApp(
  home: new Screen1(),
  routes: <String, WidgetBuilder> {
    '/screen1': (BuildContext context) => new Screen1(),
    '/screen2' : (BuildContext context) => new Screen2(),
    '/screen3' : (BuildContext context) => new Screen3(),
    '/screen4' : (BuildContext context) => new Screen4()
  },
)
Navigator.popUntil(context, ModalRoute.withName('/screen1'));
这将不断弹出小部件,直到它到达屏幕1。 希望这能解决你的问题

注意:

一旦您在一开始就预定义了所有路线,就不用调用
Navigator.push(context,MaterialPageRoute((context)=>Screen1());

您可以这样做:
Navigator.pushNamed(上下文“/screen1”);

编辑: 假设您的主页尚未出现在堆栈中,并且您希望在弹出所有屏幕后显示它。您可以执行以下操作:

Navigator.of(context).pushName和removeUntil('/homepage',(Route-Route)=>false);

这将在删除堆栈中的所有其他屏幕后添加Homepage()。[(路由)=>false”将从堆栈中弹出所有屏幕。]。 然后,如果您只想弹出屏幕直到到达给定屏幕(比如直到我们到达屏幕1),您可以执行以下操作:


Navigator.of(context).pushnamedandremoveintill('/homepage','/screen1'));

我不会使用WillPopScope作为父项,我会调用Navigator返回该页面。我会使用这个方法PushAndRemove,直到希望它能帮助您。如果我使用Navigator.pushReplacement代替Navigator.push,您能在我的代码中将我解释为一个简单的示例吗页面返回当您使用pushReplacement时,新状态将替换当前状态和已删除的当前状态。因此,当您单击“上一步”按钮(物理或软件)时,您将返回到第一个状态。