【问题标题】:How to use Android LifecycleOwner in dialog如何在对话框中使用 Android LifecycleOwner
【发布时间】:2021-12-27 07:59:45
【问题描述】:

我想在Dialog中使用mvvm但是不知道怎么通过LifecycleOwner来观察

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 {

        })
    }
}

我试过context as LifecycleOwnercontext as AppCompatActivity,但都失败了

请帮帮我,谢谢!

【问题讨论】:

    标签: android dialog viewmodel android-lifecycle lifecycleowner


    【解决方案1】:

    你可以像这样创建自己的 LifecycleOwner

    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
    }
    

    那么你的Dialog类会是这样的

    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()
        }
    }
    

    阅读更多关于Lifecycle-Aware Components at here

    【讨论】:

    • 这就是我需要的。感谢您的帮助。有用。欣赏
    • 不客气!
    【解决方案2】:

    android.content.Context 没有实现android.arch.lifecycle.LifecycleOwner

    您必须传递一个 AppCompatActivity 的实例,它实现了 android.arch.lifecycle.LifecycleOwner(或任何其他实现该功能的类)。

    或转换(AppCompatActivity) context,当contextinstanceof AppCompatActivity.

    【讨论】:

    • 我尝试通过context as AppCompatActivity,但应用程序会崩溃
    • 你试过 DialogFragment 了吗?
    • DialogFragment 没问题,但和 Dialog 不一样,我只想用对话框
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多