从 Flow 接收对象后,如何 return 暂停函数中的对象?

how to return an object in a suspended function after receiving the object from a Flow?

我想知道是否有一种方法可以等待流程完成并 return 挂起函数中的结果。 transactionRepository.getAll(accountId)return一个交易流

override suspend fun getAccount(accountId: Int): Account {
    val account = Account(accountRepository.get(accountId))
    transactionRepository.getAll(accountId).mapIterable {
        val transaction = Transaction(it)
        val category = Category(categoryRepository.get(it.categoryId))
        transaction.category = category
        transaction.account = account
        return@mapIterable transaction
    }.collect {
        account.transactions = it
     }

    //TODO: How can i return an account after the flow has been executed?
}

我的存储库中定义的 getAll 函数:

fun getAll(accountId: Int): Flow<List<DatabaseTransaction>>

假设您只需要流程返回的第一个值,并且它是 List<Transaction>,您可以使用 first()。但我只是猜测,因为我不知道 getAll() returns 是什么,我也不熟悉 mapIterable.

override suspend fun getAccount(accountId: Int): Account {
    val account = Account(accountRepository.get(accountId))
    val transactionsFlow: Flow<List<Transaction>> = transactionRepository.getAll(accountId).mapIterable {
        val transaction = Transaction(it)
        val category = Category(categoryRepository.get(it.categoryId))
        transaction.category = category
        transaction.account = account
        return@mapIterable transaction
    }
    account.transactions = transactionsFlow.first()
    return account
}

你可以做两件事

第一个是在流程上使用 .toList(),我认为它可以为您提供所需的列表,然后您可以在该列表上执行正常的 for 循环来设置数据

val transactions = transactionRepository.getAll(accountId).toList()

transactions.forEach{
    val transaction = Transaction(it)
    val category = Category(categoryRepository.get(it.categoryId))
    transaction.category = category
    transaction.account = account
}

account.transactions = transactions 

其次是 return 像往常一样收款后的帐户。

val account = Account(accountRepository.get(accountId))
transactionRepository.getAll(accountId).mapIterable {
    val transaction = Transaction(it)
    val category = Category(categoryRepository.get(it.categoryId))
    transaction.category = category
    transaction.account = account
    return@mapIterable transaction
}.collect {
    account.transactions = it
 }

return account

看我做的这个例子

https://pl.kotl.in/wWmLiqBtz