【问题标题】:Problem with lateinit in Android (Kotlin) - java.lang.RuntimeExceptionAndroid (Kotlin) 中的 lateinit 问题 - java.lang.RuntimeException
【发布时间】:2023-03-13 14:27:01
【问题描述】:

lateinitjava.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.onStop(NewsListFragment.kt:86)

我不知道如何解决它。请问有谁能帮忙解决这个问题。

【问题讨论】:

  • 尝试将feedChangeListener= ValueEventListener添加到onCreateView

标签: android kotlin


【解决方案1】:

您必须对 onStop 方法进行更改

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

您必须在 super.onStop() 之前调用删除调用

【讨论】:

  • 应用程序即使没有更改也可以正常工作。但我还是改了。也许旧的东西在缓存中。错误消失。
【解决方案2】:

嘿,

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

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

稍后还会在初始化适配器时检查是否为空!希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 2020-08-08
    • 2020-07-24
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多