添加try/catch后Realm代码出现Unresolved reference的解决咨询
问题原因与解决方案
问题根源
你添加的try/catch块导致appServiceInstance的类型变为Unit,而非Realm的App类型——因为Kotlin lambda的返回值是最后一行表达式的结果,你的catch块最后执行的是Logger.e(e.stackTraceToString())(返回Unit),所以整个lazy委托的变量类型被推断为Unit,自然无法找到currentUser属性。
修复方案
需要确保lazy块始终返回App类型的实例(或显式声明可空类型并处理null场景),以下是两种可行方案:
方案1:创建失败时重新抛出异常(推荐,因为后续同步逻辑依赖App实例)
修改appServiceInstance的lazy初始化块,在catch中记录日志后重新抛出异常,保证变量类型为App:
private val appServiceInstance by lazy { // If logs are on app level then it set for everything .. val configuration = AppConfiguration.Builder("application-0-rpbsh") .log(LogLevel.ALL).build() try { App.create(configuration) } catch (e: Exception) { Logger.e("Exception caught: ${e.message}") Logger.e(e.stackTraceToString()) throw e // 重新抛出异常,确保lazy块返回App类型 } }
方案2:允许返回null并在后续逻辑中处理
如果需要容忍App创建失败的场景,可显式声明变量为可空类型,在catch中返回null,并在setupRealmSync中做非空校验:
// 显式声明类型为App? private val appServiceInstance: App? by lazy { val configuration = AppConfiguration.Builder("application-0-rpbsh") .log(LogLevel.ALL).build() try { App.create(configuration) } catch (e: Exception) { Logger.e("Exception caught: ${e.message}") Logger.e(e.stackTraceToString()) null // 返回null } } private fun setupRealmSync() { // 先校验App实例是否存在 val app = appServiceInstance ?: throw IllegalStateException("Failed to initialize Realm App instance") val user = runBlocking { app.currentUser!! } // 后续代码保持不变 }
额外提示
如果currentUser是异步获取的(Realm某些版本中currentUser是suspend属性),建议将setupRealmSync改为suspend函数,避免使用runBlocking阻塞线程:
private suspend fun setupRealmSync() { val user = appServiceInstance.currentUser!! // 后续代码不变 }
内容的提问来源于stack exchange,提问作者user443654
相关产品推荐
相关产品推荐

