Lateinit 属性 viewBinding 尚未初始化

问题描述

我正在成功使用 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 时,视图会被销毁,因此绑定不再有效。通常这可以通过在 Fragment retainInstance 中将 true 设置为 onViewCreated 来解决,但现在已弃用(虽然我不赞成弃用,但谷歌菜鸟只认为应用程序可以简单所以现在重新加载复杂的布局将是一件昂贵的事情)。您可以使用 retainInstance,或者将回调中返回的照片对象设置为某个变量,并在调用 onCreateView 时进行设置。