如何使用挂起函数作为参数来初始化视图模型中的流

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{ } 块中初始化它,但是在片段中访问时它崩溃,表示流程尚未初始化。

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

Ten*_*r04 6

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

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)