使用协程检索Firebase数据



我正在尝试重写我的程序并开始使用Kotlin协程。这是我检索给定组的产品列表的函数。调试后,看起来一切都是正确的。

class FirebaseRepository {
private val db = FirebaseFirestore.getInstance()
private val auth = FirebaseAuth.getInstance()
fun getCurrentUserId(): String{
return auth.currentUser!!.uid
}
suspend fun getLista(): MutableLiveData<List<Produkt>> {
val result = MutableLiveData<List<Produkt>>()
val lista = mutableListOf<Produkt>()
db.collection(Constants.GROUP)
.document("xGRWy21hwQ7yuBGIJtnA")
.collection("Przedmioty")
.orderBy("dataDodaniaProduktu", Query.Direction.DESCENDING)
.get().await().forEach {
val singleProdukt = it.toObject(Produkt::class.java)
singleProdukt.produktId = it.id
lista.add(singleProdukt)
result.postValue(lista)
}
return result
}

这是我的ViewModel类:

class ListaViewModel: ViewModel() {
private val repository = FirebaseRepository()
var _produkty =  MutableLiveData<List<Produkt>>()
val produkty : LiveData<List<Produkt>> = _produkty

init {
viewModelScope.launch {
_produkty = repository.getLista()
}
}

最后在我的片段中,我试图观察实时数据,但看起来没有任何东西正在传递给我的适配器。我做错了什么?

class ListaFragment : Fragment(), ListaAdapter.OnItemClickListener {
private var _binding: FragmentListaBinding? = null
private val binding get() = _binding!!
private lateinit var recyclerView : RecyclerView
private lateinit var listAdapter : ListaAdapter
private val listaViewModel by viewModels<ListaViewModel>()

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
_binding = FragmentListaBinding.inflate(inflater, container, false)
recyclerView = binding.recyclerView
listAdapter = ListaAdapter(emptyList(), this)
recyclerView.adapter = listAdapter // Zapobiega "No adapter attached; skipping layout"
recyclerView.layoutManager = LinearLayoutManager(requireActivity())
recyclerView.setHasFixedSize(true)

listaViewModel.produkty.observe(viewLifecycleOwner, Observer {
listAdapter = ListaAdapter(it, this)
}
return binding.root
}

试着替换这个:

val produkty : LiveData<List<Produkt>> = _produkty

val produkty : LiveData<List<Produkt>> get() = _produkty

这样你就有了" get& quot;而不是"initializer"。初始化器将计算它的值一次(到空的实时数据),在你重新分配var之后,它不会改变你的val的值。

代码中的问题在于您在observe()方法中创建了ListaAdapter类的新实例,而没有通知适配器有关更改的情况。这就是为什么在适配器中没有得到结果的原因。要解决这个问题,只需在适配器类中创建一个方法:

fun setProduktList(produktList: List<Produkt>) {
this.produktList = produktList
notifyDataSetChanged()
}
然后在observe()方法中,使用以下代码行:
listaViewModel.produkty.observe(viewLifecycleOwner, Observer {
//listAdapter = ListaAdapter(it, this) //Removed
listAdapter.setProduktList(it) 👈
}

最新更新