I have model class:
data class TweetResponse(
val data: Data?,
val matching_rules: List<ApiMatchingRule?>?,
val lifeSpan: MutableStateFlow<Int>? = MutableStateFlow(30),
var timer: CountDownTimer?
)
In my repository class I get list of these elements and emit them:
var tweetDataResponse = MutableSharedFlow<MutableList<TweetResponse>>()
var tweetList: MutableList<TweetResponse> = mutableListOf()
....some code
tweetResponse?.let { tweetList.add(it) }
tweetDataResponse.emit(tweetList)
My Viewmodel collects this list and start ticker for every item:
private fun setCollectors() {
viewModelScope.launch {
twitterRepository.tweetDataResponse.collect { response ->
response.forEach {
it.timer = object : CountDownTimer(TWITTER_TIMER_COUNT) {
override fun onTick(remainingSeconds: Int) {
viewModelScope.launch {
it.lifeSpan?.emit(remainingSeconds)
}
}
override fun onFinish() {
}
}
}
tweetResponse.emit(response)
}
}
}
also I emit this list to my fragment (tweetResponse.emit(response)) so it can give it to the corresponding adapter.
In my fragment I collect list and transfer it to adapter:
private fun setCollectors() {
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.CREATED) {
viewModel.tweetResponse.collect {
adapter.addTweets(it)
}
}
}
}
}
And finally in adapter I set this list and bind it in onBIndViewholder:
override fun onBindViewHolder(holder: ViewHolderHome, position: Int) {
val item = tweetList[position]
CoroutineScope(Dispatchers.IO).launch {
item.lifeSpan?.collect { secondsLeft ->
withContext(Dispatchers.Main) {
holder.binding.lifespan.text = secondsLeft.toString()
}
}
}
item.timer?.start()
}
As you can see, in onBind I set collector for every item and try to collect changes of lifespan flow variable. When I debug, my viewmodel does the ticking all the time and my collector in adapter is set properly. But values never get collected. There is flaw somewhere, can I get some help in the friday night :D