authorizeInteractive method

  1. @override
Future<String?> authorizeInteractive({
  1. required BuildContext context,
  2. required String title,
  3. required String authorizationUrl,
  4. required String redirectUrl,
  5. required int popupWidth,
  6. required int popupHeight,
  7. bool useWebRedirectLoop = false,
})
override

Implementation

@override
Future<String?> authorizeInteractive({
  required BuildContext context,
  required String title,
  required String authorizationUrl,
  required String redirectUrl,
  required int popupWidth,
  required int popupHeight,
  bool useWebRedirectLoop = false,
}) async {
  final _controller = WebviewController();
  try {
    //Create the url
    await _controller.initialize();

    final result = await showDialog<String?>(
      context: context,
      barrierDismissible: false,
      builder: (dialogContext) {
        _controller.url.listen((url) {
          if (url.startsWith(redirectUrl)) {
            Navigator.pop(dialogContext, url);
          }
        });

        return AlertDialog(
          actions: [
            IconButton(
              onPressed: () => Navigator.pop(dialogContext, null),
              icon: const Icon(Icons.close),
            ),
          ],
          content: SizedBox(
            width:
                min(popupWidth.toDouble(), MediaQuery.of(context).size.width),
            height: min(
                popupHeight.toDouble(), MediaQuery.of(context).size.height),
            child: Webview(
              _controller,
              permissionRequested: (url, permissionKind, isUserInitiated) =>
                  _onPermissionRequested(
                url,
                permissionKind,
                isUserInitiated,
                dialogContext,
              ),
            ),
          ),
          title: Text(title),
        );
      },
    );

    if (result == null) throw AuthenticationException(ERROR_USER_CLOSED);

    return result;
  } finally {
    _controller.dispose();
  }
}