Настройка обозревателя LiveData в пользовательском представлении без LifecycleOwner - PullRequest
0 голосов
/ 14 сентября 2018

Я опробую новые компоненты архитектуры Android и столкнулся с препятствием при попытке использовать модель MVVM для настраиваемого представления.

По сути, я создал собственное представление для инкапсуляции общего пользовательского интерфейса и соответствующей логики для использования в приложении. Я могу настроить ViewModel в пользовательском представлении, но тогда мне придется либо использовать observeForever(), либо вручную установить LifecycleOwner в настраиваемом представлении, как показано ниже, но ни один из них не выглядит правильным.

Вариант 1) Использование observeForever()

активность

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.onAttach()
    }

    override fun onStop() {
        myCustomView.onDetach()
    }
}

Пользовательский вид

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun onAttach() {
        viewModel.state.observeForever{ myObserver }
    }

    fun onDetach() {
        viewModel.state.removeObserver{ myObserver }
    }
}

Вариант 2) Настройка lifecycleOwner из Activity`

активность

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myCustomView = findViewById(R.id.custom_view)
        myCustomView.setLifeCycleOwner(this)
    }
}

Пользовательский вид

class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){

    private val viewModel = CustomViewModel()

    fun setLifecycleOwner(lifecycleOwner: LifecycleOwner) {
        viewModel.state.observe(lifecycleOwner)
    }
}

Я просто неправильно использую шаблоны и компоненты? Я чувствую, что должен быть более чистый способ составления сложных представлений из нескольких вложенных представлений без привязки их к Activity / Fragment

1 Ответ

0 голосов
/ 17 сентября 2018

1 вариант - С благими намерениями вам все равно придется выполнить какую-то ручную работу, например, вызвать onAttach \ onDetach. Главная цель компонентов архитектуры - предотвратить это.

2 Опция - На мой взгляд, лучше, но я бы сказал, что немного неправильно связывать вашу логику с ViewModel и View. Я полагаю, что вы можете сделать ту же логику внутри Activity/Fragment, не передавая ViewModel и LifecycleOwner в CustomView. Для этого достаточно одного метода updateData.

Итак, в данном конкретном случае я бы сказал, что это чрезмерное использование компонентов архитектуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...