Android(Kotlin)中的lateinit问题-java.lang.RuntimeException

Android(Kotlin)中的lateinit问题-java.lang.RuntimeException,android,kotlin,Android,Kotlin,我对lateinit和java.lang.RuntimeException有一个小问题。我试图自己解决它,甚至在这里寻找答案,但没有成功 class NewsListFragment : Fragment() { private lateinit var onNewsInteractionListener: OnNewsInteractionListener private val mNewsMap: HashMap<String, NewsItem> = has

我对lateinit和java.lang.RuntimeException有一个小问题。我试图自己解决它,甚至在这里寻找答案,但没有成功

class NewsListFragment : Fragment() {

    private lateinit var onNewsInteractionListener: OnNewsInteractionListener

    private val mNewsMap: HashMap<String, NewsItem> = hashMapOf()

    val feedsReference = FirebaseDatabase.getInstance().getReference("feeds")

    val authListener: FirebaseAuth.AuthStateListener by lazy {
        FirebaseAuth.AuthStateListener { firebaseAuth ->
            if (firebaseAuth.currentUser != null) {
                feed_item_list.adapter?.notifyDataSetChanged()
            }
        }
    }

    private lateinit var feedChangeListener: ValueEventListener
    val eventListener: ValueEventListener by lazy {
        object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {}

            override fun onDataChange(p0: DataSnapshot) {
                onUpdateRecyclerAdapter(p0)
            }

        }
    }



    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is OnNewsInteractionListener) {
            onNewsInteractionListener = context
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_newsitem_list, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        loader_news.visibility = View.VISIBLE

        feedsReference.addListenerForSingleValueEvent(object : ValueEventListener {
            override fun onCancelled(p0: DatabaseError) {}

            override fun onDataChange(p0: DataSnapshot) {
                loader_news.visibility = View.GONE
                onUpdateRecyclerAdapter(p0)
                feed_item_list.scheduleLayoutAnimation()
            }

        })
        setUpRecycler()
    }

    override fun onResume() {
        super.onResume()
        feedChangeListener = feedsReference.addValueEventListener(eventListener)
        QuizApp.fbAuth.addAuthStateListener(authListener)
    }

    override fun onStop() {
        super.onStop()
        feedsReference.removeEventListener(feedChangeListener)
        QuizApp.fbAuth.removeAuthStateListener(authListener)
    }

    private fun onUpdateRecyclerAdapter(dataSnapshot: DataSnapshot) {
        for (it in dataSnapshot.children) {
            val news = it.getValue<NewsItem>(NewsItem::class.java)!!
            mNewsMap.put(it.key!!, news)
        }
        feed_item_list?.adapter?.notifyDataSetChanged()
    }

    private fun setUpRecycler() {
        feed_item_list.layoutManager = LinearLayoutManager(context)
        feed_item_list.adapter = NewsListRecyclerViewAdapter(mNewsMap, onNewsInteractionListener)
    }

    interface OnNewsInteractionListener {
        fun onUserSelected(user: UserItem, image: View)
        fun onLikeSelected(feedId: String, diff: Int)
    }
}
不幸的是,我有一个RuntimeException:

java.lang.RuntimeException:无法停止活动{com.example.mylekquizapp/com.example.mylekquizapp.MainActivity}:kotlin.UninitializedPropertyAccessException:lateinit属性feedChangeListener尚未初始化

原因:kotlin.UninitializedPropertyAccessException:lateinit属性feedChangeListener尚未初始化 在com.example.mylekquizapp.news.NewsListFragment.onStopNewsListFragment.kt:86


我不知道怎么解决它。有人能帮你解决这个问题吗?

你必须改变你的桌面方法

您必须在super.onStop之前调用remove调用

如果错误消失了,那就太好了!无论如何,在使用lateinit时,在设置使用该变量之前,应该始终检查是否为NOTNULL。您可以使用属性isInitialized进行检查,该属性返回布尔值!这是在您的函数setUpRecycler中,您可以在其中初始化适配器并使用接口! 我会更进一步,写更多的kotlin,比如:

 if (!:: onNewsInteractionListener.isInitialized) {
       onNewsInteractionListener = context
  }

然后在初始化适配器时还要检查是否不为null!希望有帮助。

App即使没有更改,它也能正常工作。但我还是改变了。也许有什么旧东西在储藏室里。错误消失。请尝试将feedChangeListener=ValueEventListener添加到onCreateView
 if (!:: onNewsInteractionListener.isInitialized) {
       onNewsInteractionListener = context
  }