Jetpack Compose 道具输入
Jetpack Compose props typing
我正在寻找一种优雅的方式来键入可组合函数参数。我习惯了 React,你可以在其中传递一个 props
参数,而不必拥有一百万个参数。
作为参考,什么是最干净的方法来处理这样的事情
interface MyCompProps {
foo: string
bar: number
}
function MyComp(props: MyCompProps) {...}
使用 Compose?
我是否必须创建一个 class 并在构建道具时实例化一个?我使用地图吗?是不是思路不对?
现在我正在做类似
的事情
class ProjectListItemProps(
val imageUrl: String,
val projectName: String,
val createdAt: String
)
@Composable
fun ProjectListItem(props: ProjectListItemProps) {...}
是的。在 Android 中,建议创建数据 classes 以将数据对象表示为实体。
例如,在笔记应用中,您可以创建一个笔记数据 class,如下所示:
data class Note(
var id: String = "",
var dateAdded: Long = 0,
var title: String = "",
var textContent: String = "",
var isFavorite: Boolean = false,
)
然后在 compose 中,您可以创建一个代表 UI:
中的注释的可组合项
@Composable
fun Note(note: Note){
//child composables
}
但是如果参数不代表一个实体,比如是否显示ProgressBar,你不应该把它放在class.
请记住,在 Kotlin 中您可以使用默认参数,然后当您调用函数时,只有当您想要传递一个不同于默认值的值时才传递参数。
示例:
@Composable
fun Page(showProgressBar: Boolean = false){
//child composables
}
如果你在没有传递任何参数的情况下调用 Page,它不会显示进度条,因为默认情况下 showProgressBar = true
。但是如果想显示它你传递 true
来覆盖默认值:
Note() /*progress bar is hidden.*/
Note(showProgressBar = true) /*progress bar is shown*/
我认为检查框架提供的 Composables
的设计是个好主意。
例如:
LazyColumn(
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
) {
// ...
}
简而言之,是的,这是个好主意,我会用它来对属性进行分组。
我正在寻找一种优雅的方式来键入可组合函数参数。我习惯了 React,你可以在其中传递一个 props
参数,而不必拥有一百万个参数。
作为参考,什么是最干净的方法来处理这样的事情
interface MyCompProps {
foo: string
bar: number
}
function MyComp(props: MyCompProps) {...}
使用 Compose?
我是否必须创建一个 class 并在构建道具时实例化一个?我使用地图吗?是不是思路不对?
现在我正在做类似
的事情class ProjectListItemProps(
val imageUrl: String,
val projectName: String,
val createdAt: String
)
@Composable
fun ProjectListItem(props: ProjectListItemProps) {...}
是的。在 Android 中,建议创建数据 classes 以将数据对象表示为实体。
例如,在笔记应用中,您可以创建一个笔记数据 class,如下所示:
data class Note(
var id: String = "",
var dateAdded: Long = 0,
var title: String = "",
var textContent: String = "",
var isFavorite: Boolean = false,
)
然后在 compose 中,您可以创建一个代表 UI:
中的注释的可组合项@Composable
fun Note(note: Note){
//child composables
}
但是如果参数不代表一个实体,比如是否显示ProgressBar,你不应该把它放在class.
请记住,在 Kotlin 中您可以使用默认参数,然后当您调用函数时,只有当您想要传递一个不同于默认值的值时才传递参数。
示例:
@Composable
fun Page(showProgressBar: Boolean = false){
//child composables
}
如果你在没有传递任何参数的情况下调用 Page,它不会显示进度条,因为默认情况下 showProgressBar = true
。但是如果想显示它你传递 true
来覆盖默认值:
Note() /*progress bar is hidden.*/
Note(showProgressBar = true) /*progress bar is shown*/
我认为检查框架提供的 Composables
的设计是个好主意。
例如:
LazyColumn(
contentPadding = PaddingValues(horizontal = 16.dp, vertical = 8.dp),
) {
// ...
}
简而言之,是的,这是个好主意,我会用它来对属性进行分组。