flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题

这篇具有很好参考价值的文章主要介绍了flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景
  工程使用了混合开发,使用flutter boost插件,flutter 的activity1 frament1 跳转activity2 frament2,frament1 包含platformView,按照上面老哥解决崩溃问题的基础上,出现activity2 frament2返回activity1 frament1时,platformView触摸事件没有响应。问题具体见:https://github.com/alibaba/flutter_boost/issues/1755

分析

   项目主页使用platview实现了webview功能,即ctivity1 frament1为主页。具体见下图所示

flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题,flutter

 使用AndroidView,flutter3.7上底层使用PlatformViewWrapper作为容器,底层事件是先被PlatformViewWrapper接收,在onTouchEvent中分发到Dart,然后到dart层,然后再分发到PlatformViewsController分发到platformView,具体见:Flutter 之快速理解混合开发里的手势事件传递 - 掘金

  调试时,发现activity2 frament2返回时,在activity1 frament1 已经在PlatformViewsController已经attach,activity2的onDestroy触发flutterboostfragment的onDetach,最终调用了PlatformViewsController又执行一次detach方法,导致platformViewsChannel被置为空,触摸事件没法传递过来
/**

  • Detaches this platform views controller.
  • This is typically called when a Flutter applications moves to run in the background, or is

  • destroyed. After calling this the platform views controller will no longer listen to it's
  • previous messenger, and will not maintain references to the texture registry, context, and
  • messenger passed to the previous attach call.
    */
    @UiThread
    public void detach() {
    if (platformViewsChannel != null) {
    platformViewsChannel.setPlatformViewsHandler(null);
    }
    destroyOverlaySurfaces();
    platformViewsChannel = null;
    context = null;
    textureRegistry = null;
    }

解决
  把platformViewsChannel重新attach,恢复platformViewsChannel,能让activity1 frament1 的platformView重新获取触摸事件。


实现:
activity2的onDestroy时,异步去调用 flutterEngine.getPlatformViewsController().attach(getContextActivity(), flutterEngine.getRenderer(), flutterEngine.getDartExecutor()); 前提是判断frament1处于可见状态,且处于detach状态
兼容:
PlatformViewsController在attach时有个判断context是否为空,如下所示:
public void attach(
@nullable Context context,
@nonnull TextureRegistry textureRegistry,
@nonnull DartExecutor dartExecutor) {
if (this.context != null) {
throw new AssertionError(
"A PlatformViewsController can only be attached to a single output target.\n"
+ "attach was called while the PlatformViewsController was already attached.");
}
this.context = context;
this.textureRegistry = textureRegistry;
platformViewsChannel = new PlatformViewsChannel(dartExecutor);
platformViewsChannel.setPlatformViewsHandler(channelHandler);
}
因此在上面老哥重写的FlutterBoostPlatformViewsController中覆盖attach方法添加detach()下兼容处理,避免快速切换,context不为空的AssertionError问题
@OverRide
public void attach(
@nullable Context context,
@nonnull TextureRegistry textureRegistry,
@nonnull DartExecutor dartExecutor) {
//fixMe super.attach里面需要context为空,否则直接抛异常,而在生命周期里面设置会因为快速点击不够实时设置导致异常
//因此,在attach之前先重置下,当官方解决问题可以移除这个代码
detach();
super.attach(context,textureRegistry,dartExecutor);
}文章来源地址https://www.toymoban.com/news/detail-538796.html

