ComposeView 的上下游继承关系及相关类/接口分析
2025年10月22日 19:59
ComposeView 的上下游继承关系及相关类/接口分析 一、ComposeView 的完整继承层次结构 1. 上游继承链(从基类到ComposeView) 2. 各层核心功能职责 BaseObje
KuiklyUI Pager是KuiklyUI框架中的核心组件,负责页面的创建、生命周期管理、视图渲染、事件分发和跨平台适配。Pager架构采用了清晰的分层设计和模块化思想,结合响应式编程模式,为跨平台应用提供统一的页面管理机制。
classDiagram
class IPager {
+pageData: PagerData
+lifecycleScope: CoroutineScope
+registerModule(module: IModule)
+bindValueChange(observer: ReactiveObserver)
+onCreatePager()
+pageDidAppear()
+pageDidDisappear()
}
class Pager {
+pagerData: PagerData
-modules: MutableMap<String, IModule>
-pagerEventObservers: MutableList<IPagerEventObserver>
+registerModule(module: IModule)
+onCreatePager()
+calculateLayout()
+dispatchViewEvent()
}
class PagerManager {
-pagerMap: MutableMap<String, IPager>
-pagerNameMap: MutableMap<String, String>
+createPager()
+destroyPager()
+getPager()
}
class PagerData {
+platform: String
+isAndroid: Boolean
+isIOS: Boolean
+safeAreaInsets: SafeAreaInsets
+windowSize: Size
}
class IPagerEventObserver {
+onPagerEvent(eventName: String, data: Any?)
}
class IPagerLayoutEventObserver {
+onPagerWillCalculateLayoutFinish()
}
IPager <|-- Pager
PagerManager "1" -- "*" IPager
Pager "1" -- "1" PagerData
Pager "1" -- "*" IPagerEventObserver
IPagerEventObserver <|-- IPagerLayoutEventObserver
定义了页面的核心能力接口,包括:
是IPager接口的主要实现,提供了页面管理的核心逻辑:
是Pager的管理中心,采用单例模式:
封装了页面相关的所有数据:
sequenceDiagram
participant PM as PagerManager
participant P as Pager
participant M as Modules
participant V as View
PM->>P: createPager()
P->>P: onCreatePager()
P->>M: module.init()
P->>P: createBody()
P->>P: calculateLayout()
P->>P: pageDidAppear()
P->>M: module.onPageAppear()
P->>V: renderView()
Note over P: 页面处于活动状态
P->>P: pageDidDisappear()
P->>M: module.onPageDisappear()
PM->>P: destroyPager()
P->>M: module.destroy()
创建阶段
onCreatePager():页面创建时调用,初始化页面数据和组件createBody():创建页面的根视图节点calculateLayout():计算页面布局可见阶段
pageDidAppear():页面显示在屏幕上时调用onPageAppear()方法不可见阶段
pageDidDisappear():页面从屏幕上消失时调用onPageDisappear()方法销毁阶段
destroyPager():销毁页面实例Pager架构的模块化设计允许灵活扩展功能,包括核心模块和外部模块:
// 模块注册示例
fun registerModule(module: IModule) {
if (!modules.containsKey(module.moduleName)) {
modules[module.moduleName] = module
module.init(this)
}
}
// 核心模块初始化
private fun initCoreModules() {
registerModule(NotifyModule())
registerModule(MemoryCacheModule())
registerModule(BackPressModule())
// ...其他核心模块
}
Pager采用观察者模式实现事件分发,支持多种类型的事件:
// 页面事件处理示例
fun handlePagerEvent(eventName: String, data: Any?) {
when (eventName) {
THEME_DID_CHANGED -> {
// 主题变化处理
calculateLayout()
}
ROOT_VIEW_SIZE_CHANGED -> {
// 根视图尺寸变化处理
updateWindowSize()
calculateLayout()
}
// ...其他事件处理
}
}
Pager实现了一套完整的布局计算流程,包含最大重试逻辑以防止布局循环:
fun calculateLayout() {
var retryCount = 0
val maxRetryCount = 4
while (retryCount < maxRetryCount) {
// 布局计算逻辑
if (!needRetryLayout) {
break
}
retryCount++
}
// 通知观察者布局计算完成
notifyLayoutEventObservers {
it.onPagerWillCalculateLayoutFinish()
}
}
Pager通过ReactiveObserver实现数据与视图的响应式更新:
// 数据绑定示例
fun bindValueChange(observer: ReactiveObserver) {
observers.add(observer)
}
// 响应式属性更新
fun updateReactiveProperty(value: Any) {
// 更新值
// 通知所有观察者
observers.forEach {
it.onValueChanged(value)
}
}
Pager通过BridgeManager实现与原生平台的通信:
// 跨平台通信示例
fun callNativeMethod(methodName: String, params: Map<String, Any?>): Any? {
return BridgeManager.callNative(methodName, params)
}
Pager通过createBody方法构建视图树:
// 视图树构建示例
override fun createBody(): FlexNode {
return FlexNode().apply {
style.flexDirection = FlexDirection.COLUMN
style.width = Dimension(100f, DimensionType.PERCENT)
style.height = Dimension(100f, DimensionType.PERCENT)
// 添加子视图
addChild(createContentNode())
}
}
fun renderView() {
// 将FlexNode渲染为原生视图
// 更新nativeRefViewMap
}
Pager维护nativeRefViewMap来管理原生视图引用,用于事件分发:
// 原生视图引用管理
private val nativeRefViewMap = mutableMapOf<String, Any>()
fun registerNativeView(refId: String, view: Any) {
nativeRefViewMap[refId] = view
}
fun getNativeView(refId: String): Any? {
return nativeRefViewMap[refId]
}
Pager实现了模块和视图的延迟加载机制:
// 延迟任务调度
fun scheduleLazyTask(task: () -> Unit) {
addLazyTaskUtilEndCollectDependency(object : LazyTask {
override fun run() {
task()
}
})
}
Pager通过最大重试次数限制布局计算循环:
// 布局计算中的最大重试逻辑
var retryCount = 0
val maxRetryCount = 4
while (retryCount < maxRetryCount && needRetryLayout) {
// 布局计算
retryCount++
}
核心模块在页面创建时初始化,而外部模块可以按需注册:
// 核心模块初始化
private fun initCoreModules() {
// 注册核心模块
}
// 外部模块注册接口
fun registerModule(module: IModule) {
// 注册外部模块
}
Pager集成了PerformanceModule进行性能监控:
// 性能监控示例
fun startPerformanceMonitor(tag: String) {
val performanceModule = getModule<PerformanceModule>(PerformanceModule.MODULE_NAME)
performanceModule?.startMonitor(tag)
}
fun endPerformanceMonitor(tag: String) {
val performanceModule = getModule<PerformanceModule>(PerformanceModule.MODULE_NAME)
performanceModule?.endMonitor(tag)
}
PagerData中包含平台检测信息,方便开发者编写平台特定代码:
// 平台检测
val isAndroid = platform == PLATFORM_ANDROID
val isIOS = platform == PLATFORM_IOS
val isOhos = platform == PLATFORM_OHOS
// 使用示例
if (pagerData.isAndroid) {
// Android平台特定代码
} else if (pagerData.isIOS) {
// iOS平台特定代码
}
PagerData包含安全区域信息,支持刘海屏等异形屏适配:
// 安全区域信息
val safeAreaInsets = SafeAreaInsets(
top = 44f, // iOS刘海高度
bottom = 34f, // iOS底部安全区高度
left = 0f,
right = 0f
)
// 使用示例
bodyNode.style.paddingTop = Dimension(pagerData.safeAreaInsets.top, DimensionType.POINT)
// 自定义页面示例
class MyCustomPage : Pager() {
override fun onCreatePager() {
super.onCreatePager()
// 初始化页面数据
initPageData()
// 注册自定义模块
registerModule(MyCustomModule())
}
override fun createBody(): FlexNode {
return FlexNode().apply {
style.flexDirection = FlexDirection.COLUMN
style.width = Dimension(100f, DimensionType.PERCENT)
style.height = Dimension(100f, DimensionType.PERCENT)
// 构建UI
addChild(createHeader())
addChild(createContent())
addChild(createFooter())
}
}
private fun initPageData() {
// 初始化数据
}
// 生命周期方法重写
override fun pageDidAppear() {
super.pageDidAppear()
// 页面显示时的逻辑
}
override fun pageDidDisappear() {
super.pageDidDisappear()
// 页面隐藏时的逻辑
}
}
// 模块使用示例
class MyCustomModule : IModule {
override val moduleName: String = "MyCustomModule"
private lateinit var pager: IPager
override fun init(pager: IPager) {
this.pager = pager
// 初始化模块资源
}
override fun onPageAppear() {
// 页面显示时执行
}
override fun onPageDisappear() {
// 页面隐藏时执行
}
override fun destroy() {
// 释放模块资源
}
}
// 在页面中使用模块
val myModule = getModule<MyCustomModule>("MyCustomModule")
myModule?.doSomething()
// 响应式数据绑定示例
class MyData {
var title by mutableStateOf("Default Title")
var count by mutableStateOf(0)
}
// 在页面中绑定数据
val myData = MyData()
// 绑定到视图
bindValueChange(object : ReactiveObserver {
override fun onValueChanged(value: Any) {
when (value) {
is String -> {
// 更新标题视图
}
is Int -> {
// 更新计数视图
}
}
}
})
// 更新数据触发视图更新
myData.title = "New Title"
myData.count = 42
KuiklyUI Pager架构设计体现了现代跨平台UI框架的核心思想,通过清晰的分层设计、模块化架构、响应式编程和跨平台适配,为开发者提供了强大而灵活的页面管理能力。Pager架构的主要优势包括:
通过合理利用Pager架构的特性,开发者可以构建高性能、可维护的跨平台应用。