目录
简介
- 最近,我一直在尝试寻找方法来重构我的JetPack组合功能,值得庆幸的是,我偶然发现了Twitter Compose composeset,可以找到HERE。
-
Twitter Compose Ruleset
实际是什么,是一组自定义的KTLINT规则,以确保您的组合不会陷入常见的陷阱,这在代码评论中可能很容易错过。您甚至可以找到有关如何使用Ktlin HERE进行设置的教程。但是目前,我们将专注于我最新应用中的一些代码。
我在北美针对养牛场的最新应用程序
github
我们将要重构的代码:
- 以下代码是我们将通过应用HERE的规则来重构的代码
@Composable
fun CalendarDock(viewModel: EditCalfViewModel){
val calfDate = viewModel.uiState.value.birthDate!!
val convertedDate = calfDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
val selectedDate = remember {
mutableStateOf<LocalDate?>(convertedDate)
}
val calendarState = rememberSheetState()
CalendarDialog(
state = calendarState,
config = CalendarConfig(
monthSelection = true,
yearSelection = true
),
selection = CalendarSelection.Date(selectedDate = selectedDate.value){ newDate ->
selectedDate.value = newDate
viewModel.updateDate(newDate)
}
)
Row(
horizontalArrangement = Arrangement.SpaceBetween) {
OutlinedTextField(
//state
enabled = false,
value = "Date born: "+ selectedDate.value.toString(),
onValueChange = { },
//style
singleLine = true,
placeholder = {
Text(text = "Date", fontSize = 20.sp)
},
modifier = Modifier
.fillMaxWidth(),
textStyle = TextStyle(fontSize = 20.sp),
)
}
}
错误1:将ViewModel作为参数传递
- 在组合函数的签名中注意我正在视图模型中作为参数传递:
fun CalendarDock(viewModel: EditCalfViewModel)
- 如RULES中所述
错误2:无修饰符参数
- 注意以上代码如何没有
modifier
参数。编写代码时,这是一个严重的危险信号。每个可复合的函数(是的,我的确是指每个组合函数)都应具有修饰符参数。这样做的主要原因是因为它促进了灵活性和代码重复使用,但是如果您想深入了解,我建议您阅读博客文章HERE
错误3:修饰符参数的位置
- 添加修饰符参数时,我们应确保将其添加在正确的位置。当添加参数以组合函数时,强制性参数首先出现,然后出现修饰符参数。修饰符参数应占据第一个可选参数插槽,以为其他开发人员设置一致的例外。这意味着随着我们的项目发展,我们为团队增加了更多人,他们可以期待一致的编程经验。
错误4:修饰符应具有默认参数
-
作为规则状态:
Composables that accept a Modifier as a parameter to be applied to the whole component represented by the composable function should name the parameter modifier and assign the parameter a default value of Modifier
. -
如果您有一个修饰符参数,则应给它一个修饰符的默认值
重构代码:
- 因此,所有这些规则都应用了我们的重构代码,现在看起来像这样:
@Composable
fun CalendarDock2(dateBorn: Date,selectedAction:(LocalDate)->Unit,modifier: Modifier = Modifier){
val convertedDate = dateBorn.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
val selectedDate = remember { mutableStateOf<LocalDate?>(convertedDate) }
val calendarState = rememberSheetState()
CalendarDialog(
state = calendarState,
config = CalendarConfig(
monthSelection = true,
yearSelection = true
),
selection = CalendarSelection.Date(selectedDate = selectedDate.value){ newDate ->
selectedDate.value = newDate
selectedAction(newDate)
}
)
Row(
horizontalArrangement = Arrangement.SpaceBetween,
) {
OutlinedTextField(
//state
enabled = false,
value = "Date born: "+ selectedDate.value.toString(),
onValueChange = { },
//style
singleLine = true,
placeholder = {
Text(text = "Date", fontSize = 20.sp)
},
modifier = modifier,
textStyle = TextStyle(fontSize = 20.sp),
)
}
}
结论
- 感谢您抽出宝贵的时间阅读我的博客文章。如果您有任何疑问或疑虑,请在下面发表评论或在Twitter上与我联系。