Lateinit 属性 viewBinding 尚未初始化

Lateinit property viewBinding has not been initialized

我成功使用了 viewBinding,以前从未遇到过这个问题。 属性 在 onViewCreated 中初始化如下:

private lateinit var viewBinding: FragmentMainBinding

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    // Create a binding object to the layout
    viewBinding = FragmentMainBinding.bind(view)
}

然后我有一个打开相机的按钮,就像这样(也在 onViewCreated 中):

// Button to open camera
viewBinding.takePictureButton.setOnClickListener {
    findNavController().navigate(R.id.action_main_fragment_to_camera)
}

我的主片段实现了相机片段中声明的接口函数。这是为了知道用户是选择了图像还是在没有选择图像的情况下关闭了相机。像这样:

// Interface declared in CameraFragment
interface ImageCaptureListener {
    fun onUserDismissedCamera(userPickedImage: Boolean)
}

// Implementation of interface function in main fragment
override fun onUserDismissedCamera(userPickedImage: Boolean) {
    if(userPickedImage) {
        println("User picked image")
        
        //** The app crashes when trying to set image in viewBinding.mainFragmentImageView

    } else {
        println("User did NOT picked image")
    }
}

我的viewBinding属性这里怎么没有初始化呢?显然是在导航到相机片段时。这是某种生命周期问题吗?导航到相机时是否取消初始化?

感谢任何指点。

当您导航到另一个 Fragment 时视图被销毁,因此绑定不再有效。通常这可以通过在片段 onViewCreated 中将 retainInstance 设置为 true 来解决,但现在已弃用(虽然我不同意弃用,但 Google 菜鸟只认为应用可以很简单,所以现在重新加载复杂的布局将是一件昂贵的事情)。您可以使用 retainInstance,或将回调返回的照片对象设置为某个变量,并在调用 onCreateView 时设置它。