Как добавить параметры в новый конструктор livingata в модели представления - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь преобразовать свои модели представлений в новый построитель livedata из оперативных данных2.0

Во всех примерах, которые я видел, когда вы используете этот новый шаблон построителя, они опускают, как Например, заданные параметры используют эту модель представления, userId не определен

class UserViewModel : ViewModel() {

    private val repository = UserRepository()

    val user: LiveData<Response<User>> = liveData {
        val data = repository.getUser(userId) // loadUser is a suspend function.
        emit(data)
    }
}

выглядит довольно лаконично, но где я могу установить userId, это не функция.

, прежде чем я выставлю функцию, которая принимает параметр, затем обновлю свойство aliveata.

Я думал о чем-то подобном

class UserViewModel : ViewModel() {

    private val repository = UserRepository()

    var userId : String? = null

    val user: LiveData<Response<User>> = liveData {
        val data = repository.getUser(userId) // loadUser is a suspend function.
        emit(data)
    }
}

, и фрагмент может установить идентификатор, но что, если я изменю идентификатор и захочу сделать еще один сетевой вызов?

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете использовать класс ViewModelFactory для передачи пользовательских аргументов с помощью ViewModel. создать новый класс

class UserViewModelFactory(private val user_id: String) : ViewModelProvider.NewInstanceFactory() {

    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        return UserViewModel(user_id) as T
    }

}

В вашем фрагменте

val userViewModel = ViewModelProviders.of(this,UserViewModelFactory(user_id)).get(UserViewModel::class.java)

В вашей ViewModel

class UserViewModel(private val userId: String) : ViewModel() {

Вы также можете оформить выборку для справки по здесь

...