gpt4 book ai didi

android - 如何使用挂起函数作为参数在 View 模型中初始化流

转载 作者:行者123 更新时间:2023-12-04 23:58:42 25 4
gpt4 key购买 nike

我正在使用房间数据库和数据存储。这是我的代码

View 模型

@HiltViewModel
class SubscriptionViewModel @Inject constructor(
private val userDataStore: UserDataStore,
private val walletDao: WalletDao
) : ViewModel() {

val flow: Flow<List<Transaction>> = walletDao.getAllTransactions(userDataStore.getId())
// This shows an error as userDataStore.getId() is a suspend function in DataStore


init {
viewModelScope.launch(IO) {
getWalletAmount()
}
}
}

数据存储

 suspend fun getId(): String {
val preferences = dataStore.data.first()
return preferences[USER_ID] ?: ""
}

钱包道

 @Query("SELECT * FROM recent_transactions where user_id=:user_id")
fun getAllTransactions(user_id: String): Flow<List<Transaction>>

问题是我无法初始化流程。我尝试使用 lateinit 在 init{ } block 中初始化它,但是在 fragment 中访问时它崩溃了,说流尚未初始化。

任何解决方案都会有所帮助。

最佳答案

您可以将其包装在流程构建器中。

val flow: Flow<List<Transaction>> = flow {
val source = walletDao.getAllTransactions(userDataStore.getId())
emitAll(source)
}

如果你想让它预加载(甚至在任何东西收集流之前就开始获取第一个值),那么你应该通过添加它把它变成一个 SharedFlow:

.shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)

关于android - 如何使用挂起函数作为参数在 View 模型中初始化流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70852621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com