到了这里,关于flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Flutter iOS 集成使用 flutter boost

    在 Flutter项目中集成完 flutter boost,并且已经使用了 flutter boost进行了路由管理,这时如果需要和iOS混合开发,这时就要到 原生端进行集成。 注意:之前建的项目必须是 Flutter module 项目,并且原生项目和flutter module项目在同一个文件夹下面 下面是原生端集成 flutter boost的步骤

    2024年02月13日
    浏览(25)
  • 修改Flutter3.19.2SDK的镜像源为国内镜像源 解决一直卡在Running Gradle task ‘assembleDebug‘与Executfailed for task ‘app:x‘

    该文档仅为个人解决记录 参考自:https://blog.csdn.net/qq_39105508/article/details/133992154 在 flutter3.19.2packagesflutter_toolslibsrc 下的 http_host_validator.dart 文件中,找到 const String kMaven = \\\'https://maven.google.com/\\\'; ,将 Flutter SDK 使用的 maven 镜像修改为国内镜像 参考自:https://blog.csdn.net/libra_

    2024年04月17日
    浏览(46)
  • Flutter iOS 集成使用 fluter boost

    在 Flutter项目中集成完 flutter boost,并且已经使用了 flutter boost进行了路由管理,这时如果需要和iOS混合开发,这时就要到 原生端进行集成。 注意:之前建的项目必须是 Flutter module 项目,并且原生项目和flutter module项目在同一个文件夹下面 下面是原生端集成 flutter boost的步骤

    2024年02月14日
    浏览(31)
  • 关于visual studio 2010 及以上版本 引入boost库的最新解决方法

    之前没有怎么用到boost库,出来实习需要去编译一些代码,需要引入boost第三方库,在这过程中,一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误, 但是也确实是跟其他教程学过来的, 最后估计应该还是引入库的问题 大家有疑问的可以按照这个

    2024年02月12日
    浏览(36)
  • Chrome浏览器118版本崩溃“STATUS_INVALID_IMAGE_HASH”的几种解决方式

    2023年11月18日更新:如果使用了【禁用更新的安装包】后依然会在打开“关于”页面时自动更新,可以考虑搜索一下“禁用Chrome更新”的方法,把update文件夹设个权限一劳永逸。 目前看来似乎仍有自动更新的问题,一更新就会爆炸,到底是为什么我也不清楚,118、119版本都会

    2024年02月08日
    浏览(77)
  • flutter 开发应用 上架到 testFlight 闪退崩溃

    现象描述: 本地模拟器和真机运行正常,上架到testFlight 一直崩溃闪退。 解决思路: 1、进行崩溃日志分析 ❌-》没有结果 iOS上获取崩溃日志的N+1种方法_plcrashreport-CSDN博客 mac 台式机上可以安装testflight 也可以进行测试 也可以分析崩溃日志 2、进行排除法 对错误地方进行定位

    2024年02月07日
    浏览(39)
  • 解决win10相机无法使用,相机崩溃问题

    win10系统可能因很多原因无法使用,例如权限设置,或者win10系统本身问题,此教程教大家如何解决 1、进入电脑系统设置,在里面找到”隐私“,并点击进入 2、进入隐私设置界面后,向下滑动找到”相机“,并点击进入相机设置 3、在相机设置界面将“此设备的相机访问权限

    2024年02月04日
    浏览(36)
  • 服务器断电导致mysql崩溃,使用恢复模式的解决步骤

    2024-02-18T08:45:58.039432Z 0 [ERROR] InnoDB: Page [page id: space=0, page number=238] log sequence number 8738273916 is in the future! Current system log sequence number 8738272796. 2024-02-18T08:45:58.039450Z 0 [ERROR] InnoDB: Your database may be corrupt or you may have copied the InnoDB tablespace but not the InnoDB log files. Please refer to http://dev.

    2024年02月22日
    浏览(38)
  • flutter版本升级后,解决真机和模拟器运行错误问题

    flutter从3.3.2升级到3.16.0,项目运行到真机和模拟器报同样的错,错误如下: 解决办法:在android目录下的build.gradle加入下面这行,如下图: 重新运行,正常把apk安装到真机上或者运行到模拟器上

    2024年01月22日
    浏览(39)
  • 【ubuntu】查看Boost库的版本

    目录 查看Boost库的版本 要查看Boost库的版本,可以使用以下命令: 这个命令会在Boost库的版本头文件中查找并显示BOOST_LIB_VERSION宏定义的值,该值表示Boost版本号。运行命令后,你将看到类似下面的输出: 请注意,命令的路径可能因操作系统或Boost库的安装位置而有所不同。

    2024年04月29日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包