This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
使用 Jetpack Compose 扩展
了解如何创建与 Expo UI 集成的自定义 Jetpack Compose 组件和修饰符
本指南介绍如何使用 Expo Modules API 创建自定义 Jetpack Compose 组件和修饰符,并将其集成到 Expo UI 中。
3 requirements
3 requirements
1.
@expo/ui 已安装更多信息,请参阅 Expo UI 中的 Jetpack Compose 组件。
2.
自定义 Expo 模块包含原生代码,而 Expo Go 无法加载这些代码。请为应用创建开发版本。
3.
本指南假设你熟悉 Expo Modules API 和 Jetpack Compose 的基本用法。
创建自定义组件
项目设置
1
在项目中创建本地 Expo 模块:
2
更新模块的 android/build.gradle,以启用 Jetpack Compose 并依赖 expo-ui。以下代码片段中的注释标出了需要添加到默认脚手架代码中的行:
创建 Compose 视图
3
创建 Compose 视图。它由两部分组成:
- Props 数据类:带有
@OptimizedComposeProps注解,实现ComposeProps,并包含一个modifiers: ModifierList字段,用于modifiers属性。 @Composable内容函数:FunctionalComposableScope的扩展函数,因此可以调用ModifierRegistry.applyModifiers(...)并渲染Children(...)。
4
使用 ExpoUIView 在模块中注册视图。这样可以将 @Composable 内容接入 Expo 模块视图系统,并使其可供 JavaScript 使用:
5
创建一个封装组件,将修饰符与事件处理连接起来。createViewModifierEventListener 工具函数可让 clickable 和 onVisibilityChanged 等基于事件的修饰符在自定义视图中正常工作:
6
从模块的入口点导出组件:
使用自定义组件
现在,你的自定义组件可以使用所有内置的 Expo UI 修饰符:
创建自定义修饰符
你也可以创建适用于任何 Expo UI 组件的自定义修饰符。
修饰符是 Compose 用来配置布局的方式,可用于设置样式、尺寸、行为等。更多信息请参阅 Android 的 Compose 修饰符文档。
原生修饰符实现
1
将修饰符的参数定义为 @OptimizedRecord 数据类。然后编写一个函数,根据这些参数返回 Modifier:
compose 是 expo.modules.ui 包中定义的 android.graphics.Color? Kotlin 扩展属性。通过 import expo.modules.ui.compose 导入后,你可以调用 params.color.compose,将从 JS 解析得到的 Android Color 转换为 Compose API(如 BorderStroke)所需的 androidx.compose.ui.graphics.Color。Expo UI 的内置修饰符也使用了同一个辅助工具。
2
在模块定义中使用 ModifierRegistry 注册修饰符。使用 OnCreate 注册,并使用 OnDestroy 注销,以免工厂在模块重新加载时发生泄漏:
register lambda 会接收从 JavaScript 传来的原始映射、当前的 ComposableScope(可用于 weight 或 align 等依赖作用域的修饰符)、ConverterContext 和事件分发器。大多数修饰符只需要映射和 ConverterContext,并将它们传递给 recordFromMap<T>(map, converterContext)。
JavaScript 修饰符函数
3
创建一个用于构建修饰符配置的 TypeScript 函数:
4
从模块中导出修饰符:
使用自定义修饰符
你的自定义修饰符适用于任何 Expo UI 组件:
后续步骤
现在,你的自定义组件可以使用内置修饰符系统。
以下是一些可以继续尝试的开发方向:
- 使用 Expo UI 内置的 Jetpack Compose 组件。
- 为应用特定的样式模式构建自定义修饰符。
- 封装第三方 Compose 库,以便在 React Native 中使用。
- 将组件作为 npm 包分享给其他人使用。