提问者:小点点

未初始化属性访问异常:lateinit属性绑定尚未初始化


我得到一个随机崩溃“lateinit属性绑定尚未初始化”。大多数时候它工作正常,但有几次随机我们在crashlytics上得到这个崩溃。

请让我知道这里出了什么事

我有一个带有以下代码的BaseActivity

abstract class BaseActivity<D : ViewDataBinding> : AppComptActivity() {
    abstract val layoutId: Int
    lateinit val binding: D
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState:Bundle)
        binding = DataBindingUtil.setContentView(this, layoutId)
        ....

    }
}

我有一个HomeActivity,它使用以下代码覆盖BaseActivity

class HomeActivity : BaseActivity<ActivityHomeBinding>() {

    override val layoutId: Int get() = R.layout.activity_home

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState:Bundle)
        ....

    }
}

我正在使用底部导航菜单,其中一个片段是HomeFragment

class HomeFragment : BaseFragment<FragmenntHomeBinding>() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState:Bundle)
        (activity as HomeActivity).binding.appBarHome.visible(false)
        //HERE I AM GETTING  lateinit property binding has not been initialized crash
    }
}

我不想使用lateinit的isFirst属性,因为这不能解决我的问题


共2个答案

匿名用户

正如评论中提到的,我建议不要直接调用父容器(Activity)对象,而是在HomeActivity中注册一个导航更改的侦听器,如下所示:

navController.addOnDestinationChangedListener { controller, destination, arguments ->
    if(destination.id = R.id.homeFragment) {
        // TODO hide/show your view here
    }
}

在这种情况下,您可以确定视图在应该隐藏/显示的时候被隐藏/显示,而不依赖于仅在HomeActivity中的HomeFragment,因为这可能会在未来发生变化,并且您的应用程序将开始崩溃

匿名用户

如果您有方向更改或其他配置更改,或者OS进程在后台被杀死,用户返回到应用程序,Android将重新创建ActivityFragment

不幸的是,在创建Activity之前,它首先创建了Fragment。因此,在Fragment附加到Activity之前,您不能依赖Activity的存在。您应该将依赖于Activity存在的代码移动到onActivityCreated()

注意:我也同意关于不这样做的评论。您的Fragment不应该做出这样的假设(它由HomeActivity托管),而是应该对托管Activity进行一些回调,并让托管Activity设置应用程序栏的可见性(或它想要做的任何其他事情)。

相关问题