【发布时间】:2020-09-13 13:55:57
【问题描述】:
我正在开发一个使用 kotlin 作为主要语言的 android 应用程序。我需要为应用程序的某些部分询问一些运行时权限。因此,我决定编写一个单独的静态函数来检查权限并运行一个方法,而不是编写类似的样板代码来请求权限。这是静态函数
fun permissionExecution(childFragment: Fragment, permission: String, expression: ????) {
Dexter.withActivity(childFragment.requireActivity())
.withPermission(permission)
.withListener(object : PermissionListener {
override fun onPermissionGranted(response: PermissionGrantedResponse?) {
expression()
}
override fun onPermissionRationaleShouldBeShown(
permission: PermissionRequest?,
token: PermissionToken
) {
token.continuePermissionRequest()
}
override fun onPermissionDenied(response: PermissionDeniedResponse) {
if(response.isPermanentlyDenied) {
openSettings(childFragment)
}
}
}).check()
}
当我传入不带参数的方法时,这段代码可以完美运行。但是在某些情况下,我想传入具有不同参数类型的方法。
- 像这样调用方法
permissionExecution(childfragment, permission, foo(string)) - 像这样调用同样的方法
permissionExecution(childfrgment, permission, bas(string, Int))
permissionExecution() 方法中的 espression 参数可以使用什么类类型
【问题讨论】:
-
那么,当
onPermissionGranted时,您想从不同的屏幕执行一些 lambda,对吗?onPermissionGranted里面只有expression()吗? -
我会说重载函数,因为如果你动态地获取函数,你仍然需要在调用它之前通过检查知道里面的东西。
-
@sonnet,是的。让我这样解释一下,写入外部存储,读取手机联系人,使用手机摄像头等过程都需要不同的android访问权限,这需要类似的请求权限方法。首先,您检查权限,如果授予您运行一段代码(即表达式方法)。大多数时候,由于方法签名,每个表达式方法都不同。我正在寻找表达式的全部方法签名。
-
@AnimeshSahu,编写重载将需要我为每个方法签名编写单独的签名,这是我首先要避免的。正在调用的函数除了需要调用之外,对
permissionExecution函数没有影响。 -
我不明白您为什么需要更改
expression的签名。() -> Unit很好,因为你的函数permissionExecution很常见。只需从其他类传递您想要的 lambda。
标签: kotlin android-permissions higher-order-functions