如何解决活动主绑定的"kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initi



我知道已经有关于这个错误的问题了,但我找不到类似的东西。

我随机得到了这个例外。大多数时候它都可以正常工作,但有时我会遇到这个例外。我该怎么算?

Caused by kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized
at com.zzzzz.yyyyyy.base.MainActivity.getBinding(MainActivity.kt:96)
at com.zzzzz.yyyyyy.base.BaseFragment.onViewCreated(BaseFragment.kt:128)
at com.zzzzz.yyyyyy.presentation.inicio.view.InicioFragment.onViewCreated(InicioFragment.kt:60)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3065)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:281)
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298)
at android.view.LayoutInflater.tryCreateView(LayoutInflater.java:1073)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1001)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:965)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1127)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:1130)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1088)
at android.view.LayoutInflater.inflate(LayoutInflater.java:686)
at android.view.LayoutInflater.inflate(LayoutInflater.java:538)
at com.zzzzz.yyyyyy.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:215)
at com.zzzzz.yyyyyy.databinding.ActivityMainBinding.inflate(ActivityMainBinding.java:209)
at com.zzzzz.yyyyyy.base.MainActivity.onCreate(MainActivity.kt:114)
at android.app.Activity.performCreate(Activity.java:8290)
at android.app.Activity.performCreate(Activity.java:8270)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4009)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4201)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2438)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:313)
at android.app.ActivityThread.main(ActivityThread.java:8669)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

My MainActivity.kt看起来像:

lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
appUpdateManager=AppUpdateManagerFactory.create(this)
presenter = MainPresenter()
AndroidThreeTen.init(this)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
navController = Navigation.findNavController(this, R.id.fragmentContainer)
}
Caused by kotlin.UninitializedPropertyAccessException: lateinit property binding has not been initialized
at com.zzzzz.yyyyyy.base.MainActivity.getBinding(MainActivity.kt:96)
at com.zzzzz.yyyyyy.base.BaseFragment.onViewCreated(BaseFragment.kt:128)

出现这种情况是因为BaseFragment(在其onViewCreated方法中(在活动的onCreate方法运行并设置之前尝试访问MainActivity上的binding

活动和碎片有不同的生命周期,不一定按照您期望的顺序创建。当父Activity被破坏时,Fragment也可能被保留,但片段处于其视图被破坏的状态,它只需要重新创建其Views(在onCreateView中(,而不是经历整个onCreate过程。

因此,当Fragment运行onViewCreated时,您不能保证父Activity处于CREATED阶段(即已运行onCreate(。有一个不推荐使用的生命周期回调onActivityCreated,它会在发生这种情况时告诉您-文档也会告诉您现在应该如何处理它,通过onAttachFragment方法在Activity上设置LifecycleObserver(一个附加的Activity还不一定处于CREATED状态(,并监视CREATED状态,然后删除观察者并执行您需要执行的操作。


但更重要的问题是,为什么Fragment需要直接访问其父Activity的视图层次结构?它们应该是完全独立的东西,Fragment应该是自包含的。如果它需要和Activity通信,您可以通过回调侦听器或将它们与ViewModel连接在一起来实现。无论你在做什么,可能都有更好的方法!

相关内容

最新更新