美文网首页Flutter
Flutter点击返回键,回到桌面,但不退出APP的实现

Flutter点击返回键,回到桌面,但不退出APP的实现

作者: helang1991 | 来源:发表于2020-12-30 11:47 被阅读0次

    @TOC

    前言

    只有Android手机上才会有返回APP的操作,所以以下所说的是针对Flutter的Android平台上开发,现在flutter的版本已经升级到1.22.0以上了,很多旧方法都不能用了,网络上有很多案例都是针对旧的flutter版本,所以我这边就做过新版本的该功能,方便大家参考一下

    一、编写回到桌面方法的插件

    这是新旧flutter编写返回到桌面的最大区别,以前可以在MainActivity直接编写能用的插件,但是现在不行了,很多方法都没有了,因此,我们需要新启一个插件 app_util_plugin,编写网上有很多教程,这里就不在赘述了


    在这里插入图片描述

    插件模块


    在这里插入图片描述
    核心代码,返回桌面的方法navigateToSystemHome
    package com.app.app_util_plugin;
    
    import android.content.Context;
    import android.content.Intent;
    
    import androidx.annotation.NonNull;
    
    import io.flutter.embedding.engine.plugins.FlutterPlugin;
    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;
    import io.flutter.plugin.common.PluginRegistry.Registrar;
    
    /** AppUtilPlugin */
    public class AppUtilPlugin implements FlutterPlugin, MethodCallHandler {
      /// The MethodChannel that will the communication between Flutter and native Android
      ///
      /// This local reference serves to register the plugin with the Flutter Engine and unregister it
      /// when the Flutter Engine is detached from the Activity
      private MethodChannel channel;
      private Context mContext;
    
      @Override
      public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        mContext = flutterPluginBinding.getApplicationContext();
        channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "app_util_plugin");
        channel.setMethodCallHandler(this);
      }
    
      @Override
      public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
        if (call.method.equals("getPlatformVersion")) {
          result.success("Android " + android.os.Build.VERSION.RELEASE);
        } else if (call.method.equals("checkUpdateApp")) {
    
        } else if (call.method.equals("navigateToSystemHome")) {//返回系统首页
          Intent intent = new Intent();// 创建Intent对象
          intent.setAction(Intent.ACTION_MAIN);// 设置Intent动作
          intent.addCategory(Intent.CATEGORY_HOME);// 设置Intent种类
          intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//标记
          mContext.startActivity(intent);
        } else {
          result.notImplemented();
        }
      }
    
      @Override
      public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        channel.setMethodCallHandler(null);
      }
    }
    
    

    二、编写通过MethodChannel调用插件中方法

    编写插件调用方法

    
    import 'dart:async';
    
    import 'package:flutter/services.dart';
    
    class AppUtilPlugin {
      static const MethodChannel _channel =
          const MethodChannel('app_util_plugin');
      //返回系统首页
      static void navigateToSystemHome() async {
        await _channel.invokeMethod('navigateToSystemHome');
      }
    }
    

    三、使用返回桌面的方法

    在main.dart监听系统返回键,当时调用系统返回键时,将它拦截下来,再调用插件中的返回桌面的方法,这样就可以不用退出APP,就可以回到桌面了

    MaterialApp(
        home: WillPopScope(
          onWillPop: () async {
            AppUtilPlugin.navigateToSystemHome();//返回到系统首页
            return false;
          },
          child: HomeMainPage(),
        ),
        navigatorKey: Constant.navKey,
        navigatorObservers: [MyApp.routeObserver],
        onGenerateRoute: onGenerateRoute,
    )
    

    总结

    整个过程很简单,希望可以帮到flutter 的初学者们

    相关文章

      网友评论

        本文标题:Flutter点击返回键,回到桌面,但不退出APP的实现

        本文链接:https://www.haomeiwen.com/subject/agxhoktx.html