flutter :如何在将导航器与页面一起使用时处理后退按钮按下

标签 flutter dart declarative flutter-navigation

我正在尝试实现 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.."),
      ),
    );
  }
}
我已经用这种方法写了很多代码,所以我不能再回到命令式导航了。如何用这种方法处理背压?

最佳答案

如果不扩展 RouterDelegate,这对于 Navigator 2.0 是不可能的。 .按下系统后退按钮由 RouteDelegate 处理的 popRoute方法。根据文档:

The method should return a boolean Future to indicate whether this delegate handles the request. Returning false will cause the entire app to be popped.


默认实现始终返回 false。因此,您必须覆盖它以处理系统后退按钮按下。
更新
我发表了一篇文章,介绍了使用 Navigator 2.0 的快速且易于理解的指南。你可以找到它here .

关于 flutter :如何在将导航器与页面一起使用时处理后退按钮按下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64617894/

相关文章:

flutter - Dart 还是 flutter -哪个先出现?

dart - 卡片宽度与父级匹配 : flutter

python - Sqlalchemy 与联合继承和 Firebird 一起存在

python - 是否可以在 SQLAlchemy 中卸载声明类?

android - 无法停止在 flutter 中收听流

Flutter:全局保存列表的方法是什么,以便在浏览我的应用程序后保持状态?

dart - Flutter ListView触摸监听器

flutter - 信息:此函数的返回类型为 'Widget',但不以return语句结尾

recursion - 如何停止递归?

javascript - 在最新的 Polymer Dart 版本中使用来自 Polymer JS 的核心脚手架时出错