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