android 如何使用firestore(Kotlin)将数据从后端传递到前端

i5desfxk  于 2023-04-18  发布在  Android
关注(0)|答案(1)|浏览(121)

好吧,所以我正在开发一个Android应用程序使用firebase和firestore.我试图得到一个地址出firestore使用它的id.我做了一个测试viewModel,像这样`

class AdresTestVM @Inject constructor(private val getAdresUseCase : GetAdresUseCase):   ViewModel() {

     fun getAdres(id : String) : Adres = getAdresUseCase.invoke(id)

     private val data = MutableStateFlow(getAdresUseCase.invoke("LdIJ1hy6d7HOrGR8RiMS"))`
}

现在我的GetAdresUseCase看起来像这样`

class GetAdresUseCase @Inject constructor(
    private val repository: AdresRepo
) {
suspend fun invoke(id : String) : Adres = repository.getAdres(id)
}

它调用我的回购,看起来像

@Singleton
class AdresRepo @Inject constructor(
    private val backend: AdresBackend,
) {
    suspend fun getAdres(id : String): Adres {
        val adres = backend.readAdres(id)
        if(adres != null) {
            return adres
        }
        return Adres("", 0, 0, "", "")
   }

它在我的后端调用另一个函数,它看起来像`

fun readAdres(adresId : String) : Adres? {
    var docRef = Firebase.firestore.collection("adres).document(adresId)
    var adres: Adres? = null

    docRef.get().addOnSuccessListener { document ->
        if (document != null) {
            Log.d("succes", "DocumentSnapshot data: ${document.data}")
            adres = document.toObject<Adres>()
        } else {
            Log.d("fail", "No such document")
        }
    }

    return adres
}

我现在的问题是,我从来没有真正传递我的数据,它只是返回null,因为我没有使用suspend。使用suspend的问题是,我似乎无法将其合并到我的mainActivity中,如`

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContent {
           Sel1Theme {
               // A surface container using the 'background' color from the theme
               Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colors.background
                ) {

                    val vm : AdresTestVM = viewModel()
                    //THIS LINE
                    Text(text = "vm.GetAdress("LdIJ1hy6d7HOrGR8RiMS")")
            }
        }
    }
}
}

我怎样才能最好地传递这个数据呢?如果是的话,我是否使用suspend;怎么做?.我需要用别的东西吗?无论如何,我真的很感谢你的帮助!
我尝试使用暂停和协程,但我似乎不能得到这些权利+他们觉得错了?

tkclm6bt

tkclm6bt1#

这应该返回您期望的值

suspend fun readAdres(adresId : String) : Adres? = suspendCoroutine { continuation -> {
    var docRef = Firebase.firestore.collection("adres).document(adresId)

    docRef.get().addOnSuccessListener { document ->
        if (document != null) {
            Log.d("succes", "DocumentSnapshot data: ${document.data}")
            continuation.resume(document.toObject<Adres>())
        } else {
            Log.d("fail", "No such document")
            continuation.resume(null)
        }
    }
  }
}

相关问题