好吧,所以我正在开发一个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;怎么做?.我需要用别的东西吗?无论如何,我真的很感谢你的帮助!
我尝试使用暂停和协程,但我似乎不能得到这些权利+他们觉得错了?
1条答案
按热度按时间tkclm6bt1#
这应该返回您期望的值