gpt4 book ai didi

android - 初始化后如何修改 Kotlin Coroutine Flow 的值?

转载 作者:行者123 更新时间:2023-12-02 12:21:31 25 4
gpt4 key购买 nike

预期的

初始化 Kotlin Coroutine Flow 并在 Flow 创建后修改其值。

所需的功能类似于 MutableLiveData 的 setValue 它允许将数据添加到现有的 MutableLiveData 对象。
在下面的示例中 setValue_feed 上调用FeedViewModel.kt 中的 MutableLiveData 值以更新该值。

这按预期工作,发出 FeedFragment.kt 中的值

FeedViewState.kt

data class _FeedViewState(
val _feed: MutableLiveData<List<Tweet>> = MutableLiveData()
)

data class FeedViewState(private val _feedViewState: _FeedViewState) {
val feed: LiveData<List<Tweet>> = _feedViewState._feed
}

FeedViewModel.kt
class FeedViewModel(...) : ViewModel() {
private val _feedViewState = _FeedViewState()
val feedViewState = FeedViewState(_feedViewState)
init {
viewModelScope.launch(Dispatchers.IO) {
feedRepository.getFeed().collect { results ->
when (results.status) {
LOADING -> ...
SUCCESS -> withContext(Dispatchers.Main) {
_feedViewState._feed.value = results.data
}
ERROR -> ...
}
}
}
}
}

FeedFragment.kt
class FeedFragment : Fragment() {
override fun onCreateView(...): View? {
viewModel.feedViewState.feed.observe(viewLifecycleOwner){ feed ->
//Do something with the tweets here.
}
return inflater.inflate(R.layout.fragment_feed, container, false)
}
}

观察到的

为了使用 Kotlin 协程实现相同的模式,FeedViewState.kt 中的 LiveData 被替换为 Flow。在 FeedViewModel.kt 中,期望的结果是将数据添加到 _feed流量值。尝试的解决方案已应用 map , 和 emit transform 内部和 onCompletion_feed流量值。

但是,此解决方案不会从 FeedFragment.kt 中的 Flow 值发出所需的值。

FeedViewState.kt
data class _FeedViewState(
val _feed: Flow<List<Tweet>> = flow { }
)

data class FeedViewState(private val _feedViewState: _FeedViewState) {
@ExperimentalCoroutinesApi
val feed: Flow<List<Tweet>> = _feedViewState._feed }
}

FeedViewModel.kt
class FeedViewModel(...) : ViewModel() {
private val _feedViewState = _FeedViewState()
val feedViewState = FeedViewState(_feedViewState)
init {
viewModelScope.launch(Dispatchers.IO) {
feedRepository.getFeed().collect { results ->
when (results.status) {
LOADING -> ...
SUCCESS -> withContext(Dispatchers.Main) {
_feedViewState._feed.map { results.data!! }
}
ERROR -> ...
}
}
}
}
}


FeedFragment.kt
class FeedFragment : Fragment() {
override fun onCreateView(...): View? {
lifecycleScope.launch {
viewModel.feedViewState.feed.collect { tweets ->
//Do something with the tweets here.
}
}
return inflater.inflate(R.layout.fragment_feed, container, false)
}
}

最佳答案

Kotlin StateFlow与 Kotlin Channels 相比,它是一种更新的解决方案,允许对 Flow value 进行可变更新以及不可变观察数据流的能力。

关于android - 初始化后如何修改 Kotlin Coroutine Flow 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60623991/

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