Android(Kotlin)中的lateinit问题-java.lang.RuntimeException
我对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
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
}