Flutter_boost混编开发系统MethodChannel之坑

一、背景

Android、iOS原生项目集成Flutter混合开发,常见的接入方式flutter_boost管理维护路由栈,flutter引擎采用单引擎复用,新开发的Flutter页面采用Android原生Actvity路由栈管理,启动一个统一命名的FlutterBoostActvityImpl的接入actvity。

二、主体设计

flutetr_boost + 单引擎复用 + 单命名FlutterBoostActvityImpl ---- 这种模式。

说明:这个单命名FlutterBoostActvityImpl 表示定义了一个统一的接入Actvity类,但是启动模式默认标准,如果有多个flutter业务界面,可以启动多个相同该类名的对象。

三、认识PlatformChannel

这个业务类是Flutter封装的平台通信,用来和平台建立通道,请求设置系统的音效、状态栏、虚拟导航、剪切板等操作。

该业务类的创建时机:

复制代码
FlutterBoost.instance().setup()

即flutter引擎创建初始化(基于Flutter_boost)。

该类成员对象:

唯一的一个函数通过channel、内部成员对象 parsingMethodCallHandler、平台消息Handler对象platformMessagehandler,parsingMethodCallHandler 用来接受channel机制的函数调用,而parsingMethodCallHandler的函数调用根据不同case调用platformMessagehandler的不同实现。

问题: platformMessagehandler 对象什么设置的?

答案:Actvity创建、销毁两个时机。这就存在一个问题,如果关闭一个Flutter的Actvity再打开Flutter的Actvity,就可能因为onDestory的生命周期不确定性,致使最后打开的Flutter的Actvity操作所设置的该handler对象被替换污染,这个污染会时Fluuter业务代码操作该channel无效。

四、认识PlatformPlugin

这个业务类时平台插件,类关系:

构造函数入参:Activity、platformChannel、插件代理对象delegate等。

构造函数会设置channel的handler对象,这个对象 mPlatformMessagehandler就是传递给上述二中的PlatformChannel.PlatformMessageHandler对象。该对象是PlatformPlugin的一个内部成员对象,最终对channel机制的函数调用就执行到这里,调用了 PlatformPlugin 的业务实现(持有一个Actvity实例)。

构造函数执行时机:Actvity启动创建时机

上述红色框为例:

public void showSystemUiMode(@NonNull PlatformChannel.SystemUiMode mode) {

setSystemChromeEnabledSystemUIMode(mode);

}

该函数是Flutter侧通过SystemChrome设置状态栏模式。

到这里基本清楚了Flutter的业务调用。

五、理解系统PlatformChannel之坑

看了上述到简单分析,如果需要在Flutter界面采用类似如下:

Dart 复制代码
  void initState() {
    super.initState();
    SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
  }

用来设置系统状态栏模式沉浸模式。你可能会猜到了存在多个Actvity示例场景会发生状态栏模式设置概率失效的问题。

当然这个问题在纯Flutter开发单Actvity模式下是不存在的,发生在混合开发多Actvity场景。

怎么解决问题呢?

想到的方式是不使用原生的设置方式,自己建立一个MethodChannel,Actvity侧注册channel,建立通信调用原生设置。如果要和Actvity对象绑定,可以创建唯一性id传递给Flutter,并由Flutter调用回传给Actvity以实现唯一性对应匹配。

相关推荐
穆梓兰煊11 小时前
Flutter端云协同推理架构解析
flutter·github
FungLeo14 小时前
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全
flutter·网络安全·移动开发·webview·路由管理·成为全栈
m0_7381858215 小时前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
FungLeo16 小时前
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
m0_7381858216 小时前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙
FungLeo17 小时前
成为全栈·Flutter App 篇·服务端目录与文章辅助阅读:锚点、上下篇、浏览量和阅读历史
flutter·锚点·阅读体验·成为全栈·markdown目录·api契约
恋猫de小郭18 小时前
Flutter Android 改动:APK 不再允许通过 Intent 动态修改 Engine 参数
android·前端·flutter
小 黄 鸡1 天前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
大龄秃头程序员1 天前
Flutter 最少代码验证:为什么子 Isolate 调原生,一定要先回到主 Isolate?
flutter
FungLeo1 天前
成为全栈·Flutter App 篇·分类、标签与搜索:移动端内容发现
flutter·移动开发·标签·搜索·分类管理·成为全栈