新しいAndroidアーキテクチャコンポーネントを試してみましたが、カスタムビューにMVVMモデルを使用しようとすると、ロードブロックに遭遇しました。
基本的に、共通のUIをカプセル化するカスタムビューを作成しました。これは、アプリ全体で使用するそれぞれのロジックです。カスタムモデルでViewModelを設定できますが、observeForever()
を使用するか、以下のようにカスタムビューでLifecycleOwner
を手動で設定する必要がありますが、どちらも正しくないようです。
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 }
}
}
アクティビティ
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)
}
}
パターンとコンポーネントを誤用しているだけですか?アクティビティ/フラグメントに関連付けることなく、複数のサブビューから複雑なビューを作成するためのより明確な方法があるはずだと思います
1オプション-意図的に、まだonAttach
\onDetach
を呼び出すなどの手作業を行う必要があります。アーキテクチャコンポーネントの主な目的は、これを防ぐことです。
2オプション-私の意見ではより良いですが、ViewModel
とView
の周りにロジックをバインドするのは少し間違っていると思います。 ViewModelとLifecycleOwner
をCustomView
に渡さなくても、Activity/Fragment
内で同じロジックを実行できると思います。このためには、単一のメソッドupdateData
で十分です。
したがって、この特定のケースでは、アーキテクチャコンポーネントの過剰使用と言えます。