在 Flutter 上捕获 Android 后退按钮事件

新手上路,请多包涵

有什么方法可以从 Android 后退按钮捕获 onBackPressed 事件?

我已经尝试过 WillPopScope 但我的 onWillPop 功能仅在我点击 Material 返回箭头按钮时触发

我这样说:

 class MyView extends StatelessWidget{

Widget build(BuildContext context) {

    return new WillPopScope(
      onWillPop: () async {
        debugPrint("Will pop");
        return true;
      },
      child: ScopedModel<AppModel>(
      model: new AppModel(),
      child: new Scaffold(......

我需要抓住它,因为当按下后退按钮时我的屏幕表现不正确,它会弹出屏幕及其下方的屏幕,但不知何故,使用材料后退箭头按钮可以正常工作。

更新:

代码有效,我的问题不在此屏幕的弹出窗口中,而是在前一个屏幕上,我使用了 2 个 MaterialApp 小部件,不知何故它给出了一种奇怪的行为。

原文由 Rizky Andriawan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

这是更新的代码

基本上, WillPopScope -> onWillPop 适用于未来的论点,我们可以说它 _什么时候发生_????所以一旦按下后退按钮 WillPopScope -> onWillPop 被激活并监听参数更具体的后退按钮事件来弹出它(替换它)大多数时候我使用它来显示 Future 类型的 DialogBox 因为它只会在需要时出现,同样可用于导航到新屏幕(希望如此)首选使用 MaterialPage 路由或命名路由技术进行导航,使用 WillPopScope 进行硬件后退按钮事件监听 (硬件 = Android/IOs) 显示退出弹出窗口

上面已经给出了代码,但对我不起作用,所以我稍作改动

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: () async{
      return _moveToScreen2(context);
    },
    child: Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        leading: IconButton(
            icon: Icon(Icons.arrow_back),
            onPressed: () {
              _moveToScreen2(context);
            }),
        title: Text("Screen 1"),
      ),
    ),
  );
}

Future<bool>_moveToScreen2(BuildContext context) =>
    Navigator.pushReplacementNamed(context, "screen2");

================================================

我在退出时做什么

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: ()=> showExitPopup(context)
    child: Scaffold(
      key: _scaffoldKey,
      appBar: AppBar(
        title: Text("Screen 1"),
      ),
    ),
  );
}

==========================================

On Back button Press 创建了一个名为 showExitPopup 的 dart 文件

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:vexpositions/Servises/ConstantManager.dart';

Future<bool> showExitPopup(context) async{
  return await showDialog<bool>(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          content: SizedBox(
            height: 90,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
               const Text("Want to Exit the app!"),
               const SizedBox(height:20),
               Row(
                  children: [
                    Expanded(
                      child: ElevatedButton(
                        onPressed: () {
                          print('yes selected');
                          exit(0);
                        },
                        style: ElevatedButton.styleFrom(
                            primary: Colors.white),
                        child: const Text("Yes", style: TextStyle(color:
                       Colors.black)),
                      ),
                    ),
                    const SizedBox(width: 15),
                    Expanded(
                        child: ElevatedButton(
                          onPressed: () {
                            print('no selected');
                            Navigator.of(context).pop();
                          },
                          style: ElevatedButton.styleFrom(
                            primary: Colors.red.shade800,
                          ),
                          child: const Text("No", style: TextStyle(color:
                          Colors.white)),
                        ))
                  ],
                )
              ],
            ),
          ),
        );
      });
}

原文由 Syed Huzaifa 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题