如何在 flow.stateIn() 之后从流中的另一个函数发出 emit?

How to make an emit from another function in a flow after flow.stateIn()?

我从数据库获取页面数据,我有一个 returns 流的存储库。

class RepositoryImpl (private val db: AppDatabase) : Repository {

    override fun fetchData (page: Int) = flow {
        emit(db.getData(page))
    }
}

在ViewModel中,我调用了stateIn(),第一页就到了,那么如何请求第二页呢?通过调用 fetchData(page = 2) 我得到了一个新流,我需要数据到达旧流。

class ViewModel(private val repository: Repository) : ViewModel() {

    val dataFlow = repository.fetchData(page = 1).stateIn(viewModelScope, WhileSubscribed())
}

如何获取dataFlow中的第二页?

如果您只发出一个值,我看不出在存储库中使用流的原因。我会将其更改为 suspend 函数,并在 ViewModel 中使用新值更新 MutableStateFlow 类型的变量。示例代码可能如下所示:

class RepositoryImpl (private val db: AppDatabase) : Repository {

    override suspend fun fetchData (page: Int): List<Data> {
        return db.getData(page)
    }
}

class ViewModel(private val repository: Repository) : ViewModel() {

    val _dataFlow = MutableStateFlow<List<Data>>(emptyList())
    val dataFlow = _dataFlow.asStateFlow()

    fun fetchData (page: Int): List<Data> {
        viewModelScope.launch {
            _dataFlow.value = repository.fetchData(page) 
        }
    }    
}