web-dev-qa-db-fra.com

Configuration de l'observateur LiveData dans une vue personnalisée sans LifecycleOwner

J'essaie les nouveaux composants de l'architecture Android et je me suis heurté à un obstacle en essayant d'utiliser le modèle MVVM pour une vue personnalisée.

J'ai essentiellement créé une vue personnalisée pour encapsuler une interface utilisateur commune et sa logique respective à utiliser dans l'application. Je peux configurer ViewModel dans la vue personnalisée, mais je devrais alors utiliser observeForever() ou définir manuellement une LifecycleOwner dans la vue personnalisée, comme ci-dessous, mais aucun ne semble correct.

Option 1) Utilisation de observeForever()

Activité

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()
    }
}

Vue personnalisée

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

    private val viewModel = CustomViewModel()

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

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

Option 2) Définition de lifecycleOwner à partir de l'activité`

Activité

class MyActivity : AppCompatActivity() {

    lateinit var myCustomView : CustomView

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

Vue personnalisée

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

    private val viewModel = CustomViewModel()

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

Est-ce que je ne fais qu'utiliser à mauvais escient les modèles et les composants? Je pense qu'il devrait exister un moyen plus simple de composer des vues complexes à partir de plusieurs vues secondaires sans les lier à l'activité/au fragment.

5
kcrimi

1 Option - Avec une bonne intention, vous devez encore effectuer un travail manuel, comme appeler onAttach\onDetach. L'objectif principal des composants d'architecture est d'empêcher cela. 

2 Option - À mon avis, c'est mieux, mais je dirais que c'est un peu faux de lier votre logique autour de ViewModel et View. Je crois que vous pouvez faire la même logique dans Activity/Fragment sans passer de ViewModel et LifecycleOwner à CustomView. Une seule méthode updateData suffit à cette fin.

Donc, dans ce cas particulier, je dirais que c'est une surutilisation des composants d'architecture.

1
Mike