在 Kotlin Proto DataStore 变量中实现 Getter 方法

问题描述 投票:0回答:1

所以,我定义了一个简单的数据类,如下:

@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 对象的方法中读取

提前致谢,

查尔斯。

android kotlin datastore
1个回答
0
投票

不,您不需要额外的功能来检索您的

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

© www.soinside.com 2019 - 2024. All rights reserved.