如何在 android 片段中使用辅助构造函数分配后期初始化变量?

How to assign late initialize variable with secondary constructor in android fragment?

我在我的应用程序中使用 Kotlin 和片段。我创建了一个辅助构造函数以将主构造函数保持为空,以避免出现找不到片段构造函数的错误。我在片段的二级构造函数中分配了延迟初始化变量,但在调用时它是空的,导致空指针异常。 这是代码序列:

class VideoFragment(
) : Fragment(),
VideoFileListener {

private lateinit var mainContext: Context
private lateinit var itemClickListener: ItemClickListener

constructor(
    mainContext: Context,
    itemClickListener: ItemClickListener
) : this() {
    this.mainContext = mainContext
    this.itemClickListener = itemClickListener
}
}

companion object {
    @JvmStatic
    fun newInstance(
        mainContext: Context,
        itemClickListener: ItemClickListener
    ) =
        VideoFragment(mainContext, itemClickListener)
}

我使用静态 newInstance 函数访问我的片段。为什么这些变量没有在二级构造函数中初始化?

你有点错过了 newInstance 静态方法的要点。该方法的全部要点是将提供的给定参数放入片段参数中,以便片段稍后可以从它的参数中检索这些参数。这是必要的,因为在配置更改时,您的 Fragment 将使用无参数构造函数重新创建,然后您将在某个地方恢复 Fragment 的原始参数。查看此答案以获得进一步的解释和示例:

这还有另外一个作用。您不能真正将回调作为 Fragment 参数,因为这些参数需要是 SerializableParcelable。我强烈建议您从我链接的地方观看此视频,它对此进行了进一步阐述:https://youtu.be/dcYKW48tHQ4?t=1867

最后一件事,如果你得到 NullPointerException 那么它是由于你的 lateinit 属性 没有被初始化,因为这会产生类似于这样的错误:kotlin.UninitializedPropertyAccessException: lateinit property foo has not been initialized .