Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

243 строки
7.4 KiB

  1. // Copyright 2013 The Flutter Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. // ignore_for_file: public_member_api_docs
  5. import 'dart:async';
  6. import 'package:flutter/material.dart';
  7. import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart';
  8. void main() {
  9. runApp(const MyApp());
  10. }
  11. class MyApp extends StatelessWidget {
  12. const MyApp({super.key});
  13. @override
  14. Widget build(BuildContext context) {
  15. return MaterialApp(
  16. title: 'URL Launcher',
  17. theme: ThemeData(
  18. primarySwatch: Colors.blue,
  19. ),
  20. home: const MyHomePage(title: 'URL Launcher'),
  21. );
  22. }
  23. }
  24. class MyHomePage extends StatefulWidget {
  25. const MyHomePage({super.key, required this.title});
  26. final String title;
  27. @override
  28. State<MyHomePage> createState() => _MyHomePageState();
  29. }
  30. class _MyHomePageState extends State<MyHomePage> {
  31. Future<void>? _launched;
  32. String _phone = '';
  33. Future<void> _launchInBrowser(String url) async {
  34. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  35. if (await launcher.canLaunch(url)) {
  36. await launcher.launch(
  37. url,
  38. useSafariVC: false,
  39. useWebView: false,
  40. enableJavaScript: false,
  41. enableDomStorage: false,
  42. universalLinksOnly: false,
  43. headers: <String, String>{'my_header_key': 'my_header_value'},
  44. );
  45. } else {
  46. throw Exception('Could not launch $url');
  47. }
  48. }
  49. Future<void> _launchInWebViewOrVC(String url) async {
  50. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  51. if (await launcher.canLaunch(url)) {
  52. await launcher.launch(
  53. url,
  54. useSafariVC: true,
  55. useWebView: true,
  56. enableJavaScript: false,
  57. enableDomStorage: false,
  58. universalLinksOnly: false,
  59. headers: <String, String>{'my_header_key': 'my_header_value'},
  60. );
  61. } else {
  62. throw Exception('Could not launch $url');
  63. }
  64. }
  65. Future<void> _launchInWebViewWithJavaScript(String url) async {
  66. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  67. if (await launcher.canLaunch(url)) {
  68. await launcher.launch(
  69. url,
  70. useSafariVC: true,
  71. useWebView: true,
  72. enableJavaScript: true,
  73. enableDomStorage: false,
  74. universalLinksOnly: false,
  75. headers: <String, String>{},
  76. );
  77. } else {
  78. throw Exception('Could not launch $url');
  79. }
  80. }
  81. Future<void> _launchInWebViewWithDomStorage(String url) async {
  82. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  83. if (await launcher.canLaunch(url)) {
  84. await launcher.launch(
  85. url,
  86. useSafariVC: true,
  87. useWebView: true,
  88. enableJavaScript: false,
  89. enableDomStorage: true,
  90. universalLinksOnly: false,
  91. headers: <String, String>{},
  92. );
  93. } else {
  94. throw Exception('Could not launch $url');
  95. }
  96. }
  97. Future<void> _launchUniversalLinkIos(String url) async {
  98. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  99. if (await launcher.canLaunch(url)) {
  100. final bool nativeAppLaunchSucceeded = await launcher.launch(
  101. url,
  102. useSafariVC: false,
  103. useWebView: false,
  104. enableJavaScript: false,
  105. enableDomStorage: false,
  106. universalLinksOnly: true,
  107. headers: <String, String>{},
  108. );
  109. if (!nativeAppLaunchSucceeded) {
  110. await launcher.launch(
  111. url,
  112. useSafariVC: true,
  113. useWebView: true,
  114. enableJavaScript: false,
  115. enableDomStorage: false,
  116. universalLinksOnly: true,
  117. headers: <String, String>{},
  118. );
  119. }
  120. }
  121. }
  122. Widget _launchStatus(BuildContext context, AsyncSnapshot<void> snapshot) {
  123. if (snapshot.hasError) {
  124. return Text('Error: ${snapshot.error}');
  125. } else {
  126. return const Text('');
  127. }
  128. }
  129. Future<void> _makePhoneCall(String url) async {
  130. final UrlLauncherPlatform launcher = UrlLauncherPlatform.instance;
  131. if (await launcher.canLaunch(url)) {
  132. await launcher.launch(
  133. url,
  134. useSafariVC: false,
  135. useWebView: false,
  136. enableJavaScript: false,
  137. enableDomStorage: false,
  138. universalLinksOnly: true,
  139. headers: <String, String>{},
  140. );
  141. } else {
  142. throw Exception('Could not launch $url');
  143. }
  144. }
  145. @override
  146. Widget build(BuildContext context) {
  147. const String toLaunch = 'https://www.cylog.org/headers/';
  148. return Scaffold(
  149. appBar: AppBar(
  150. title: Text(widget.title),
  151. ),
  152. body: ListView(
  153. children: <Widget>[
  154. Column(
  155. mainAxisAlignment: MainAxisAlignment.center,
  156. children: <Widget>[
  157. Padding(
  158. padding: const EdgeInsets.all(16.0),
  159. child: TextField(
  160. onChanged: (String text) => _phone = text,
  161. decoration: const InputDecoration(
  162. hintText: 'Input the phone number to launch')),
  163. ),
  164. ElevatedButton(
  165. onPressed: () => setState(() {
  166. _launched = _makePhoneCall('tel:$_phone');
  167. }),
  168. child: const Text('Make phone call'),
  169. ),
  170. const Padding(
  171. padding: EdgeInsets.all(16.0),
  172. child: Text(toLaunch),
  173. ),
  174. ElevatedButton(
  175. onPressed: () => setState(() {
  176. _launched = _launchInBrowser(toLaunch);
  177. }),
  178. child: const Text('Launch in browser'),
  179. ),
  180. const Padding(padding: EdgeInsets.all(16.0)),
  181. ElevatedButton(
  182. onPressed: () => setState(() {
  183. _launched = _launchInWebViewOrVC(toLaunch);
  184. }),
  185. child: const Text('Launch in app'),
  186. ),
  187. ElevatedButton(
  188. onPressed: () => setState(() {
  189. _launched = _launchInWebViewWithJavaScript(toLaunch);
  190. }),
  191. child: const Text('Launch in app(JavaScript ON)'),
  192. ),
  193. ElevatedButton(
  194. onPressed: () => setState(() {
  195. _launched = _launchInWebViewWithDomStorage(toLaunch);
  196. }),
  197. child: const Text('Launch in app(DOM storage ON)'),
  198. ),
  199. const Padding(padding: EdgeInsets.all(16.0)),
  200. ElevatedButton(
  201. onPressed: () => setState(() {
  202. _launched = _launchUniversalLinkIos(toLaunch);
  203. }),
  204. child: const Text(
  205. 'Launch a universal link in a native app, fallback to Safari.(Youtube)'),
  206. ),
  207. const Padding(padding: EdgeInsets.all(16.0)),
  208. ElevatedButton(
  209. onPressed: () => setState(() {
  210. _launched = _launchInWebViewOrVC(toLaunch);
  211. Timer(const Duration(seconds: 5), () {
  212. UrlLauncherPlatform.instance.closeWebView();
  213. });
  214. }),
  215. child: const Text('Launch in app + close after 5 seconds'),
  216. ),
  217. const Padding(padding: EdgeInsets.all(16.0)),
  218. FutureBuilder<void>(future: _launched, builder: _launchStatus),
  219. ],
  220. ),
  221. ],
  222. ),
  223. );
  224. }
  225. }