|
- // 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<MyHomePage> createState() => _MyHomePageState();
- }
-
- class _MyHomePageState extends State<MyHomePage> {
- Future<void>? _launched;
- String _phone = '';
-
- Future<void> _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: <String, String>{'my_header_key': 'my_header_value'},
- );
- } else {
- throw Exception('Could not launch $url');
- }
- }
-
- Future<void> _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: <String, String>{'my_header_key': 'my_header_value'},
- );
- } else {
- throw Exception('Could not launch $url');
- }
- }
-
- Future<void> _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: <String, String>{},
- );
- } else {
- throw Exception('Could not launch $url');
- }
- }
-
- Future<void> _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: <String, String>{},
- );
- } else {
- throw Exception('Could not launch $url');
- }
- }
-
- Future<void> _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: <String, String>{},
- );
- if (!nativeAppLaunchSucceeded) {
- await launcher.launch(
- url,
- useSafariVC: true,
- useWebView: true,
- enableJavaScript: false,
- enableDomStorage: false,
- universalLinksOnly: true,
- headers: <String, String>{},
- );
- }
- }
- }
-
- Widget _launchStatus(BuildContext context, AsyncSnapshot<void> snapshot) {
- if (snapshot.hasError) {
- return Text('Error: ${snapshot.error}');
- } else {
- return const Text('');
- }
- }
-
- Future<void> _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: <String, String>{},
- );
- } 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: <Widget>[
- Column(
- mainAxisAlignment: MainAxisAlignment.center,
- children: <Widget>[
- 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<void>(future: _launched, builder: _launchStatus),
- ],
- ),
- ],
- ),
- );
- }
- }
|