首页 > 解决方案 > 如何在颤动中处理android的后退按钮

问题描述

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

1st Page <---> 2nd Page <--->  3rd Page <--->   4th Page

如果我在单击 android 的后退按钮后在任何页面上,我想导航到主页而不是转到上一页。

就像如果我在第 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),
          ),
        ],
      ),
  ),
);
}

mainquiz() 函数是第二页函数

标签: flutter

解决方案


我们知道 Navigator.pop() 移除到堆栈上可用的最顶层页面。还有另一个名为 Navigator.popUntil() 的函数将不断从堆栈中弹出页面,直到到达所需的页面。

首先(如果您还没有这样做),您需要为所有页面命名。当您在函数中引用它们时,它们就像页面的身份证一样。对于小部件 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()
  },
)

基本上,您在这里所做的是为您将在应用程序中采用的所有路线预先定义名称。现在说上面的例子的导航是这样的:

屏幕1 -> 屏幕2 -> 屏幕3 -> 屏幕4

现在说我在 Screen4() .....那么我当前的堆栈将是 [Screen4,Screen3,Screen2,Screen1] .....(最新的第一个,最旧的最后一个),并且在点击后退按钮时我需要直接弹出到 Screen1().... (在您的情况下为主页)。然后,而不是简单的 Navtigator.pop() 我会做这样的事情:

Navigator.popUntil(context, ModalRoute.withName('/screen1'));

这将不断弹出小部件,直到它到达 screen1。希望这能解决你的问题。

笔记:

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

你可以这样做 : Navigator.pushNamed(context, '/screen1');

编辑: 假设您的主页尚未出现在堆栈中,并且您想在弹出所有屏幕后显示它。你可以做 :

Navigator.of(context).pushNamedAndRemoveUntil('/homepage', (Route<dynamic> route) => false);

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

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


推荐阅读