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为主页。具体见下图所示

 使用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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang 协程的实现原理

核心概念 要理解协程的实现, 首先需要了解go中的三个非常重要的概念, 它们分别是G, M和P, 没有看过golang源代码的可能会对它们感到陌生, 这三项是协程最主要的组成部分, 它们在golang的源代码中无处不在. G (goroutine) G是goroutine的头文字, goroutine可以解释为受管理的…

C++图形开发(6):落下后能弹起的小球

文章目录 1.重复下落的小球2.落下后能弹起的小球3.能上下反弹的小球4.符合重力的能上下反弹的小球 今天我们来尝试实现一个落地后可以弹起的小球 1.重复下落的小球 首先,我们要来实现一个小球的重复下落 我们知道,在前面的代码中(详见C图形…

ChatGPT与Excel结合_编写VBA宏

先来解释下什么是Excel vba宏 ⭐Excel VBA宏(Visual Basic for Applications)是一种用于在Microsoft Excel中自动化和扩展功能的编程语言。VBA允许用户编写自定义的脚本或宏,以便通过执行一系列指令来自动完成特定任务。 使用Excel VBA宏&a…

基于改进莱维飞行和混沌映射的金鹰优化算法(10种混沌映射随意切换),附matlab代码

“ 本篇文章对金鹰优化算法进行改进,首先通过引入混沌映射机制,对其群体进行初始化,增加金鹰个体的多样性;然后在金鹰个体的位置更新公式上引入改进的莱维飞行机制,提高搜索精度,帮助金鹰个体跳出局部最优。…

Work20230705

//main.c #include "uart4.h" extern void printf(const char *fmt, ...); void delay_ms(int ms) {int i,j;for(i 0; i < ms;i)for (j 0; j < 1800; j); }int main() {while(1){//将获取到的字符1发送到终端//hal_put_char(hal_get_char()1);hal_put_string…

监控系统Zabbix

zabbix概述 作为一个运维&#xff0c;需要会使用监控系统查看服务器状态以及网站流量指标&#xff0c;利用监控系统的数据去了解上线发布的结果&#xff0c;和网站的健康状态。 利用一个优秀的监控软件&#xff0c;我们可以&#xff1a; 通过一个友好的界面进行浏览整个网站…

【设计模式】第十七章:状态模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型&#xff0c;也称为对话式 AI 或聊天机器人&#xff0c;经过训练&#xff0c;内容丰富且全面。Bard 接受过大量…

Tkinter_使用Progressbar创建和管理进度条

前言 Progressbar是Tkinter库中的一个小部件&#xff0c;用于创建和管理进度条。它可以在图形用户界面中显示任务的进度&#xff0c;并提供了多种样式和配置选项。 使用Progressbar&#xff0c;你可以按照固定或不确定的进度展示任务的进行状态。它可以显示任务完成的百分比&am…

matplotlib设置坐标轴为象限模式

import numpy as np import matplotlib.pyplot as pltx np.linspace(-np.pi, np.pi, 1000) cosy np.cos(x) siny np.sin(x)plt.xlim(min(x), max(x)) plt.ylim(min(cosy), max(cosy)0.5) plt.plot(x, cosy) plt.plot(x, siny) # 设置坐标刻度 plt.xticks([-np.pi, -np.pi/2,…

微前端(拆分和细化,整合历史系统)

接入微前端 项目背景说明 假如我们完成了基于Vue2的项目&#xff0c;假设另外一个团队的小伙伴来实现前台可视化部分&#xff0c;他们使用的是最新的Vue3技术栈&#xff0c;现在有一个需求&#xff0c;他们的前台项目想直接使用我们的登录功能&#xff0c;获得token&#xff…

数据结构与算法(持续更新中..)

一. 概论 1. 数据结构 队列&#xff1a;一种遵循先进先出 (FIFO / First In First Out) 原则的一组有序的项&#xff1b;队列在尾部添加新元素&#xff0c;并从头部移除元素。最新添加的元素必须排在队列的末尾。&#xff08;例如&#xff1a;去食堂排队打饭&#xff0c;排在前…