Управление состоянием с помощью ViewModel на Android в потоке - PullRequest
0 голосов
/ 28 мая 2020

В основном у меня есть система управления состоянием, использующая ViewModel, которая выглядит так:

class ViewModelA: ViewModel() {

    private val repository: RepositoryA by inject()

    private val _stateLiveData = MutableLiveData<ViewState>()
    val stateLiveData: LiveData<ViewState> get() = _stateLiveData

    private val _eventLiveData = SingleLiveEvent<ViewEvent>()
    val eventLiveData: LiveData<ViewEvent> get() = _eventLiveData

    private val exceptionHandler = CoroutineExceptionHandler { _, _ ->
        _stateLiveData.postValue(ViewState.Error)
    }

    fun loadList() {
        if (_stateLiveData.value is ViewState.Loading) return
        launch(exceptionHandler) {
            _stateLiveData.run {
                value = ViewState.Loading
                value = repository.getDocumentList().let {
                    if (it.isEmpty()) ViewState.Error
                    else ViewState.Data(it)
                }
            }
        }
    }
}

Но всякий раз, когда я делюсь ViewModel с несколькими Fragments, он становится все больше и больше. Я ищу решение для этого, потому что я не хочу централизовать все logi c для всего потока приложения внутри ViewModel, и я также не хочу постоянно передавать аргументы здесь и там.

PS: Извините за мой плохой engli sh. Изменить: немного прояснить вопрос.

1 Ответ

0 голосов
/ 28 мая 2020

Я не совсем понял ваш вопрос. Однако, если ваш вопрос был следующим:

Как я могу поделиться одним и тем же ViewModel Object и использовать его внутри нескольких Fragment s.

Вы можете проверить документация ViewModelProvider , который является служебным классом, который предоставляет ViewModel s для определенной c области, например Activity.

Ниже приведен пример кода использования ViewModelProvider в пределах двух Fragment s, которые будут созданы и использованы в одном объекте Activity:

// An example ViewModel
class SharedViewModel : ViewModel() {

    val intLiveData = MutableLiveData<Int>() // an example LiveData field

}
// the first fragment
class Fragment1 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = requireActivity().let { activity ->
            ViewModelProvider(activity).get(SharedViewModel::class.java)
        }
    }

}
// the other fragment
class Fragment2 : Fragment() {

    private lateinit var viewModel: SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        viewModel = requireActivity().let { activity ->
            ViewModelProvider(activity).get(SharedViewModel::class.java)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...