其他
Twitter 的 17 条 Compose 开发规范和检查:帮你避坑~
The following article is from TechMerger Author 小虾米君
翻译自:
https://twitter.github.io/compose-rules/rules/
❞
前言
的确,Compose 技术有很多超能力,但也存在很多容易犯的错(坑),这时候上面的静态检测 rules 便可以派上用场了。我们期望这些 rules 可以在正式 review 代码之前,便帮助开发者检测出尽可能多的、潜在的 Compose 使用问题,从而促进 Compose 技术的健康发展!
1. 保持状态的提升
状态的提升:https://developer.android.com/jetpack/compose/state#state-hoisting
不要向下传递 ViewModels 或来自 DI 带来的实例。 不要向下传递 State<Foo> 或 MutableState<Bar> 实例。
Compose 和状态文档:https://developer.android.com/jetpack/compose/state
2. 记住状态
3. 使用 @Immutable
不可变文档:https://developer.android.com/reference/kotlin/androidx/compose/runtime/Immutable 可组合度量:https://chris.banes.dev/composable-metrics
4. 不使用不稳定的集合声明
val list:List<String> = mutableListOf<String>()
val list:ImmutableList<String> = persistentListOf<String>()
@Immutable
data class StringList(val items: List<String>)
// ...
val list:StringList = StringList(yourList)
注意:最好使用 Kotlinx 中定义的不可变集合接口类型和方法。因为你可能也发现了,虽然后者通过注解强调了它是不可变的,但其实其内部的 List 仍然是可变的。
Jetpack Compose 稳定性详解:https://medium.com/androiddevelopers/jetpack-compose-stability-explained-79c10db270c8 Kotlinx 不可变集合:https://github.com/Kotlin/kotlinx.collections.immutable
该 rule 的名称和源码:unstable-collections -> ComposeUnstableCollections.kt
5. 不采用可变类型作函数参数
本条规则是由上面提到的“状态提升”规则延伸出来的。
6. 不要同时发射布局又返回结果
Compose API guidelines:https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md#emit-xor-return-a-value
注意:你可以将 composeEmitters 添加到 Detekt 规则配置中,或将 compose_emitters 添加到 ktlint 中的 .editorconfig 配置中。
7. 不要发射多片段的布局节点
Column {
InnerContent()
}
@Composable
private fun InnerContent() {
Text(...)
Image(...)
Button(...)
}
@Composable
private fun InnerContent() {
Column {
Text(...)
Image(...)
Button(...)
}
}
@Composable
private fun ColumnScope.InnerContent() {
Text(...)
Image(...)
Button(...)
}
8. 恰当命名 CompositionLocals 变量
Naming CompositionLocals:https://android.googlesource.com/platform/frameworks/support/+/androidx-main/compose/docs/compose-api-guidelines.md#naming-compositionlocals
9. 恰当命名 multipreview 注解
Multipreview annotations:https://developer.android.com/jetpack/compose/tooling#preview-multipreview
10. 恰当命名可组合函数
Kotlin Coding Conventions:https://kotlinlang.org/docs/reference/coding-conventions.html#function-names
Naming Unit @Composable functions as entities:https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md#naming-unit-composable-functions-as-entities Naming @Composable functions that return values:https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md#naming-composable-functions-that-return-values
11. 有序定义可组合函数的参数
Kotlin default arguments:https://kotlinlang.org/docs/functions.html#default-arguments Modifier docs:https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier Elements accept and respect a Modifier parameter:https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md#why-8
12. 显示声明依赖关系
ViewModels
@Composable
private fun MyComposable() {
val viewModel = viewModel<MyViewModel>()
}
@Composable
private fun MyComposable(
viewModel: MyViewModel = viewModel(),
) { ... }
CompositionLocals
合法用例:https://developer.android.com/jetpack/compose/compositionlocal#deciding
注意:要将自定义的 CompositionLocal 添加到允许列表中,可以在 Detekt 的规则配置中添加 allowedCompositionLocals 或在 ktlint 的 .editorconfig 中添加 allowed_composition_locals 。
13. 声明仅支持预览的函数为 private
注意:如果您使用 Detekt,这可能会与 Detekt 的 UnusedPrivateMember 规则冲突。请务必将 Detekt 的 ignoreAnnotated 配置设置为['预览'],以便与此规则兼容。
14. 尽量提供 Modifier 参数
Always provide a Modifier parameter:https://chris.banes.dev/posts/always-provide-a-modifier
15. 不重复使用 Modifiers
@Composable
private fun InnerContent(modifier: Modifier = Modifier) {
Column(modifier) {
Text(modifier.clickable(), ...)
Image(modifier.size(), ...)
Button(modifier, ...)
}
}
@Composable
private fun InnerContent(modifier: Modifier = Modifier) {
Column(modifier) {
Text(Modifier.clickable(), ...)
Image(Modifier.size(), ...)
Button(Modifier, ...)
}
}
16. Modifier 应当具备默认的参数
Modifier documentation:https://developer.android.com/reference/kotlin/androidx/compose/ui/Modifier
17. 避免使用扩展函数构建 Modifier
Modifier extensions:https://developer.android.com/reference/kotlin/androidx/compose/ui/package-summary#extension-functions Composed modifiers in Jetpack Compose by Jorge Castillo:https://jorgecastillo.dev/composed-modifiers-in-jetpack-compose Composed modifiers in API guidelines:https://github.com/androidx/androidx/blob/androidx-main/compose/docs/compose-api-guidelines.md#composed-modifiers
Using with ktlint:https://twitter.github.io/compose-rules/ktlint Using with Detekt:https://twitter.github.io/compose-rules/detekt
https://github.com/ellisonchan/ComposeBird
规则文档的开源地址
译者备注
The future of this project?
最后推荐一下我做的网站,玩Android: wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!
推荐阅读:
扫一扫 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!