### Implement and Open InAppBrowser Source: https://inappwebview.dev/docs/in-app-browsers/in-app-browser Create a custom class extending InAppBrowser to handle events and use openUrlRequest to launch the browser. ```dart import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; WebViewEnvironment? webViewEnvironment; class MyInAppBrowser extends InAppBrowser { MyInAppBrowser({super.webViewEnvironment}); @override Future onBrowserCreated() async { print("Browser Created!"); } @override Future onLoadStart(url) async { print("Started $url"); } @override Future onLoadStop(url) async { print("Stopped $url"); } @override void onReceivedError(WebResourceRequest request, WebResourceError error) { print("Can't load ${request.url}.. Error: ${error.description}"); } @override void onProgressChanged(progress) { print("Progress: $progress"); } @override void onExit() { print("Browser closed!"); } } Future main() async { WidgetsFlutterBinding.ensureInitialized(); if (!kIsWeb && defaultTargetPlatform == TargetPlatform.windows) { final availableVersion = await WebViewEnvironment.getAvailableVersion(); assert(availableVersion != null, 'Failed to find an installed WebView2 Runtime or non-stable Microsoft Edge installation.'); webViewEnvironment = await WebViewEnvironment.create( settings: WebViewEnvironmentSettings(userDataFolder: 'YOUR_CUSTOM_PATH')); } if (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) { await InAppWebViewController.setWebContentsDebuggingEnabled(kDebugMode); } runApp( const MaterialApp( home: MyApp(), ), ); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { final browser = MyInAppBrowser(webViewEnvironment: webViewEnvironment); final settings = InAppBrowserClassSettings( browserSettings: InAppBrowserSettings(hideUrlBar: false), webViewSettings: InAppWebViewSettings( javaScriptEnabled: true, isInspectable: kDebugMode)); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('InAppBrowser Example'), ), body: Center( child: ElevatedButton( onPressed: () { browser.openUrlRequest( urlRequest: URLRequest(url: WebUri("https://flutter.dev")), settings: settings); }, child: const Text("Open InAppBrowser")), ), ); } } ``` -------------------------------- ### Define Digital Asset Links in strings.xml Source: https://inappwebview.dev/docs/in-app-browsers/chrome-safari-browser Configures the asset_statements string resource required for TWA domain verification. ```xml Flutter Trusted Web Activity [{ \"relation\": [\"delegate_permission/common.handle_all_urls\"], \"target\": { \"namespace\": \"web\", \"site\": \"https://flutter.dev\"} }] ``` -------------------------------- ### Implement and use ChromeSafariBrowser Source: https://inappwebview.dev/docs/in-app-browsers/chrome-safari-browser Extend the ChromeSafariBrowser class to handle lifecycle events and use the open method to launch a URL with custom settings. ```dart import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; class MyChromeSafariBrowser extends ChromeSafariBrowser { @override void onOpened() { print("ChromeSafari browser opened"); } @override void onCompletedInitialLoad(didLoadSuccessfully) { print("ChromeSafari browser initial load completed"); } @override void onClosed() { print("ChromeSafari browser closed"); } } Future main() async { WidgetsFlutterBinding.ensureInitialized(); if (!kIsWeb && defaultTargetPlatform == TargetPlatform.android) { await InAppWebViewController.setWebContentsDebuggingEnabled(kDebugMode); } runApp(const MaterialApp(home: MyApp())); } class MyApp extends StatefulWidget { const MyApp({super.key}); @override State createState() => _MyAppState(); } class _MyAppState extends State { final browser = MyChromeSafariBrowser(); @override void initState() { browser.addMenuItem(ChromeSafariBrowserMenuItem( id: 1, label: 'Custom item menu 1', onClick: (url, title) { print('Custom item menu 1 clicked!'); })); super.initState(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('ChromeSafariBrowser Example'), ), body: Center( child: ElevatedButton( onPressed: () async { await browser.open( url: WebUri("https://flutter.dev/"), settings: ChromeSafariBrowserSettings( shareState: CustomTabsShareState.SHARE_STATE_OFF, barCollapsingEnabled: true)); }, child: const Text("Open Chrome Safari Browser")), ), ); } } ``` -------------------------------- ### Define Android Secondary Toolbar Layout Source: https://inappwebview.dev/docs/in-app-browsers/chrome-safari-browser Create an XML layout file to define the structure and clickable IDs for the secondary toolbar. ```xml