侧边栏壁纸
博主头像
钱学超博主等级

火星人,1万小时法则的忠实拥趸。技术宅,象棋和羽毛球爱好者,马拉松PB成绩:4小时零8分。坚持认为算法是计算机的灵魂。喜欢解决问题,喜欢手工,喜欢与朋友们聊天喝酒吹牛X。

  • 累计撰写 54 篇文章
  • 累计创建 306 个标签
  • 累计收到 52 条评论
标签搜索

目 录CONTENT

文章目录

flutter 遇到MissingPluginException不要慌,百度和google都帮不了你的话,来找我!

钱学超
2021-08-19 / 0 评论 / 0 点赞 / 314 阅读 / 3,344 字 / 正在检测是否收录...

现象

不知道从哪个时间点开始,突然间flutter项目就不香了。可以直接运行到手机上,但是某些功能无法使用。比如最常见的SharedPreference,比如FlutterToast,之前都是正常使用的,并且已经稳定使用很长时间了。当然,也有可能是你自己做的插件,确定没有什么问题的,突然间就无法使用了,编译没有错误,用到的时候就抛错:

Unhandled Exception: MissingPluginException(No implementation found for method launch on channel ***)

疑惑

  1. 插件大部分是第三方的,使用的不管是人数还是项目数都已经非常多了,运行时间也非常稳定。(当然,你也有可能会遇到一些官方的插件比如sensor等等抛出这个错误的。)原理上来说不应该找不到安卓端的实现的。
  2. 之前都是好好的,突然间,环境也没有发生什么改变,正常的使用各项插件,正常做项目,做插件,做工作,做个好人,咋就这么难涅。
  3. 当然,遇到这个不幸的问题,相信每个人都会有所怀疑,比如最近升级了flutter版本,比如最近增加了什么功能,比如最近使用了什么插件,比如最近多长时间没有pub get,pub upgrade了,等等吧,你会怀疑一切...别问我咋知道的,我现在都怀疑写这个帖子会不会减少你们的一些乐趣

过程

  1. 初步怀疑是配置问题,因为日志没有任何log出来,直接就是MissingPluginException,妈妈告诉我,就是这个插件出问题了。于是flutter clean,进到android目录下,./gradlew clean,删除pubspec.lock,pub get,pub upgrade,这不是一个步骤,这不是一次,手指头都敲酸了。还是一样的问题。
  2. 有问题找警察,实在不行就百度吧。
    image.png
    找了一堆类似这样的解答,还有很多捧臭脚的,嗯嗯,就是这样就搞好了!!!我信你个鬼啊,我也试了,死活就是不行呐。我有点怀疑人生了,难道我做了个假程序员?
    嗯,嗯,内事不明问百度,这个flutter是特么google的产物吧,那咱找个梯子试试吧,于是,英文本就不好的我,就开始在字母和单词之间游弋,欢快的划着我的小船,梯子流量就这样一点点消失在时光的长河里,那tm都是钱啊!最终找到了各种github源码库,一般都是各种插件的开发者论坛吧,居然大部分都遇到这个现象了,亏得我还一个一个挨着看,看不懂就翻译,你懂吧,最后木有任何结论,大部分都是不了了之。
  3. 靠天靠地靠祖宗,不算是好汉!所以还是回家自己搞!flutter版本升级吧,是不是升级一下就好了?话说升级了之后啊... 各种不兼容,我错了,升级的好像是dev?啥意思?flutter 有个channel,就是分支,各自不同的含义,master-->dev--->beta--->stable可能拼错了啊,大概就这几个,稳定程度就是上面这个关系。兼容性也是stable最好,dev???动不动就是这个类在下一个版本没有了,这个属性上个版本才支持。。。。于是来回切换channel,嗯,命令都学会了,flutter channel XXX,切换channel完了之后还要切版本,flutter upgrade 1.23.0-18.1.pre 或者 flutter downgrade xxxxx,一顿操作猛如虎,一看效果二百五。各种不管用,鼓捣了半天终于恢复到原始的flutte版本了,为啥?因为新版本不兼容呗,暂时没时间升级了,先解决这个missing plugin exception最重要吧。
  4. 说好的自己搞呢,鼓捣半天没有效果是不是垂头丧气啊,不过我有大招,大招懂不懂?下前下后+重拳!就这么简单---删代码!!!把代码整个拷贝打包做个备份,删了!!!从服务器上git上下载!!记得之前git上提交的哪个版本可以用来的?怀着忐忑的心态,clone了一份旧代码,果不其然,pub get,upgrade之后,依然是这个错!!!!!!疯了。时间已经过去了10个小时,抛出去吃饭喝水上厕所,怎么也得有2个小时了吧,120分钟呐,这么个小问题都解决不了?我堂堂七尺男儿啊,真就是不服了!!!
  5. 记得之前在中关村攒机的时候,有过一个解决问题的好办法不是?替换法!cpu主板显卡内存硬盘,挨个换一遍,哪个坏了一试就知道!所以这个玩意儿是不是也行呐,来吧哥。插件里边挨个删除。。。你知道,这些插件都有业务逻辑的。。。删了这个还不行,每一个都得改业务逻辑。。。哪怕是注释,这tm也是工作量啊,最终行不通... 这也是可预期的,因为同样的插件,在另外一个工程里边,就没有问题!!!几乎是一模一样的插件列表啊,找到不同的那个,检查半天,也不对。
  6. 之所以说这么多过程,就是不想让你们做个伸手党,因为我花了这么长时间才研究出来的问题,最后原因却是很简单,看一眼就知道了。不卖卖关子实在是对不起你们各位看官。最终咋发现的?就是开始怀疑一切了,怀疑那个不作恶的谷歌,是不是故意整我们?怀疑他flutter架构设计有问题,怀疑flutter本身就有重大缺陷!于是开始研究flutter框架生成的插件集成的代码,就是,就是那个java文件:GeneratedPluginRegistrant.java,里边是各个插件注册的过程,自动生成的,丫就不严格!就是不严谨!还真就怀疑对了,算了,不扯淡,直接上结果吧,估计你们也很聪明,都知道跳过这些没用的文字了。哎,心急学不到解题思路啊,心急你就成长不了啊!

