You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMP/Compose Multiplatform中DataStore在JVM发布构建下失效求助

Kotlin Multiplatform桌面端DataStore发布构建无法返回edit()方法的问题

我正在开发面向Android和桌面端的Kotlin Multiplatform/Compose Multiplatform应用,打算用DataStore本地存储用户的刷新令牌及其他信息。按照Philipp Lackner的教程实现后,调试构建完全正常,但桌面端发布构建安装后功能失效。测试发现问题出在调用DataStore的edit()方法时:代码能进入方法并执行完内部所有逻辑,但始终无法从该方法返回,既不存储数据也不抛出错误。

我搞不懂为什么调试构建正常,发布构建却出问题。想问下有没有人在桌面端KMP项目里用过DataStore?发布构建下能正常工作吗?


要保存的对象

data class AuthInfo(
    val accessToken: String,
    val refreshToken: String,
    val userId: String,
    val email: String
) {
    companion object {
        fun getEmpty(): AuthInfo {
            return AuthInfo("", "", "", "")
        }
    }
}

创建DataStore实例的方法

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.datastore.preferences.core.Preferences
import okio.Path.Companion.toPath

fun createDataStore(producePath: () -> String): DataStore<Preferences> {
    return PreferenceDataStoreFactory.createWithPath(
        produceFile = { producePath().toPath() }
    )
}

internal const val DATA_STORE_FILE_NAME = "prefs.preferences_pb"

桌面端Koin模块

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import org.koin.dsl.module

actual val platformDataModule = module {
    single<DataStore<Preferences>> { createDataStore { DATA_STORE_FILE_NAME } }
}

使用DataStore的类

import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.withContext
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

class EncryptedSessionStorage(
    private val preferences: DataStore<Preferences>
) {

    private val preferencesFlow = preferences.data

    override suspend fun get(): AuthInfo? {
        return withContext(Dispatchers.IO) {
            val json = preferencesFlow.first()[KEY_AUTH_INFO]
            json?.let {
                Json.decodeFromString<AuthInfoSerializable>(it).toAuthInfo()
            }
        }
    }

    override suspend fun set(info: AuthInfo?) {
        withContext(Dispatchers.IO) {
            if(info == null) {
                preferences.edit {
                    it.minusAssign(KEY_AUTH_INFO)
                }
                return@withContext
            }

            val json = Json.encodeToString(info.toAuthInfoSerializable())
            preferences.edit {
                it[KEY_AUTH_INFO] = json
                // 代码执行到这里就停住了
            }
            // 永远不会走到这一步
        }
    }

    companion object {
        private val KEY_AUTH_INFO = stringPreferencesKey("KEY_AUTH_INFO")
    }
}

内容的提问来源于stack exchange,提问作者Damon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 09:05:08