【问题标题】:flutter: how to handle back button press when using navigator with pages颤振:使用带有页面的导航器时如何处理后退按钮按下
【发布时间】:2021-02-13 11:27:47
【问题描述】:

我正在尝试实现 Navigator 2.0 方法。我唯一不能工作的是按下后退按钮。当我按下后退按钮时,应用程序只是退出并且不会转到上一页。我尝试了 WillPopPage 小部件,但后退按钮绕过了它。

这里有一个示例代码,它不适用于后按。

import 'package:flutter/material.dart';

main(List<String> args) {
  runApp(TestApp());
}

class TestApp extends StatefulWidget {
  @override
  _TestAppState createState() => _TestAppState();
}

class _TestAppState extends State<TestApp> {
  bool go = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Navigator(
        pages: [
          // page 1
          MaterialPage(
            child: W1(onTapped: () {
              setState(() => go = true);
            }),
          ),
          // page 2
          if (go) MaterialPage(child: W2()),
        ],
        onPopPage: (route, result) {
          if (!route.didPop(result)) return false;
          go = false;
          return true;
        },
      ),
    );
  }
}

class W1 extends StatelessWidget {
  final void Function() onTapped;

  const W1({Key key, this.onTapped}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: FlatButton(
          onPressed: onTapped,
          child: Text("Go to second"),
        ),
      ),
    );
  }
}

class W2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("pressing the back button is exiting the app.."),
      ),
    );
  }
}

我已经用这种方法编写了很多代码,所以我不能再回到命令式导航了。这种方式如何处理后压?

【问题讨论】:

    标签: flutter dart declarative flutter-navigation


    【解决方案1】:

    在不扩展 RouterDelegate 的情况下,这对于 Navigator 2.0 是不可能的。系统后退按钮按下由RouteDelegatepopRoute 方法处理。根据文档:

    该方法应返回一个布尔值 Future 以指示此委托是否处理请求。返回 false 会导致整个应用被弹出。

    默认实现总是返回 false。因此,您必须覆盖它以处理系统后退按钮按下。

    更新
    我发表了一篇文章,介绍了使用 Navigator 2.0 的快速且易于理解的指南。你可以找到它here

    【讨论】:

    • 能否举例说明如何扩展RouterDelegate?
    • 这是一个太大的主题,无法在此处的快速示例中提供。但是,我正在撰写一篇文章,解释如何使用 RouterDelegatePages。我应该在周五或周六发布。我将使用链接更新我的答案。
    • @Houcine 请检查我更新答案中的链接。我相信你会发现它很有帮助。
    【解决方案2】:

    您必须使用“WillPopScope”https://api.flutter.dev/flutter/widgets/WillPopScope-class.html

    例子

    Future<bool> _willPopScopeCall() async {
    // code to show toast or modal
    return true; // return true to exit app or return false to cancel exit
    }
    
    //wrap your scaffold with WillPopScope
    WillPopScope(child: new Scaffold(), onWillPop: _willPopScopeCall);
    

    【讨论】:

    • 是的,我知道 WillPopScope 是要走的路……但是在我的具体问题中它到底会去哪里?在 W1 或 W2 之上,它不起作用(正如我所提到的)。在 Navigator 之上,它可能会,但在这种情况下,我如何从 Navigator(它将位于 WillPopScope 下方)中弹出页面?这就是问题所在。
    • 我会进一步调查
    • @Andrey 请查看我的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2023-03-23
    • 2015-05-24
    • 2019-04-28
    • 1970-01-01
    相关资源
    最近更新 更多