本篇为继上片监听返回键基础下优化:

以下做返回键监听两种情况:

import 'package:fluttertoast/fluttertoast.dart';  //提示第三方插件

1. 单击提示双击退出,双击时退出App

DateTime _lastPressedAt; //上次点击时间
main.dart-MyApp中:
home: WillPopScope( // 监听返回键Widget
  onWillPop: () async { // 点击返回键即触发该事件
    if (_lastPressedAt == null) { //首次点击提示...信息
      Fluttertoast.showToast(
        msg: "双击退出程序...",
        gravity: ToastGravity.BOTTOM,
        timeInSecForIos: 1,
        backgroundColor: Colors.grey[400],
        textColor: Colors.white,
        fontSize: ScreenUtil().setWidth(12),
      );
    }
    if (_lastPressedAt == null || DateTime.now().difference(_lastPressedAt) > Duration(seconds: 1)) {
      //两次点击间隔超过1秒则重新计时
      _lastPressedAt = DateTime.now();
      return false; // 不退出
    }
    return true; //退出
  },
  child: Pages(),
),

2. 单击返回手机桌面,不退出App

main.dart文件

import 'package:flutter_smart_park/untils/android_back_desktop.dart';

home: WillPopScope(
  onWillPop: () async {
  AndroidBackTop.backDeskTop();
  return false;
},
child: configProvide.token == '0' ? UserLogIn() : Pages(),
),

android_back_desktop.dart

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
class AndroidBackTop {
  //初始化通信管道-设置退出到手机桌面
  static const String CHANNEL = "android/back/desktop";
  //设置回退到手机桌面
  static Future<bool> backDeskTop() async {
    final platform = MethodChannel(CHANNEL);
    //通知安卓返回,到手机桌面
    try {
      final bool out = await platform.invokeMethod('backDesktop');
      if (out) debugPrint('返回到桌面');
    } on PlatformException catch (e) {
      debugPrint("通信失败(设置回退到安卓手机桌面:设置失败)");
      print(e.toString());
    }
    return Future.value(false);
  }
}

需在MainActivity.java文件中添加配置:

import android.os.Bundle;
import android.view.KeyEvent;import io.flutter.app.FlutterActivity; import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
 //通讯名称,回到手机桌面
  private final String CHANNEL = "android/back/desktop";   @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
    MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
      MethodChannel.MethodCallHandler() {
        @Override
        public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
          if (methodCall.method.equals("backDesktop")) {
            result.success(true);
            moveTaskToBack(false); //是否关闭
          }
        }
      }
    );
  }
}

附加:  MethodChannel  本地访问

在客户端,MethodChannel(API)允许发送与方法调用相对应的消息。 在平台方 面,Android(API)上的MethodChannel和 iOS(API)上的 FlutterMethodChannel启用接收方法调用并发回结果。

 添加相关依赖

import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;

 申明变量CHANNEL,值与定义触发事件包名相同,以上android_back_desktop为例:

private  final String CHANNEL = "android/back/desktop";

 在MethodChannel的中调用.setMethodCallHandler() 方法,需要一个MethodCallHandler 对象,是一个匿名内部类,有一个方法onMethodCall,在Flutter发送请求事,onMethodCall方法会执行。

public class MainActivity extends FlutterActivity {
private static final String CHANNEL = "android_back_desktop";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
MethodChannel(getFlutterView(), CHANNEL).setMethodCallHandler(
MethodCallHandler() {
@Override
public void onMethodCall(MethodCall methodCall, Result result) {
}
}
);
}
}

onMethodCall方法中有两个参数 MethodCall 和 result,MethodCall 中有关当前请求的信息,例如调用方法的名字changeLife;Result用于发送信息给Flutter。

在onMethodCall中判断当前请求是否为changeLife,如果是通过result 的 success 返回信息:Life Changed .

public void onMethodCall(MethodCall methodCall, Result result) {
if (methodCall.method.equals("backDesktop")){
String message ="Life Changed";
result.success(message);
}
...

flutter 返回键监听的更多相关文章

  1. quick-cocos2d-x android返回键监听并实现原生退出对话框

    这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...

  2. android平台菜单返回键监听

    //声明 void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event); //实现 //按键控制(检测onKeyReleased有反 ...

  3. F7+vue 物理返回键监听使用

    以前使用的是纯F7,这个项目加了Vue进去,但碰到了一个问题,就是这样监听不到安卓物理键的返回,它是点击返回,直接推出程序,这个坑有点深,查了不少资料也问了不少人,最后在网上看到了别人的写的,自己也改 ...

  4. RN—Android 物理返回键监听

    A → B 使用 navigator 导航,用 goBack() 返回的时候传递参数 在 A 页面 this.props.navigation.navigate("B", { ca ...

  5. Android之Home键监听封装

    众所周知,我们监听返回键事件,无法是下面两个方法: @Override public void onBackPressed() { //do something //super.onBackPress ...

  6. Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听

    原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public cla ...

  7. Android Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

  8. Android 媒体键监听以及模拟媒体键盘的实现 demo

    有时我们需要程序模拟按钮或点击,而手机本身又没有,哪么可以采取其它方式 模拟实现,最后再去实际设备去测试(前期一般都拿不到设备): 如上一首,下一首,暂停等,手机上是没有的,但有些设备上是有的,所以我 ...

  9. Android Back Home键监听

    Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...

随机推荐

  1. 【Hadoop篇】--Hadoop常用命令总结

    一.前述 分享一篇hadoop的常用命令的总结,将常用的Hadoop命令总结如下. 二.具体 1.启动hadoop所有进程start-all.sh等价于start-dfs.sh + start-yar ...

  2. Python基础(max,min方法)

    max函数(min函数使用方法一致): #-----------------max函数----------------- #max之简单层次的使用 li=[1,0,2,45,12,-2,7,9] re ...

  3. pip安装python库时使用国内镜像资源加速下载过程

    pip默认安装包是从网站https://pypi.org/simple下载,我们可以将其改成国内的镜像网站,加速下载过程,下面以安装numpy库为例: pip install -i https://p ...

  4. qml demo分析(objectlistmodel-自定义qml数据)

    一.效果展示 如图1所示,是一个ListView窗口,自定义了文本内容和项背景色. 图1 ListView 二.源码分析 代码比较简单,主要使用了QQmlContext类的setContextProp ...

  5. k8s源码分析准备工作 - 源码准备

    本文原始地址:https://farmer-hutao.github.io/k8s-source-code-analysis/ 项目github地址:https://github.com/farmer ...

  6. 前后端分离密码登陆加密RSA方案(java后端)

    前言:密码加密有很多种方案,这里不做过多讨论,本篇文章是基于RSA加密实现. 首先在前端工程中需要引入加密js: "jsencrypt": "2.3.1",(注 ...

  7. QQ登录的那些坑

    这几天在项目上面实现qq登录的功能,当功能做好后发现,同一个qq号登录之后腾讯返回的openid并不一样....(天啦噜啊~)然后查询文档以及咨询客服才知道注册申请时是有一个固定的套路的(不得不说,如 ...

  8. layui 轮播图动态数据不显示问题

    layui.use('carousel', function() { var carousel = layui.carousel; var ins = carousel.render({ elem: ...

  9. 日志分析工具Log Parser介绍

    摘要: 微软动态CRM专家罗勇 ,回复321或者20190322可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 分析Dynamics 365 Customer Enga ...

  10. lock了mutex的线程退出了却没有unlock时会怎么样?

    https://stackoverflow.com/questions/4424193/what-happens-to-mutex-when-the-thread-which-acquired-it- ...