Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin Lateinit属性viewBinding尚未初始化_Kotlin_Android Viewbinding_Kotlin Lateinit - Fatal编程技术网

Kotlin Lateinit属性viewBinding尚未初始化

Kotlin Lateinit属性viewBinding尚未初始化,kotlin,android-viewbinding,kotlin-lateinit,Kotlin,Android Viewbinding,Kotlin Lateinit,我正在成功使用viewBinding,以前从未遇到过此问题。属性在onViewCreated中初始化,如下所示: private lateinit var viewBinding: FragmentMainBinding override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // Create a b

我正在成功使用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中):

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

// 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属性如何不在此处初始化?显然,当导航到摄影机片段时。这是某种生命周期问题吗?导航到摄影机时是否取消初始化


感谢所有的指针。

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

感谢您的回复。我会尝试用可变的方式来做,我永远不会赞同使用“retainInstance”的方法,因为它的使用几乎总是不正确的,而且容易出错,所以这种反对是有道理的。他们在文档中的推理描述了一种更好的方法。retainInstance不是关于恢复状态,而是关于拥有一个已经初始化的视图对象。如果你写的是普通无聊的应用程序,那么是的,不应该使用retainInstance。但是,假设您有一个带有5个复杂片段视图的ViewPager,并且每次用户返回ViewPager屏幕时都会重新创建它们。有时,在分配费用昂贵时保留视图对象是有意义的。有时仅仅平展视图层次结构是不够的,有时视图的绘制成本非常昂贵,尤其是在旧设备上。@Bio-Matic,我回答了我的问题,学到了一些新东西。再次感谢!我已经设置了一个viewModel,所以我用这种方式修复了位图的传递。
// 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")
    }
}