因此,我定义了一个简单的数据类,如下所示:@Serializabledata class UserSession( var name: String = \'\', val isEnrolled: Boolean = false,)此类与另一个 Ko...
因此,我定义了一个简单的数据类,如下所示:
@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”方法?或者,有必要这样做吗?
我发现的其他示例总是谈论实现 Preferences DataStore...但事实并非如此。我只想确保我感兴趣的变量在应用程序重启后仍然存在,并且可以在我的 UserSessionViewModel 对象的方法中读取
提前致谢,
查尔斯。
不,您不需要额外的函数来检索您的部分内容 UserSession
。流程已返回所需的一切 userSession
。
也就是说,您应该只在视图模型中公开 StateFlows:
val userSession: StateFlow<UserSession?> = store.data.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = null,
)
这样,内容的 userSession
行为就更像一个变量:StateFlow 始终具有一个 value
属性。如果您只对当前用户名感兴趣,则可以调用此方法:
viewModel.userSession.value?.name
不过,通常您只想定期收集流量。然后您可以访问收集的值来检索属性 name
。