Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在BaseViewModel中注入依赖项_Android_Android Mvvm_Toothpick Di - Fatal编程技术网

Android 在BaseViewModel中注入依赖项

Android 在BaseViewModel中注入依赖项,android,android-mvvm,toothpick-di,Android,Android Mvvm,Toothpick Di,我有一个项目,其中基本逻辑应用于应用程序中的所有屏幕。所以我把这个逻辑移到了BaseViewModel。在it中,我需要像存储库和路由器这样的依赖项。我无法将这些依赖项作为构造函数参数提供,因为我需要继承此类。所以我只使用场注入 BaseViewModelImpl.kt abstract class BaseViewModelImpl : ViewModel(), BaseViewModel { override val singleLiveData = MutableLiveData&

我有一个项目,其中基本逻辑应用于应用程序中的所有屏幕。所以我把这个逻辑移到了BaseViewModel。在it中,我需要像存储库和路由器这样的依赖项。我无法将这些依赖项作为构造函数参数提供,因为我需要继承此类。所以我只使用场注入

BaseViewModelImpl.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
    }
}
抽象类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片段上的对话框(当我们向前移动时)

您可以在此处看到完整的项目: