flutter 返回键监听
本篇为继上片监听返回键基础下优化:
以下做返回键监听两种情况:
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 返回键监听的更多相关文章
- quick-cocos2d-x android返回键监听并实现原生退出对话框
这两天最终闲了一下,就顺手又把quick捡起来又学了学,一直都认为quick比cocos2dx那套lua绑定要方便很多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一 ...
- android平台菜单返回键监听
//声明 void onKeyReleased(EventKeyboard::KeyCode keyCode, Event* event); //实现 //按键控制(检测onKeyReleased有反 ...
- F7+vue 物理返回键监听使用
以前使用的是纯F7,这个项目加了Vue进去,但碰到了一个问题,就是这样监听不到安卓物理键的返回,它是点击返回,直接推出程序,这个坑有点深,查了不少资料也问了不少人,最后在网上看到了别人的写的,自己也改 ...
- RN—Android 物理返回键监听
A → B 使用 navigator 导航,用 goBack() 返回的时候传递参数 在 A 页面 this.props.navigation.navigate("B", { ca ...
- Android之Home键监听封装
众所周知,我们监听返回键事件,无法是下面两个方法: @Override public void onBackPressed() { //do something //super.onBackPress ...
- Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听
原文:Android TV开发中所有的遥控器按键监听及注意事项,新增home键监听 简单记录下android 盒子开发遥控器的监听 ,希望能帮到新入门的朋友们 不多说,直接贴代码 public cla ...
- Android Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
- Android 媒体键监听以及模拟媒体键盘的实现 demo
有时我们需要程序模拟按钮或点击,而手机本身又没有,哪么可以采取其它方式 模拟实现,最后再去实际设备去测试(前期一般都拿不到设备): 如上一首,下一首,暂停等,手机上是没有的,但有些设备上是有的,所以我 ...
- Android Back Home键监听
Android Back Home键监听 Back键的监听 对于Back键的监听比较容易,可以在多个系统回调处拦截,比如在activity的下列方法中都可以收到Back键按下的事件: @Overrid ...
随机推荐
- 一个适合.NET Core的代码安全分析工具 - Security Code Scan
本文主要翻译自Security Code Scan的官方Github文档,结合自己的初步使用简单介绍一下这款工具,大家可以结合自己团队的情况参考使用.此外,对.NET Core开发团队来说,可以参考张 ...
- springboot~ObjectMapper~dto到entity的自动赋值
实体与Dto自动赋值 在开发的过程中,实体之间相互赋值是很正常的事,但是我们一般的方法都通过set和get方法来进行的,如果要赋值的字段少那还行,但是需要赋值的字段超过10个,那就是个灾难,你会看到整 ...
- C++求集合的交集差集
标准库的<algorithm>头文件中提供了std::set_difference,std::set_intersection和std::set_union用来求两个集合的差集,交集和并集 ...
- Python编程从入门到实践笔记——变量和简单数据类型
Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...
- 【大数据安全】Kerberos集群安装配置
1. 概述 Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份.它也指由麻省理工实现此协议,并发布的一套免费软件.它的设计主要针对 ...
- 一次node-sass安装记录
node-sass的版本是3.9.3 Please restart this script from an administrative PowerShell! 在当前powershell中执行下命令 ...
- java_异常
一.什么是异常? 1.当程序”运行后”,当jvm遇到一些无法处理的情况,例如:整数/0,这就表示jvm遇到一种”异常情况”. 通常jvm能够识别这些异常并在控制台打印异常信息,并结束程序 2.为了解决 ...
- 包、继承以及 LeetCode 27、28题
1 package.import 和 import static 1.1 Package Java 引入了包(Package)机制,提供了类的多层命名空间,用于解决类的命名冲突.类文件管理问题.Jav ...
- PHP设计模式的六大设计原则
PHP设计模式的六大设计原则 1 简介 软件设计最大的难题就是应对需求的变化,但是纷繁复杂的需求变化却是不可预料的.此时,我们可以通过六大设计原则良好的应对未来的变化. 2 讲解 2.1 单一职责原则 ...
- Java日期的一些基本处理
今天工作中用到一些日期的处理.这里做一点浅显的整理. 1.日期的加减: 日期加减一般用到Calendar这个类比较好.这样不用处理12月加一个月和28.30.31.加一天等问题 String last ...