赞
踩
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(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。