前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >flutter 返回键监听

flutter 返回键监听

原创
作者头像
徐建国
修改2021-08-02 17:55:44
3.8K1
修改2021-08-02 17:55:44
举报
文章被收录于专栏:个人路线个人路线

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

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

代码语言:javascript
复制
import 'package:fluttertoast/fluttertoast.dart';  //提示第三方插件

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

代码语言:javascript
复制
DateTime _lastPressedAt; //上次点击时间
代码语言:javascript
复制
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文件

代码语言:javascript
复制
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

代码语言:javascript
复制
import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
代码语言:javascript
复制
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文件中添加配置:

代码语言:javascript
复制
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; 
代码语言:javascript
复制
public class MainActivity extends FlutterActivity {
 //通讯名称,回到手机桌面
  private  final String CHANNEL = "android/back/desktop";   @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
代码语言:javascript
复制
    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启用接收方法调用并发回结果。

 添加相关依赖

代码语言:javascript
复制
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为例:

代码语言:javascript
复制
private  final String CHANNEL = "android/back/desktop";

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

代码语言:javascript
复制
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 .

代码语言:javascript
复制
public void onMethodCall(MethodCall methodCall, Result result) {
  if (methodCall.method.equals("backDesktop")){
    String message ="Life Changed";
    result.success(message);
  }
  

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档