如何在 mvvm 架构中实现 BaseActivity?不使用依赖注入
How to implement a BaseActivity in mvvm architecture? Without using dependency Injection
我目前正在学习MVVM架构,
我试着做了一个 BaseActivity
class.
我的基础活动:-
abstract class BaseActivity<ViewModel : BaseViewModel, Binding : ViewDataBinding> :
AppCompatActivity(),
EventListener {
lateinit var binding: Binding
private var viewModel: ViewModel? = null
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
binding = DataBindingUtil.setContentView(this, layoutid)
this.viewModel = viewModel ?: getViewModel()
binding.setVariable(getBindingVariable(), viewModel)
binding.executePendingBindings()
}
@get: LayoutRes
abstract val layoutid: Int
abstract fun getViewModel(): ViewModel
abstract fun getBindingVariable(): Int
private fun getViewModelClass(): Class<ViewModel> {
val type =
(javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
return type as Class<ViewModel>
}
}
现在我在我的 SplashActivity 中使用这个 BaseActivity:-
class SplashScreen : BaseActivity<SplashScreenViewModel, ActivitySplashBinding>() {
private lateinit var viewModel: SplashScreenViewModel
override fun onFailure(message: String) {
}
override fun onStarted() {
}
override fun onSuccess() {
}
override fun getViewModel(): SplashScreenViewModel {
viewModel = ViewModelProvider(this).get(SplashScreenViewModel::class.java)
return viewModel
}
override fun getBindingVariable(): Int {
return BR.splash_viewmodel
}
override val layoutid: Int
get() = R.layout.activity_splash
}
我已经使用这个答案作为参考来实现这个BaseActivity.kt
:How to have generic ViewModel in BaseActivty class
但是我在 运行 应用程序时 出现空白屏幕 。
你能告诉我这里的问题是什么或者如何制作这个 BaseActivity(不使用依赖注入)
你覆盖错了onCreate
override fun onCreate(savedInstanceState: Bundle?) {
几年前我也玩过类似的东西,你可以找到我的方法here
我目前正在学习MVVM架构,
我试着做了一个 BaseActivity
class.
我的基础活动:-
abstract class BaseActivity<ViewModel : BaseViewModel, Binding : ViewDataBinding> :
AppCompatActivity(),
EventListener {
lateinit var binding: Binding
private var viewModel: ViewModel? = null
override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
super.onCreate(savedInstanceState, persistentState)
binding = DataBindingUtil.setContentView(this, layoutid)
this.viewModel = viewModel ?: getViewModel()
binding.setVariable(getBindingVariable(), viewModel)
binding.executePendingBindings()
}
@get: LayoutRes
abstract val layoutid: Int
abstract fun getViewModel(): ViewModel
abstract fun getBindingVariable(): Int
private fun getViewModelClass(): Class<ViewModel> {
val type =
(javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
return type as Class<ViewModel>
}
}
现在我在我的 SplashActivity 中使用这个 BaseActivity:-
class SplashScreen : BaseActivity<SplashScreenViewModel, ActivitySplashBinding>() {
private lateinit var viewModel: SplashScreenViewModel
override fun onFailure(message: String) {
}
override fun onStarted() {
}
override fun onSuccess() {
}
override fun getViewModel(): SplashScreenViewModel {
viewModel = ViewModelProvider(this).get(SplashScreenViewModel::class.java)
return viewModel
}
override fun getBindingVariable(): Int {
return BR.splash_viewmodel
}
override val layoutid: Int
get() = R.layout.activity_splash
}
我已经使用这个答案作为参考来实现这个BaseActivity.kt
:How to have generic ViewModel in BaseActivty class
但是我在 运行 应用程序时 出现空白屏幕 。
你能告诉我这里的问题是什么或者如何制作这个 BaseActivity(不使用依赖注入)
你覆盖错了onCreate
override fun onCreate(savedInstanceState: Bundle?) {
几年前我也玩过类似的东西,你可以找到我的方法here