Kotlin Multiplatform Development Help

iOS 迁移指南

本文档将引导您在项目中将 Compose Multiplatform 库升级至 1.7.0 及更高版本时需注意的 iOS 相关事项。

从 Compose Multiplatform 1.6.11 迁移至 1.7.0

移除 UIKitView 和 UIKitViewController 的 background 参数

已弃用的 UIKitViewUIKitViewController API 包含 background 参数,而新版 API 已移除该参数。该参数因冗余性被删除:

  • 如需为新实例设置交互视图背景,可通过 factory 参数实现

  • 如需支持背景动态更新,请将相关代码置于 update lambda 中

触摸或手势行为可能发生变化

新版默认的触摸行为采用延迟机制判断触摸事件应传递给交互视图还是其 Compose 容器:用户需保持静止至少 150 毫秒后,交互视图才会接收触摸事件。

如需恢复旧版触摸处理逻辑,可尝试新的实验性 UIKitInteropProperties 构造函数。通过设置 interactionMode 参数为 UIKitInteropInteractionMode.NonCooperative ,可使 Compose 直接将触摸事件传递给交互视图。

该构造函数标记为实验性,因为我们最终计划通过单一布尔值控制交互视图的可操作性。当前通过 interactionMode 显式定义的行为未来可能会改为自动推导。

accessibilityEnabled 更名为 isNativeAccessibilityEnabled 且默认关闭

旧版 UIKitViewUIKitViewController 构造函数的 accessibilityEnabled 参数已迁移并重命名为 UIKitInteropProperties.isNativeAccessibilityEnabled 属性,且默认值改为 false

isNativeAccessibilityEnabled 属性会为合并的 Compose 子树启用原生无障碍解析功能。除非交互视图需要丰富无障碍能力(如网页视图),否则不建议启用该属性。

关于该属性及其默认值的详细说明,请参阅 UIKitInteropProperties 类的代码文档

移除 onResize 参数

旧版 UIKitViewUIKitViewController 构造函数的 onResize 参数虽然能基于 rect 参数设置自定义框架,但不会影响 Compose 布局本身,导致使用不够直观。此外,该参数的默认实现需要正确处理交互视图的框架,并包含视图裁剪的具体实现细节。

替代方案:

  • 如需响应交互视图框架变化:

  • 如需设置交互视图框架,请使用 Compose 修饰符: sizefillMaxSize

部分 onReset 使用模式失效

同时使用非空 onReset lambda 与 remember { UIView() } 是不正确的实现方式。

参考以下代码:

val view = remember { UIView() } UIKitView(factory = { view }, onReset = { /* ... */ })

UIKitView 进入组合时,只会调用 factoryonReset 其中之一。因此若 onReset 非空,记忆化的 view 可能与实际显示的视图不同:组合函数退出时可能遗留视图实例,该实例会在重置时被复用,而非通过 factory 创建新实例。

正确做法是不要在构造函数中指定 onReset 值。若需要根据组合上下文执行交互视图的回调,建议通过 updateonReset 将回调存储在视图内部。

21 四月 2025