Guest User

Untitled

a guest
Jul 8th, 2021
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.55 KB | None | 0 0
  1. data class Album(
  2.     val id: Int,
  3.     val name: String
  4. )
  5.  
  6. sealed class TaskState<out T> {
  7.     object Initial : TaskState<Nothing>()
  8.     object Progress : TaskState<Nothing>()
  9.     class Failure(val error: Exception) : TaskState<Exception>()
  10.     class Success<out T>(val result: T) : TaskState<T>()
  11. }
  12.  
  13. class TaskViewModel : ViewModel() {
  14.  
  15.     sealed class AvailableTask<T>() {
  16.         object Move : AvailableTask<Boolean>()
  17.         object NewAlbum : AvailableTask<Album>()
  18.     }
  19.  
  20.     private val moveStateFlow = MutableStateFlow<TaskState<Boolean>>(TaskState.Initial)
  21.     private val newAlbumStateFlow = MutableStateFlow<TaskState<Album>>(TaskState.Initial)
  22.  
  23.  
  24.     fun <T> observeTaskState(
  25.         task: AvailableTask<T>,
  26.         observer: Observer<TaskState<*>>
  27.     ) {
  28.         viewModelScope.launch(viewModelScope.coroutineContext + Job()) {
  29.             val stateFlow = when (task) {
  30.                 is AvailableTask.Move -> moveStateFlow
  31.                 is AvailableTask.NewAlbum -> newAlbumStateFlow
  32.             }
  33.  
  34.             stateFlow.collect {
  35.                 observer.onChanged(it)
  36.             }
  37.         }
  38.     }
  39. }
  40.  
  41. fun foo() {
  42.     val v = TaskViewModel()
  43.     v.observeTaskState(TaskViewModel.AvailableTask.Move) { taskState: TaskState<*> ->
  44.         when (taskState) {
  45.             TaskState.Initial -> {}
  46.             TaskState.Progress -> {}
  47.             is TaskState.Failure -> {}
  48.             is TaskState.Success -> {
  49.                 val result = taskState.result as Boolean
  50.                 // ...
  51.             }
  52.         }
  53.     }
  54. }
Advertisement
Add Comment
Please, Sign In to add comment