init method

Future<void> init({
  1. required BuildContext context,
  2. required void setState(
    1. void fn()
    ),
  3. required Uri uri,
})

Implementation

Future<void> init({
  required BuildContext context,
  required void Function(void Function() fn) setState,
  required Uri uri,
}) async {
  if (is_init) {
    throw StateError('WebViewController.init may only be called once.');
  }
  validateUri(uri);
  if (is_mobile) {
    late final webview_flutter.PlatformWebViewControllerCreationParams params;
    if (webview_flutter.WebViewPlatform.instance
        is webview_flutter_wkwebview.WebKitWebViewPlatform) {
      params =
          webview_flutter_wkwebview.WebKitWebViewControllerCreationParams(
            allowsInlineMediaPlayback: true,
            mediaTypesRequiringUserAction:
                const <webview_flutter_wkwebview.PlaybackMediaTypes>{},
          );
    } else {
      params =
          const webview_flutter.PlatformWebViewControllerCreationParams();
    }
    webview_mobile_controller =
        webview_flutter.WebViewController.fromPlatformCreationParams(params);
    if (!kIsWeb) {
      await webview_mobile_controller.setJavaScriptMode(
        webview_flutter.JavaScriptMode.unrestricted,
      );
      await webview_mobile_controller.setNavigationDelegate(
        webview_flutter.NavigationDelegate(
          onWebResourceError: (webview_flutter.WebResourceError error) {
            onLoadError?.call(
              WebViewLoadError(
                description: error.description,
                code: error.errorCode,
                isForMainFrame: error.isForMainFrame,
              ),
            );
          },
          onNavigationRequest: (webview_flutter.NavigationRequest request) {
            final requestedUri = Uri.tryParse(request.url);
            if (requestedUri == null ||
                !allowedSchemes.contains(requestedUri.scheme.toLowerCase())) {
              return webview_flutter.NavigationDecision.prevent;
            }
            onNavigation?.call(requestedUri);
            return webview_flutter.NavigationDecision.navigate;
          },
        ),
      );
    }
    await webview_mobile_controller.loadRequest(uri);
    is_init = true;
    setState(() {});
  } else if (is_desktop) {
    bool isWebviewAvailable =
        await webview_desktop.WebviewWindow.isWebviewAvailable();
    if (!isWebviewAvailable) {
      throw StateError(
        'The native WebView runtime is not available on this device.',
      );
    }
    webview_desktop_controller = await webview_desktop.WebviewWindow.create(
      configuration: webview_desktop.CreateConfiguration(
        titleBarTopPadding: Platform.isMacOS ? 20 : 0,
      ),
    );
    webview_desktop_controller.addOnUrlRequestCallback((url) {
      final requestedUri = Uri.tryParse(url);
      if (requestedUri != null) {
        onNavigation?.call(requestedUri);
      }
    });
    webview_desktop_controller.setOnNavigationErrorCallback((
      description,
      code,
      url,
    ) {
      onLoadError?.call(
        WebViewLoadError(description: description, code: code, url: url),
      );
    });
    await webview_desktop_controller.launch(uri.toString());
    is_init = true;
    setState(() {});
  }
}