记一次flutter和kotlin混编代码的线上Bug定位

306 阅读1分钟

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()