Search code examples
androiddialogviewmodelandroid-lifecyclelifecycleowner

How to use Android LifecycleOwner in dialog


I want to use mvvm in Dialog but I don't know how to pass LifecycleOwner to observe

class CommonDialog(context: Context) : Dialog(context, R.style.AppMaskStatusTheme) {

    private val viewBinding: DialogSportOrderBinding by lazy { DialogSportOrderBinding.inflate(LayoutInflater.from(context)) }
    private val viewModel by lazy { ViewModelProvider(context as ViewModelStoreOwner)[SportOrderViewModel::class.java] }

 init {
        setContentView(viewBinding.root)

        viewModel.sportOrderList.observe(***what to pass here?***, androidx.lifecycle.Observer {

        })
    }
}

I have tried context as LifecycleOwner, context as AppCompatActivity but all fail

please help me, thanks!


Solution

  • You can create your own LifecycleOwner like this

    class MyLifecycleOwner() : LifecycleOwner {
        private val mLifecycleRegistry: LifecycleRegistry by lazy { LifecycleRegistry(this) }
    
        init {
            mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
        }
    
        fun stop() {
            mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
        }
    
        fun start() {
            mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
        }
    
        override fun getLifecycle(): Lifecycle = mLifecycleRegistry
    }
    

    Then your Dialog class will be like this

    class CommonDialog(context: Context) : Dialog(context, R.style.AppMaskStatusTheme) {
    
        private val viewBinding: DialogSportOrderBinding by lazy { DialogSportOrderBinding.inflate(LayoutInflater.from(context)) }
        private val viewModel by lazy { ViewModelProvider(context as ViewModelStoreOwner)[SportOrderViewModel::class.java] }
    
        private val lifeCycleOwner: MyLifecycleOwner by lazy { MyLifecycleOwner() }
    
        init {
            setContentView(viewBinding.root)
    
            viewModel.sportOrderList.observe(lifeCycleOwner, {
    
            })
        }
    
        override fun onStart() {
            super.onStart()
            lifeCycleOwner.start()
        }
    
        override fun onStop() {
            super.onStop()
            lifeCycleOwner.stop()
        }
    }
    

    Read more about Lifecycle-Aware Components at here