【发布时间】:2023-03-13 14:27:01
【问题描述】:
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.onStop(NewsListFragment.kt:86)
我不知道如何解决它。请问有谁能帮忙解决这个问题。
【问题讨论】:
-
尝试将
feedChangeListener= ValueEventListener添加到onCreateView