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.
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 }
}
}
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.
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.