我有以下函数,可以将活动作为参数,当我从Activity
调用它时,它可以完美地工作。现在我想从一个片段调用这个函数,但我可以看到编辑器中有一个错误,上面写着"不兼容类型:CargoFragment和Activity"。我试着用context: Context
替换activity: Activity
。
我的错误在"is CargoFragment">
fun getProductList(activity: Activity) {
mFireStore.collection("abc")
.get()
.addOnSuccessListener {
.....
.....
.....
productList.add(product)
}
when (activity) {
is CargoActivity -> {
activity.success(productList)
}
is CheckoutActivity -> {
activity.success(productList)
}
is CargoFragment -> {
activity.success(productList)
}
}
}
.addOnFailureListener { e ->
Log.d("CheckTag", e.message!!)
when (activity) {
is CargoActivity -> {
activity.hideProgressDialog()
}
is CheckoutActivity -> {
activity.hideProgressDialog()
}
}
}
}
不要将activity
传递给getProductList
。据我所知,当您得到响应(成功或失败(时,您正在传递activity
来执行一些代码。实现这一点的更好方法是公开回调lambda。
考虑这种方法:
fun getProductList(onSuccess: (List<Product>) -> Unit, onFailure:() -> Unit) {
mFireStore.collection("abc")
.get()
.addOnSuccessListener {
...
productList.add(product)
}
onSuccess(productList)
}
.addOnFailureListener { e ->
...
onFailure()
}
}
用法(在你的活动和片段中(:
getProductList(
onSuccess = { list ->
success(list) // whatever you want to do on success
},
onFailure = {
hideProgressBar() // whatever you want to do on failure
}
)
如果这是你的viewModel,那么你永远不应该引用任何上下文/活动/片段。
最好的方法是使用liveData来保存进度状态,并让UI(活动或片段(观察到这一点。
无需更改函数参数中的任何内容。从活动中调用getProductList(this)
并从片段中调用它getProductList(getActivity())
。