如何创建一个将 Activity 和 Fragment 作为参数上下文的函数

How to make a function that takes both Activity and Fragment as the context for an argument

我有以下函数,可以将 activity 作为参数,当我从 Activity 调用它时,它运行良好。现在我想从一个片段中调用这个函数,但我可以看到编辑器中有一个错误 'Incompatible types: CargoFragment and 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()
                    }
                }
            }
    }

如果这是你的 viewModel,那么你永远不应该引用任何 context/activity/fragment。

最好的方法是让 liveData 保存进度状态并让 UI(activity 或片段)观察它。

无需更改函数参数中的任何内容。 从 activity 调用它 getProductList(this) 并从片段中调用它 getProductList(getActivity()).

不要将 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()
            }
}

用法(在您的 activity 和片段中):

getProductList(
    onSuccess = { list ->
        success(list) // whatever you want to do on success
    },
    onFailure = {
        hideProgressBar() // whatever you want to do on failure
    }
)