Android 在BaseViewModel中注入依赖项
我有一个项目,其中基本逻辑应用于应用程序中的所有屏幕。所以我把这个逻辑移到了BaseViewModel。在it中,我需要像存储库和路由器这样的依赖项。我无法将这些依赖项作为构造函数参数提供,因为我需要继承此类。所以我只使用场注入 BaseViewModelImpl.ktAndroid 在BaseViewModel中注入依赖项,android,android-mvvm,toothpick-di,Android,Android Mvvm,Toothpick Di,我有一个项目,其中基本逻辑应用于应用程序中的所有屏幕。所以我把这个逻辑移到了BaseViewModel。在it中,我需要像存储库和路由器这样的依赖项。我无法将这些依赖项作为构造函数参数提供,因为我需要继承此类。所以我只使用场注入 BaseViewModelImpl.kt abstract class BaseViewModelImpl : ViewModel(), BaseViewModel { override val singleLiveData = MutableLiveData&
abstract class BaseViewModelImpl : ViewModel(), BaseViewModel {
override val singleLiveData = MutableLiveData<LiveDataEvent<String>>()
override var isViewDestroyed: Boolean = true
protected val compositeDisposable = CompositeDisposable()
private val repo by inject<Repo>()
private val router by inject<Router>()
init {
KTP.openRootScope().inject(this) //Warning: Leaking 'this' in constructor of non-final class BaseViewModelImpl
subscribeToCommonWork()
}
private fun subscribeToCommonWork() {
repo.publishRelay
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
if (!isViewDestroyed)
handleEvent(it)
}, { }).addTo(compositeDisposable)
}
open fun handleEvent(event: String) {
singleLiveData.value = LiveDataEvent(event)
}
override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
}
override fun onForwardClick() {
router.moveForward()
}
}
abstract class BaseFragment<VM : BaseViewModel> : Fragment(), DialogListener {
abstract val viewModel: VM
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.isViewDestroyed = false
viewModel.singleLiveData.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled()?.let {
Dialog.newInstance(it).show(childFragmentManager, Dialog::class.simpleName)
}
}
}
override fun onForwardClick() {
viewModel.onForwardClick()
}
override fun onDestroyView() {
super.onDestroyView()
viewModel.isViewDestroyed = true
}
}
抽象类BaseViewModelImpl:ViewModel(),BaseViewModel{
重写val singleLiveData=MutableLiveData()
覆盖变量isViewDestroyed:Boolean=true
受保护的val compositeDisposable=compositeDisposable()
通过注入的私人val回购()
通过inject()实现的专用val路由器
初始化{
KTP.openRootScope().inject(this)//警告:在非最终类BaseViewModelImpl的构造函数中泄漏“this”
订阅Betocomonwork()
}
私人娱乐和公共工作(){
回购协议
.observeOn(AndroidSchedulers.mainThread())
.订阅({
如果(!isViewDestroyed)
扶手通风口(it)
},{}.addTo(可组合)
}
打开有趣的handleEvent(事件:字符串){
singleLiveData.value=LiveDataEvent(事件)
}
覆盖有趣的onCleared(){
super.onCleared()
compositeDisposable.dispose()
}
重写onForwardClick(){
router.moveForward()
}
}
BaseFragment.kt
abstract class BaseViewModelImpl : ViewModel(), BaseViewModel {
override val singleLiveData = MutableLiveData<LiveDataEvent<String>>()
override var isViewDestroyed: Boolean = true
protected val compositeDisposable = CompositeDisposable()
private val repo by inject<Repo>()
private val router by inject<Router>()
init {
KTP.openRootScope().inject(this) //Warning: Leaking 'this' in constructor of non-final class BaseViewModelImpl
subscribeToCommonWork()
}
private fun subscribeToCommonWork() {
repo.publishRelay
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
if (!isViewDestroyed)
handleEvent(it)
}, { }).addTo(compositeDisposable)
}
open fun handleEvent(event: String) {
singleLiveData.value = LiveDataEvent(event)
}
override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
}
override fun onForwardClick() {
router.moveForward()
}
}
abstract class BaseFragment<VM : BaseViewModel> : Fragment(), DialogListener {
abstract val viewModel: VM
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.isViewDestroyed = false
viewModel.singleLiveData.observe(viewLifecycleOwner) { event ->
event.getContentIfNotHandled()?.let {
Dialog.newInstance(it).show(childFragmentManager, Dialog::class.simpleName)
}
}
}
override fun onForwardClick() {
viewModel.onForwardClick()
}
override fun onDestroyView() {
super.onDestroyView()
viewModel.isViewDestroyed = true
}
}
抽象类BaseFragment:Fragment(),DialogListener{
抽象val视图模型:VM
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
viewModel.isviewmodel=false
viewModel.singleLiveData.observe(viewLifecycleOwner){event->
event.getContentIfNotHandled()?.let{
Dialog.newInstance(it.show)(childFragmentManager,Dialog::class.simpleName)
}
}
}
重写onForwardClick(){
viewModel.onForwardClick()
}
重写onDestroyView(){
super.onDestroyView()
viewModel.isviewmodel=true
}
}
这是一个好方法吗?有没有办法避免泄漏警告?BaseViewModel最好使用哪个范围?
p.S.var isviewdemployed用于不显示previos片段上的对话框(当我们向前移动时)
您可以在此处看到完整的项目: