Flutter 解决 MissingPluginException(No implementation found for method xxx on channel xxx)

MissingPluginException(No implementation found for method xxx on channel xxx)
这个错误出现的原因是Plugin的方法没有找到,也可能是Plugin本身就没有注册成功。

经常是退出APP的后重新进入就会出现这个问题。

网上有很多解决办法:

方案一:flutter clean一下,再次 flutter run/build

方案二:将flutter run的进程终止掉重新 flutter run/build

方案三:看看你的FlutterPluginRegistrant产物是否存在,是否更新了

方案四:杀死APP进程重新运行

但是在正式包里面还是会出现这个问题,但是我们不可能要求用户去杀死进程重新运行,这样会被BOSS拉出去祭天的。但是正常的关闭APP的方法又不能解决这个问题。那么我们就要曲线救国一下,我们在Android中定义在用户关闭APP的时候让其后台运行即可解决这个问题。

1.在FLutter for Android 的MainActivity中:

package com.cgmcomm.cgmstore;

import android.app.Notification;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;

import com.cgmcomm.umeng.UmengGlobal;

import io.flutter.app.FlutterActivity;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
    //通讯名称,回到手机桌面
    private final String chanel = "back/desktop";
    //返回手机桌面事件
    static final String eventBackDesktop = "backDesktop";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//API>21,设置状态栏颜色透明
            getWindow().setStatusBarColor(0);
        }
        GeneratedPluginRegistrant.registerWith(this);
        initBackTop();
    }

    @Override
    protected void onResume() {
        super.onResume();
        UmengGlobal.getInstance(this).onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        UmengGlobal.getInstance(this).onPause();
    }

    //注册返回到手机桌面事件
    private void initBackTop() {
        new MethodChannel(getFlutterView(), chanel).setMethodCallHandler(
                (methodCall, result) -> {
                    if (methodCall.method.equals(eventBackDesktop)) {
                        moveTaskToBack(false);
                        result.success(true);
                    }
                }
        );
    }

}

2.在FLutter中:

//android_back_desktop.dart

import 'package:flutter/services.dart';
import 'package:flutter/material.dart';

class AndroidBackTop {
  ///通讯名称,回到手机桌面
  static const String chanel = "back/desktop";

  //返回手机桌面事件
  static const String eventBackDesktop = "backDesktop";

  ///设置回退到手机桌面
  static Future<bool> backDesktop() async {
    final platform = MethodChannel(chanel);
    try {
      await platform.invokeMethod(eventBackDesktop);
    } on PlatformException catch (e) {
      debugPrint(e.toString());
    }
    return Future.value(false);
  }
}

//调用实例:

……
DateTime lastPopTime;
  return WillPopScope(
    child: Scaffold(
      body: TabNavigator(
        state: state,
        dispatch: dispatch,
      ),
    ),
    onWillPop: _doubleExit,
  );
}
Future<bool> _doubleExit() async {
  // 点击返回键的操作
  if(lastPopTime == null || DateTime.now().difference(lastPopTime) > Duration(seconds: 2)){
    lastPopTime = DateTime.now();
    ToastTools.showToast("再按一次退出");
    return new Future.value(false);
  }else{
    lastPopTime = DateTime.now();
    // 退出app
    return AndroidBackTop.backDesktop();
  }
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倚栏静望

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值