kcr*_*imi 10 android mvvm android-livedata android-viewmodel android-architecture-components
我正在尝试使用新的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()
}
}
Run Code Online (Sandbox Code Playgroud)
自定义视图
class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){
private val viewModel = CustomViewModel()
fun onAttach() {
viewModel.state.observeForever{ myObserver }
}
fun onDetach() {
viewModel.state.removeObserver{ myObserver }
}
}
Run Code Online (Sandbox Code Playgroud)
活动
class MyActivity : AppCompatActivity() {
lateinit var myCustomView : CustomView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
myCustomView = findViewById(R.id.custom_view)
myCustomView.setLifeCycleOwner(this)
}
}
Run Code Online (Sandbox Code Playgroud)
自定义视图
class (context: Context, attrs: AttributeSet) : RelativeLayout(context,attrs){
private val viewModel = CustomViewModel()
fun setLifecycleOwner(lifecycleOwner: LifecycleOwner) {
viewModel.state.observe(lifecycleOwner)
}
}
Run Code Online (Sandbox Code Playgroud)
我只是在滥用模式和组件吗?我觉得应该有一种更简洁的方法从多个子视图中组合复杂的视图,而不必将它们绑定到Activity/Fragment
1 选项- 出于好意,您仍然需要做一些手动工作 - 例如,调用onAttach\onDetach架构组件的主要目的是防止这样做。
2 选项- 在我看来更好,但我会说将你的逻辑绑定在ViewModel和周围有点错误View。我相信您可以在Activity/Fragment不传递 ViewModel 和LifecycleOwnerto 的情况下在内部执行相同的逻辑CustomView。updateData为此目的,单一方法就足够了。
因此,在这种特殊情况下,我会说这是对架构组件的过度使用。
| 归档时间: |
|
| 查看次数: |
3574 次 |
| 最近记录: |