"Lateinit property has not been initialized" 在 onCreateView 中初始化的变量错误

"Lateinit property has not been initialized" error on a variable initialized in onCreateView

我正在开发的应用程序有三个 类。 MainActivity(这里不重要),MyFragmentMyClass。 我在 MyFragment 中有一个 lateinit 列表 - 它是 lateinit 因为它将被某些方法使用。 (顺便说一句,我正在使用 kotlin 合成器)

class MyFragment: Fragment()
    lateinit var myViewsList: List<View>
    lateinit var viewA: View
    lateinit var viewB: View
    lateinit var viewC: View

    override fun onCreateView(
    //inflating the layout...
    ): View? {
        val view = inflater.inflate(R.layout.fragment_timer, container, false)

        val button: Button = view.myButton
        viewA = view.myViewA
        viewB = view.myViewB
        viewC = view.myViewC

        myViewsList =
            listOf<View>(viewA,viewB,viewC) 

        myButton.setOnClickListener() {
            MyClass().myMethod()
        }

        return view
    }

然后MyClass

class MyClass() {
    fun showViews {
        MyFragment().myViewsList.forEach { // this line is causing the error
            it.visibility = View.VISIBLE
        }
    }

    fun myMethod() {
        //do some stuff
        //delay...
        showViews()
    }


}

但是每当调用 showViews() 时我都会收到 "lateinit property myViewsList not initialized" 错误(当片段被销毁、启动或类似的时候它不会被调用。在我的应用程序中,它需要您需要大约 10 秒的时间来调用它 - 为了简单起见,我只是将它放在 OnClickListener 中 - 在这 10 秒内没有任何 activity 变化)。

我不明白为什么,因为它 是在 OnCreateView myViewsList = listOf<View>(viewA,viewB,viewC) 中初始化的 。在 MyFragment 内涉及 myViewsList 的任何调用都可以正常工作,但在 MyClass 内则不行。那么,为什么会这样呢?调用或初始化它的正确方法是什么?

我在这里可能是错的,但我认为 Android 片段 class 不会像任何其他常规 class 一样工作。当您调用 MyFragment().myViewsList 时,您调用的不是片段的同一个实例,当您调用这个尚未初始化的变量 "myViewsList" 时,它会崩溃。

要使其正常工作,您必须传递您的列表和希望使其可见的视图。

class MyFragment: Fragment()
    lateinit var myViewsList: List<View>
    lateinit var viewA: View
    lateinit var viewB: View
    lateinit var viewC: View

    override fun onCreateView(
    //inflating the layout...
    ): View? {
        val view = inflater.inflate(R.layout.fragment_timer, container, false)

        val button: Button = view.myButton
        viewA = view.myViewA
        viewB = view.myViewB
        viewC = view.myViewC

        myViewsList =
            listOf<View>(viewA,viewB,viewC) 

        myButton.setOnClickListener() {
            MyClass(myViewsList).myMethod()
        }

        return view
    }

你的class应该是这样的:

class MyClass(private val views: List<View>) {
    fun showViews {
        views.forEach { // this line is causing the error
            it.visibility = View.VISIBLE
        }
    }

    fun myMethod() {
        //do some stuff
        //delay...
        showViews()
    }


}