如何生成一个同时将Activity和Fragment作为参数上下文的函数



我有以下函数,可以将活动作为参数,当我从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())

最新更新