我有一个简单的类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类中执行这些操作?
我看到了几种方法。您的初始代码看起来不能朝着好的方向发展。但是,请考虑以下变化:
避免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 */ }
}
现在可以将user
的当前值加载到可组合函数中。当客户端更改其详细信息时,信息将与ViewModel
同步。
当您对此感到满意时,请考虑如何封装可变状态。不应公开可变对象和变量,因为代码的其他部分可以在不考虑其后果的情况下对其进行修改。
您错过了这个谜题的一些关键部分。您需要将每个User
的值存储在短期使用的List<User>
或长期使用的数据库中。
我建议你建立一个数据库,这样你就可以长期访问你的应用程序可能经历的各个州的数据。您可以通过本教程了解room
,这是用ViewModel
实现持久数据结构的最佳方式。
这将允许您存储和稍后访问User
数据。