Ank*_*rma 3 android kotlin android-room kotlin-coroutines kotlin-flow
我正在使用房间数据库和数据存储。这是我的代码
视图模型
@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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
数据存储
suspend fun getId(): String {
val preferences = dataStore.data.first()
return preferences[USER_ID] ?: ""
}
Run Code Online (Sandbox Code Playgroud)
钱包道
@Query("SELECT * FROM recent_transactions where user_id=:user_id")
fun getAllTransactions(user_id: String): Flow<List<Transaction>>
Run Code Online (Sandbox Code Playgroud)
问题是我无法初始化流程。我尝试使用 Lateinit 在 init{ } 块中初始化它,但是在片段中访问时它崩溃,表示流程尚未初始化。
任何解决方案都会有帮助。
您可以将其包装在流程构建器中。
val flow: Flow<List<Transaction>> = flow {
val source = walletDao.getAllTransactions(userDataStore.getId())
emitAll(source)
}
Run Code Online (Sandbox Code Playgroud)
如果您希望它预加载(甚至在任何收集流之前就开始获取第一个值),那么您应该通过添加以下内容将其转换为 SharedFlow:
.shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4545 次 |
| 最近记录: |