我有一个简单的类 Person,定义如下
data class User(
val id: String = "",
val name: String = "",
val surname: String = "",
...
)
然后我有一个 ProfileViewModel 类,它有两个方法
getUserById()
和updateUser()
class ProfileViewModel(private val id: String): ViewModel() {
var user: User = User()
fun getUserById() { ... }
fun updateUser() { ... }
}
之后我有一个带有表单的可组合函数,它应该能够将用户数据初始化到表单字段中,然后更新它们
@Composable
fun ProfileView(profileViewModel: ProfileViewModel() = viewModel()) {
Column () {
...
}
}
我可以在可组合函数中创建一些变量,然后在执行 userUpdate 时传递它们,但是 我如何使用干净且结构化的代码在 profileViewModel 类中使用用户变量执行这些操作?
你错过了这个谜题的一些关键部分。您需要将每个
User
的值存储在 List<User>
中以供短期使用或存储在数据库中以供长期使用。
我推荐一个数据库,这样你就可以在你的应用程序可能经历的各种状态下长期访问你的数据。您可以通过 本教程了解所有相关信息
这将允许您存储和以后访问
room
数据。我看到有几种方法可以做到这一点。您的初始代码看起来无法朝着好的方向发展。但是,请考虑以下更改:
避免ViewModel
User
你的
ViewModel
这样的技术,并适当地封装它。
State
您现在可以将 ViewModel
的当前值加载到您的可组合函数中。当客户更改他的详细信息时,信息将与 class ProfileViewModel(): ViewModel() {
val user = mutableStateOf<User>(User.dummy()) // initial value
fun getUserById(id: String) { /* Fetch user and set user */ }
fun updateUser() { /* Send the user object to the domain layer */ }
}
.同步
当您对此感到满意时,请考虑如何封装可变状态。不应公开可变对象和变量,因为代码的其他部分可以在不考虑其后果的情况下修改它。