结果

也是过程,GeneratedPluginRegistrant这个文件里边,很多个插件,在第5步的时候,发现一个现象,我把出异常的这个插件替换掉之后,延续后面的一个插件立即报同样的错误。比如1、2、3、4、5、6个插件,现在第4个插件报错,我把4删了,就变成第5个插件报错,5删了就6报错。于是猜测是不是这几个插件根本就没有注册上,在这个java文件里边,增加了一个try-catch块,把1、2、3包住,打印异常信息,结果看日志一大堆错误。定位,就是这三个插件出问题的!整个环境是这样的,我们的项目也是插件制,common插件,其他插件,这两个大类,其他插件全部依赖common插件,common里边引入基础的其他插件。出错是在其中一个其他插件中,当然除了插件之外,还有一个主工程,主工程就没错,正常使用。调查发现,前段时间common插件中引入了百度地图插件,flutter的哦!!!更新太慢了!!!!安卓都更新一年了,flutter好像没有人维护了,要不你下架也行,我们自己做。不下架就找个人维护一下呗,搞的现在半半拉拉的。因为主工程用到百度地图,也没有任何错误,就没有怀疑到common插件的头上。发现报错的这三个插件,都是百度地图的组件,才意识到可能是common导致的,看看日志,百度地图要求工程的application必须继承自BMFMapApplication,否则就没有办法初始化,插件注册的时候就抛了个异常。牛拜的谷歌呢,缺心眼一点,把这个异常给吃了。并没有扔出来。但是出错了下面插件没有注册,实打实的,用到的时候自然就是找不到插件了。dart那边又没出问题,所以编译也不会有任何异常。

解决方案(以下方案任何一个都可以)

  1. 把百度地图从common中移除,放到需要用到它的插件里边,并且在那个插件的example中修改application。
  2. 给每一个用到common的插件,工程,都修改application。
  3. 抛弃百度插件。
  4. 不用flutter了,直接原生写android。
  5. 辞职。

感想

  1. 各位看官,你们遇到这个问题的话,可以直接把报错的插件去掉。看看如果还有其他插件报错的话,大部分情况应该是跟我这个类似了。也去加个try-catch看看吧。
  2. google有点不讲理,出错了你为啥要吃掉它,程序员就是靠着debug,靠着日志过日子的,异常你给吃了,我们吃啥!!!
  3. 百度有点... 一个插件,是否初始化,你在插件注册里边抛哪门子异常啊?没有baidu_api_key的时候,你咋知道在console打印一堆信息提醒我们去注册账号涅。你再多打印点问题日志不行么?
  4. 早就应该想到的...我真笨
0

评论区