Ravi
02/03/2022, 3:42 PMMVI state
data class VideoState(val currentTime: Long,
val totalTime: Long,
val title: String)
UI (Fragment)
renderData(state: VideoState) {
binding.timerTextView.text = "$state.currentTime"
binding.durationTextView.text = "$state.totalTime"
binding.title = "$state.title"
}
only timerTextView
will update but durationTextView
& title
will remain same still renderData
will set everything. Is there any performance again if we want to update part of the view? If so whats the better to do that? Hoping for a onBindViewHolder
with payload
kind of approachRavi
02/03/2022, 5:03 PMdata class VideoData(
val url: String = "",
val title: String = "",
val isPlaying: Boolean = false,
val totalDuration: Long = 0L,
)
sealed class VideoState {
abstract val videoData: VideoData
data class VideoMeta(override val videoData: VideoData) : VideoState()
data class VideTimer(val currentTime: Long, override val videoData: VideoData) : VideoState()
}
class VideoViewModel(private val someSubject: SomeSubject, private val someRepo: SomeRepo) : ViewModel(), ContainerHost<VideoState, Nothing> {
override val container by lazy {
container<VideoState, Nothing>(
initialState = VideoState.VideoMeta(VideoData()),
) { initData() }
}
private fun initData() = intent {
val videoData: VideoData = someRepo.fetchVideoMeta()
reduce {
with(videoData) {
VideoState.VideoMeta(state.videoData.copy(url = url, title = title, totalDuration = totalDuration))
}
}
repeatOnSubscription {
val timer: Long = someSubject.listentoTimer()
reduce {
VideoState.VideTimer(currentTime = timer, videoData = state.videoData)
}
}
}
}
class VideoFragment : Fragment() {
fun renderData(state: VideoState) {
when (state) {
is VideoState.VideTimer -> binding.timerTv.text = "${state.currentTime}"
is VideoState.VideoMeta -> with(state.videoData) {
binding.titleTv.text = "$title"
binding.totalTv.text = "$totalDuration"
binding.playIcon.background = if (isPlaying) playIcon else pauseIcon
}
}
}
}