// Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // ignore_for_file: public_member_api_docs import 'dart:async'; import 'package:flutter/material.dart'; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'URL Launcher', theme: ThemeData( primarySwatch: Colors.blue, ), home: const MyHomePage(title: 'URL Launcher'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State createState() => _MyHomePageState(); } class _MyHomePageState extends State { Future? _launched; String _phone = ''; Future _launchInBrowser(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { await launcher.launch( url, useSafariVC: false, useWebView: false, enableJavaScript: false, enableDomStorage: false, universalLinksOnly: false, headers: {'my_header_key': 'my_header_value'}, ); } else { throw Exception('Could not launch $url'); } } Future _launchInWebViewOrVC(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { await launcher.launch( url, useSafariVC: true, useWebView: true, enableJavaScript: false, enableDomStorage: false, universalLinksOnly: false, headers: {'my_header_key': 'my_header_value'}, ); } else { throw Exception('Could not launch $url'); } } Future _launchInWebViewWithJavaScript(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { await launcher.launch( url, useSafariVC: true, useWebView: true, enableJavaScript: true, enableDomStorage: false, universalLinksOnly: false, headers: {}, ); } else { throw Exception('Could not launch $url'); } } Future _launchInWebViewWithDomStorage(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { await launcher.launch( url, useSafariVC: true, useWebView: true, enableJavaScript: false, enableDomStorage: true, universalLinksOnly: false, headers: {}, ); } else { throw Exception('Could not launch $url'); } } Future _launchUniversalLinkIos(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { final bool nativeAppLaunchSucceeded = await launcher.launch( url, useSafariVC: false, useWebView: false, enableJavaScript: false, enableDomStorage: false, universalLinksOnly: true, headers: {}, ); if (!nativeAppLaunchSucceeded) { await launcher.launch( url, useSafariVC: true, useWebView: true, enableJavaScript: false, enableDomStorage: false, universalLinksOnly: true, headers: {}, ); } } } Widget _launchStatus(BuildContext context, AsyncSnapshot snapshot) { if (snapshot.hasError) { return Text('Error: ${snapshot.error}'); } else { return const Text(''); } } Future _makePhoneCall(String url) async { final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance; if (await launcher.canLaunch(url)) { await launcher.launch( url, useSafariVC: false, useWebView: false, enableJavaScript: false, enableDomStorage: false, universalLinksOnly: true, headers: {}, ); } else { throw Exception('Could not launch $url'); } } @override Widget build(BuildContext context) { const String toLaunch = 'https://www.cylog.org/headers/'; return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: ListView( children: [ Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Padding( padding: const EdgeInsets.all(16.0), child: TextField( onChanged: (String text) => _phone = text, decoration: const InputDecoration( hintText: 'Input the phone number to launch')), ), ElevatedButton( onPressed: () => setState(() { _launched = _makePhoneCall('tel:$_phone'); }), child: const Text('Make phone call'), ), const Padding( padding: EdgeInsets.all(16.0), child: Text(toLaunch), ), ElevatedButton( onPressed: () => setState(() { _launched = _launchInBrowser(toLaunch); }), child: const Text('Launch in browser'), ), const Padding(padding: EdgeInsets.all(16.0)), ElevatedButton( onPressed: () => setState(() { _launched = _launchInWebViewOrVC(toLaunch); }), child: const Text('Launch in app'), ), ElevatedButton( onPressed: () => setState(() { _launched = _launchInWebViewWithJavaScript(toLaunch); }), child: const Text('Launch in app(JavaScript ON)'), ), ElevatedButton( onPressed: () => setState(() { _launched = _launchInWebViewWithDomStorage(toLaunch); }), child: const Text('Launch in app(DOM storage ON)'), ), const Padding(padding: EdgeInsets.all(16.0)), ElevatedButton( onPressed: () => setState(() { _launched = _launchUniversalLinkIos(toLaunch); }), child: const Text( 'Launch a universal link in a native app, fallback to Safari.(Youtube)'), ), const Padding(padding: EdgeInsets.all(16.0)), ElevatedButton( onPressed: () => setState(() { _launched = _launchInWebViewOrVC(toLaunch); Timer(const Duration(seconds: 5), () { UrlLauncherPlatform.instance.closeWebView(); }); }), child: const Text('Launch in app + close after 5 seconds'), ), const Padding(padding: EdgeInsets.all(16.0)), FutureBuilder(future: _launched, builder: _launchStatus), ], ), ], ), ); } }