How can I load the deeplink in webview when the user click the deeplink?

249 Views Asked by At

this is my deeplink sgapp://sgapp.com/register/user/form, now i can launch my app when the deeplink is pressed. But the webview is not open sgapp.com/register/user/form this link when the app is launched. How can I make it to let the webview change to the link from deeplink.

Below is my code:

import 'dart:async';
import 'package:flutter/material.dart';
import 'package:webview_flutter/webview_flutter.dart';
import './app_constant.dart';
import './iw_one_signal.dart';
import 'package:uni_links/uni_links.dart';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/services.dart' show PlatformException;

bool _initialUriIsHandled = false;

class Home extends StatefulWidget {
  const Home({super.key});

  @override
  State<Home> createState() => _HomeState();
}

class _HomeState extends State<Home> {
  Uri? _initialUri;
  Uri? _latestUri;
  Object? _err;

  StreamSubscription? _sub;

  @override
  void initState() {
    super.initState();
    // NOTE: no await so that webview can be rendered immediately while one signal get initialized
    IwOneSignal.initPlatformState();
    _handleIncomingLinks();
    _handleInitialUri();
  }

  @override
  void dispose() {
    _sub?.cancel();
    super.dispose();
  }

  void _handleIncomingLinks() {
    if (!kIsWeb) {
      _sub = uriLinkStream.listen((Uri? uri) {
        if (!mounted) return;
        print('got uri: $uri');
        setState(() {
          _latestUri = uri;
          _err = null;
        });
      }, onError: (Object err) {
        if (!mounted) return;
        // print('got err: $err');
        setState(() {
          _latestUri = null;
          if (err is FormatException) {
            _err = err;
          } else {
            _err = null;
          }
        });
      });
    }
  }

  Future<void> _handleInitialUri() async {
    if (!_initialUriIsHandled) {
      _initialUriIsHandled = true;
      try {
        final uri = await getInitialUri();
        // setState(() => _initialUri = uri);
      } on PlatformException {
        // print('falied to get initial uri');
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return getWebview();
  }

  Widget getWebview() {
    var controller = WebViewController()
      ..setJavaScriptMode(JavaScriptMode.unrestricted)
      ..setBackgroundColor(const Color(0x00000000))
      ..setNavigationDelegate(
        NavigationDelegate(
          onProgress: (int progress) {},
          onPageStarted: (String url) {},
          onPageFinished: (String url) {},
          onWebResourceError: (WebResourceError error) {},
        ),
      )
      ..loadRequest(Uri.parse(AppConstant.webviewUrl));

    return WebViewWidget(controller: controller);
  }
}

I had try to use the _latestUri to set the link for webview.

0

There are 0 best solutions below