Обновлен код в Edit 2
Edit:
Я нашел этот , который, я думаю, решает ту же проблему, но мне трудно понять, что именно здесь происходит, так как это происходит на Java, и моя Java не так хороша, как мой kotlin. Любые разъяснения будут оценены.
Всякий раз, когда я объявляю переменную lateinit и затем инициализирую ее с ListenerForSingleValueEvent
, я получаю сообщение об ошибке, что она никогда не инициализировалась. Это как инициализация ограничена слушателем. То, что я в итоге делаю, это много вложений, но это делает код очень грязным. Есть ли причина для этого? Как обойти это?
Например, в следующем коде я получу сообщение о том, что userProfile
никогда не инициализировался:
class ProfileFragment : Fragment() {
lateinit var userProfile: Users
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? = inflater.inflate(R.layout.fragment_profile, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
arguments?.let {
val safeArgs = ProfileFragmentArgs.fromBundle(it)
val userProfileUid = safeArgs.usersProfile
val refUser = FirebaseDatabase.getInstance().getReference("users/$userProfileUid")
refUser.addListenerForSingleValueEvent(object : ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
userProfile = p0.getValue(Users::class.java)
}
})
}
val uri = userProfile?.image
Picasso.get().load(uri).into(profilePicture)
profileName.text = userProfile?.name
}
}
Редактировать 2:
Прочитав ответ Алекса Мамо на этот вопрос и тот, который он прикрепил, я попытался соответствующим образом изменить свой код, но все равно не могу заставить его работать.
Вот текущий код (элементы разные, так как я работал над своим кодом, но это точно такой же случай)
* Я попытался поместить cal для readData с разделом аргументов или после него, но ни одна из них не работает для меня, и я продолжаю получать сообщение об ошибке, что imageObject не был инициализирован, когда я пытаюсь использовать его в onViewCreated
class ImageFullSizeFragment : androidx.fragment.app.Fragment() {
lateinit var refImage: DatabaseReference
lateinit var imageObject: Images
override fun onAttach(context: Context) {
super.onAttach(context)
arguments?.let {
val safeArgs = ImageFullSizeFragmentArgs.fromBundle(it)
val imageId = safeArgs.imageId
refImage = FirebaseDatabase.getInstance().getReference("/images/feed/$imageId")
readData(object : MyImageCallBack {
override fun onCallback(value: Images) {
imageObject = value
}
})
}
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val mainImage = view.findViewById<ImageView>(R.id.image_full_image)
Picasso.get().load(Uri.parse(imageObject.image)).into(mainImage)
}
fun readData(myImagesCallback: MyImageCallBack) {
refImage.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
val image = p0.getValue(Images::class.java)
myImagesCallback.onCallback(image!!)
}
})
}
}
А это интерфейс:
interface MyImageCallBack {
fun onCallback(value: Images)
}