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
相关产品推荐
相关产品推荐

