FLutter类调用kotlin类中的方法导致的崩溃,场景是Flutter写的界面需要申请读写SD权限,这个过程是异步的,需要等待用户同意、拒绝、忽略等操作后调用Result.onSuccess()或Result.onFail(),这个过程抛出了异常java.lang.IllegalStateException: Reply already submitted,就是多次调用了Result.onSuccess()或Result.onFail()导致的。
//Flutter中申请权限
storageStatus = await Permission.storage.request();
//Flutter中具体的调用kotlin
@override
Future<Map<Permission, PermissionStatus>> requestPermissions(
List<Permission> permissions) async {
final data = encodePermissions(permissions);
final status =
await _methodChannel.invokeMethod('requestPermissions', data);
return decodePermissionRequestResult(Map<int, int>.from(status));
}
//kotlin中接受到flutter中的调用请求
@Override
public void onMethodCall(@NonNull MethodCall call, @NonNull final Result result)
{
switch (call.method) {
case "requestPermissions":
final List<Integer> permissions = call.arguments();
permissionManager.requestPermissions(
permissions,
activity,
result::success,
(String errorCode, String errorDescription) -> result.error(
errorCode,
errorDescription,
null));
break;
}
}
//权限申请结果回调
FlutterActivity.onRequestPermissionsResult()
//进一步调用
FlutterActivityAndFragmentDelegate.onRequestPermissionsResult()
//进一步调用
FlutterEngineConnectionRegistry.onRequestPermissionsResult()
//进一步调用
FlutterEngineActivityPluginBinding.onRequestPermissionsResult()
//进一步调用
PermissionManager.onRequestPermissionsResult()
//该方法中调用了 Result.onSuccess(),抛出了java.lang.IllegalStateException: Reply already //submitted,这个方法在别的地方被调用过一次了,再次调用就出问题。
总结:权限申请回调FlutterActivity的onRequestPermissionsResult,经过一系列的调用回到PermissionManager类中的onRequestPermissionsResult()方法,该方法中调用了 this.successCallback.onSuccess()