所以,我定义了一个简单的数据类,如下:
@Serializable
data class UserSession(
var name: String = "",
val isEnrolled: Boolean = false,
)
该类与另一个 Kotlin 类 UserSessionViewModel 相关,如下:
class UserSessionViewModel(
private val application: Application,
private val store: DataStore<UserSession>,
) : AndroidViewModel(application), KoinComponent {
/**
* A [Flow] representing the current [UserSession].
* It emits every time the user session is updated.
*/
val userSession: Flow<UserSession>
get() = store.data
/**
* Enrolls the user in the application.
* Updates the `isEnrolled` property of [UserSession] to true.
*/
fun enroll() {
viewModelScope.launch {
store.updateData {
it.copy(isEnrolled = true)
}
}
}
/**
* Caches the given name in the [UserSession].
*
* @param name The name to be cached.
*/
fun cacheName(name: String) {
viewModelScope.launch {
store.updateData {
it.copy(name = name)
}
}
}
fun getEnrolledName(): String {
val enrolledName: String
viewModelScope.launch {
store.<proper-method?> {
//does this work?
enrolledName = it.let(name)
}
return enrolledName
}
//and other, similar write-only methods into the data-store
}
我的问题:如何在这些变量之一中实现一个简单的“getter”方法? 或者说,有必要这样做吗?
我发现的其他示例总是谈论实现首选项数据存储......事实并非如此。 我只是想确保我感兴趣的变量在应用程序重新启动后仍然存在,并且可以在我的 UserSessionViewModel 对象的方法中读取
提前致谢,
查尔斯。
不,您不需要额外的功能来检索您的
UserSession
的部分内容。所需的一切都已由 userSession
流返回。
也就是说,您应该只在视图模型中公开 StateFlow:
val userSession: StateFlow<UserSession?> = store.data.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = null,
)
这样,
userSession
的内容表现得更像变量:StateFlow 始终具有 value
属性。如果您只对当前用户名感兴趣,可以这样调用:
viewModel.userSession.value?.name