我得到一个随机崩溃“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属性,因为这不能解决我的问题
正如评论中提到的,我建议不要直接调用父容器(Activity)对象,而是在HomeActivity中注册一个导航更改的侦听器,如下所示:
navController.addOnDestinationChangedListener { controller, destination, arguments ->
if(destination.id = R.id.homeFragment) {
// TODO hide/show your view here
}
}
在这种情况下,您可以确定视图在应该隐藏/显示的时候被隐藏/显示,而不依赖于仅在HomeActivity中的HomeFragment,因为这可能会在未来发生变化,并且您的应用程序将开始崩溃
如果您有方向更改或其他配置更改,或者OS进程在后台被杀死,用户返回到应用程序,Android将重新创建Activity
和Fragment
。
不幸的是,在创建Activity
之前,它首先创建了Fragment
。因此,在Fragment
附加到Activity
之前,您不能依赖Activity
的存在。您应该将依赖于Activity
存在的代码移动到onActivityCreated()
。
注意:我也同意关于不这样做的评论。您的Fragment
不应该做出这样的假设(它由HomeActivity
托管),而是应该对托管Activity
进行一些回调,并让托管Activity
设置应用程序栏的可见性(或它想要做的任何其他事情)。