所以我已经开始使用视图模型了。
以下代码是视图模型的代码:
@HiltViewModel
class Admin_Verif_VM @Inject constructor(
private val repository: Admin_Verif_rp
) : ViewModel(){
private lateinit var bitmap: Bitmap
fun verify(doc_name: String,uid:String){
viewModelScope.launch(Dispatchers.IO){
repository.verify(doc_name,uid)
}
}
fun retrive(doc_name : String,uid: String): Bitmap?{
viewModelScope.launch(Dispatchers.IO){
bitmap = repository.retrive(doc_name,uid)!!
}
return bitmap
}
}
因此,从视图模型来看,我正在调用我的存储库,如下所示:
interface Admin_Verif_rp {
suspend fun verify(doc_name: String,uid:String)
suspend fun retrive(doc_name:String,uid:String): Bitmap?
}
我在Repository Implementation中实现的一个简单接口如下:
class Admin_Verif_rp_imp : Admin_Verif_rp{
override suspend fun verify(doc_name: String,uid:String) {
val query = Firebase.firestore.collection("profiles").whereEqualTo("UID", "$uid").get()
.await()
val array = query.first().toObject(docretreving::class.java).Pending
val len = array.size-1
val list = arrayListOf<String>()
val list2 = arrayListOf<String>()
for (i in 0..len){
if (array[i]=="Passport"){
list2.add(array[i])
val query3 = Firebase.firestore.collection("profiles").document("$uid")
query3.update(
"Verified" , list2
)
}
else{
list.add(array[i])
}
}
val query2 = Firebase.firestore.collection("profiles").document("$uid")
query2.update(
"Pending" , list
)
}
override suspend fun retrive(doc_name:String,uid: String) : Bitmap? {
var bitmap : Bitmap? = null
val storageRef = FirebaseStorage.getInstance().reference?.child("/image/${uid}/$doc_name")
val localfile = File.createTempFile("tempImage", null)
storageRef.getFile(localfile).addOnSuccessListener {
bitmap = BitmapFactory.decodeFile(localfile.absolutePath)
}
return bitmap
}
}
因此,在解释完整的流程时,这里发生的事情是,基本上,我在回购实现中有一个函数,我从接口[repo]调用它,它再次被称为from-view模型。我想让这个函数返回一个位图,我可以在UI页面中使用它来设置图像。位图将从Firebase存储中检索。为此,我在视图模型中创建了一个名为位图的变量。在视图模型函数中,我初始化了位图并尝试返回它。但应用程序崩溃并显示以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.adminv1, PID: 19486
kotlin.UninitializedPropertyAccessException: lateinit property bitmap has not been initialized
at com.example.alliaise_adminv1.Admin.Admin_Verif_VM.retrive(Admin_Verif_VM.kt:28)
at
com.example.alliaise_adminv1.Admin_Verification.onViewCreated(Admin_Verification.kt:38)
基本上在我的视图模型内部的第二个函数中检索((我在那一行有错误:
bitmap = repository.retrive(doc_name,uid)!!
我该如何解决。。。
之所以会发生这种情况,是因为您的函数在位图准备好之前返回位图,因为您在不同的线程中调用repository.retrive(doc_name,uid)!!
,该函数在启动协程后会立即调用return
,它不会等到协程(作业(完成。
我的解决方案
在视图中模型
流量版本
// you can use MutableStateFlow / LiveData
var bitmapFlow: Flow<Bitmap?> = emptyFlow()
fun retrive(doc_name : String,uid: String){
bitmapFlow = flow {
emit(retrive(doc_name,uid))
}
}
StateFlow版本
private var _bitmapFlow = MutableStateFlow<Bitmap?>(null)
val bitmapFlow = _bitmapFlow
fun retrive(doc_name : String,uid: String){
viewModelScope.launch{
bitmapFlow.value = retrive(doc_name,uid)
}
}
活动/片段
lifecycleScope.launch(Dispatcher.IO){
viewModel.bitmapFlow.collect { bitmap:Bitmap? ->
imagaeView.setImageBitmap(bitmap)
}
}