Decompose是一个Kotlin多平台库,用于将代码分解为树状结构的生命周期感知业务逻辑组件(又称BLoC),具有路由功能和可插拔UI(Jetpack/Multiplatform Compose、Android Views、SwiftUI、Kotlin/React等)。
请查看项目网站获取文档和API。
如果您有任何问题或想法,可以在讨论部分进行交流。也欢迎加入Kotlin Slack频道 - #decompose!
⚡⚡⚡ 所有的星标、问题、讨论、拉取请求等去哪了?
在Badoo/Bumble工作了5年后,我现在开始了另一个冒险。作为过渡的一部分,我被要求将这个仓库转移到Badoo GitHub账户。
现在我以副本形式继续这个项目的工作。
这次转移不应该造成任何破坏性变化。大多数外部链接应该没有失效。仓库链接也保持不变:arkivanov/Decompose。如果您认为有什么地方损坏或不正常工作,请在这个仓库中提交问题。
以下是受转移影响最大的方面:
- 所有星标都被转移了
- 所有问题和讨论也被转移了。我会尽最大努力填补这里的空白。
- 所有带有评论历史的拉取请求也都消失了。
我将继续为这个项目和社区尽我所能!一切照常进行!
其他资源:
为什么选择Decompose?
- Decompose将代码分解成小而独立的组件,并将它们组织成树状结构。每个父组件只知道其直接子组件。
- Decompose在UI和非UI代码之间划清界限,带来以下好处:
- 更好的关注点分离
- 可插拔的平台特定UI(Compose、SwiftUI、Kotlin/React等)
- 业务逻辑代码可通过纯多平台单元测试进行测试
- 导航状态完全暴露 - 可插入任何您想要的UI,使用您喜欢的UI框架API或预定义API进行动画处理。
- 导航是从旧状态到新状态的纯函数 - 无限制导航。
- 通过构造函数进行适当的依赖注入(DI)和控制反转(IoC),包括但不限于类型安全参数。
- 共享导航逻辑
- 生命周期感知组件
- 后台栈中的组件不会被销毁,它们在后台继续工作,无需UI
- 状态保存(在Android上自动,在其他目标上通过
kotlinx-serialization
手动保存) - 实例保留(又称ViewModels)以应对配置更改(主要适用于Android)
表情时间!
设置
请查看文档的安装部分。
支持的平台
总的来说,Decompose支持以下目标:android
、jvm
、ios
、watchos
、tvos
、macos
、wasmJs
、js
。然而,某些模块不支持所有目标,或者支持取决于Decompose的版本。详情请参阅安装文档。
概述
以下是该库的一些关键概念,更多细节可以在文档中找到。
- 组件 - 每个组件代表一段具有自己生命周期的逻辑,UI是可选的,可从外部插入
- ComponentContext - 每个组件都有自己的[ComponentContext],使组件具有生命周期感知能力,并允许状态保存、实例保留(类似于AndroidX的
ViewModel
)和返回按钮处理 - 子堆栈 - 实现子组件之间的导航,也支持嵌套导航
- 子槽 - 一次只允许一个子组件,或者没有
- 子页面 - 一个子组件列表,有一个选定的组件(例如类似分页器的导航)
- 通用导航 - 提供一种方法来创建自定义导航模型,当预定义模型都不适合您的需求时
- 生命周期 - 提供一种方法在组件中监听生命周期事件
- StateKeeper - 使组件在被销毁时能够保存状态或数据
- InstanceKeeper - 在组件中保留实例(类似于AndroidX的
ViewModel
) - BackPressedHandler - 提供一种方法来处理和拦截返回按钮按压
组件层次结构
可插拔UI层次结构
典型组件结构
快速开始
请参考文档的快速开始部分。
示例
查看文档的示例部分,了解每个示例的完整描述。
模板
查看模板仓库,它可以用来快速启动您的项目。
文章
-
Jetpack/多平台Compose的全面三十行导航 - 如果您觉得Decompose太冗长,想要基于Compose构建的东西。
-
"基于组件的方法"系列,作者:Artur Artikov
- 第1部分:在Android应用中对抗复杂性
- 第2部分:使用Decompose库实现屏幕
作者
Twitter:@arkann1985