”总所周知“,在 Compose 中有个思想叫做状态提升,在之前的文章Compose学习笔记2 - LaunchedEffect、状态与 状态管理中我们曾提及过。
状态提升的目的是为了让我们的组件尽可能的”无状态“,无状态的优点:
- 可复用,组件只负责组件的职责,不持有或者少持有状态
- 可测试,组件不持有状态,更接近于纯函数,相同输入必然有相同输出
状态提升的想法很好,但是实践的时候可能并不美妙。
可能有点丑陋的状态提升
我们快速的写一个 TodoList,来演示一下状态提升可能存在的问题:
@Composable
fun TestStateHoisting() {
// 在顶层组件声明状态与改变状态的函数(称之为事件)
val list = useList<Todo>()
fun addTodo(todo: Todo) {
list.add(todo)
}
fun delTodo(id: String) {
list.removeIf {
it.id == id }
}
Surface {
Column {
//事件传递
Header(::addTodo)
TodoList(todos = list, ::delTodo)
}
}
}
data class Todo(val name: String, val id: String)
@Composable
fun Header(addTodo: (Todo) -> Unit) {
val (input, setInput) = useState("")
Row {
OutlinedTextField(
value = input,
onValueChange