flutter home键退出应用时触发的事件

flutter home键退出应用时触发的事件会离开当前应用,并后台运行此时可以在myapp中继承

WidgetsBindingObserver 重写 didChangeAppLifecycleState 对此事件进行监听

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  _MyAppState createState() => _MyAppState();
}

//WidgetsBindingObserver 感知App生命周期变化的接口
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {


  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    switch (state) {
      case AppLifecycleState.resumed:
        debugPrint('应用程序可见并响应用户输入。');
        break;
      case AppLifecycleState.inactive:
        debugPrint('应用程序处于非活动状态,并且未接收用户输入');
        break;
      case AppLifecycleState.paused:
        debugPrint('用户当前看不到应用程序,没有响应');
        break;
      case AppLifecycleState.detached:
        debugPrint('该应用程序仍托管在颤振引擎上,但与任何主机视图分离');
        break;
      default:
    }

  }
 @override
  void initState() {
    super.initState();
    // 添加监听
    WidgetsBinding.instance?.addObserver(this);
   
  }

可以查看 AppLifecycleState源码

enum AppLifecycleState {
  //应用程序可见,并响应用户输入。
  resumed,

   // 应用程序处于非活动状态,未接收用户输入。
  // 在iOS上,此状态对应于在前台非活动状态下运行的应用程序或Flatter主机视图。
  // 当在电话中、响应TouchID请求、进入应用程序切换器或控制中心时,
  // 或者当承载Flatter应用程序的UIViewController正在转换时,应用程序会转换到该状态。
  // 在Android上,这对应于在前台非活动状态下运行的应用程序或Flatter主机视图。
  // 当另一个活动被关注时,应用程序会转换到这种状态,
  // 例如分屏应用程序、电话、画中画应用程序、系统对话框或其他窗口。
  // 处于这种状态的应用程序应该假设它们随时都可能[暂停]。
  
  inactive,


  ///应用程序当前对用户不可见,不响应用户输入,并且在后台运行。当应用程序处于这种状态时,
  /// 引擎不会调用[PlatformDispatcher.OnBeginRame]和
  //[PlatformDispatcher.onDrawFrame]回调。

  paused,

  ///该应用程序仍然托管在一个Flatter引擎上,但与任何主机视图分离。
  ///当应用程序处于这种状态时,引擎在没有视图的情况下运行。它可以是在enginewas首次初
  ///始化时附加视图的过程中,也可以是在视图由于导航器弹出而被销毁之后。

  detached,
}

当用户home键退出应用时就可以监听到事件的触发,

当然如果想让用户点击返回键两次不触发关闭应用得修改

MainActivity这个文件

package com.example.myapp;

import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import android.os.Bundle;
//import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    //通讯名称,回到手机桌面
    private  final String CHANNEL = "android/back/desktop";
    @Override
    public void configureFlutterEngine(FlutterEngine flutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //GeneratedPluginRegistrant.registerWith(this);
        new MethodChannel(getFlutterEngine().getDartExecutor().getBinaryMessenger(), CHANNEL).setMethodCallHandler(
                new MethodChannel.MethodCallHandler() {
                    @Override
                    public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
                        if (methodCall.method.equals("backDesktop")) {
                            result.success(true);
                            moveTaskToBack(false);
                        }
                    }
                }
        );
    }

然后新建一个Util类

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);
  }
}

然后在MaterialApp的home中添加WillPopScope属性,在onWillPop()事件中返回false,

@override
Widget build(BuildContext context) {
  return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: WillPopScope(
          onWillPop: () async {
            //只有安卓机器需要添加这些,ios不需要这个
            AndroidBackTop.backDeskTop(); //设置为返回不退出app

            return false; //一定要return false
          },
          child: const Drag()));
}

然后双击返回键退出应用,就不会结束app进程,在后台运行

————————————————
版权声明:本文为CSDN博主「疯狐狸12138」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_23907467/article/details/124349922

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值