在onCreateView中初始化的变量上出现“ Lateinit属性尚未初始化”错误

时间:2020-05-30 17:16:15

标签: android kotlin lateinit

我正在开发的应用程序具有三个类。 MainActivity(此处不重要),MyFragmentMyClass。 我在lateinit内有一个MyFragment列表-它是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属性myViewsList未初始化”错误(当片段被破坏,启动或类似操作时,它不会被调用。在我的应用中,您需要10秒钟的时间才能调用它-为简单起见,我将其放在OnClickListener中-在这10秒钟内没有任何活动变化)。

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

1 个答案:

答案 0 :(得分:1)

我在这里可能是错的,但是我认为Android片段类不会像任何其他常规类一样工作。当您调用 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 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()
    }


}