main.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
  4. const kAndroidUserAgent =
  5. "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Mobile Safari/537.36";
  6. String selectedUrl = "https://flutter.io";
  7. void main() {
  8. runApp(new MyApp());
  9. }
  10. class MyApp extends StatelessWidget {
  11. @override
  12. Widget build(BuildContext context) {
  13. return new MaterialApp(
  14. title: 'Flutter WebView Demo',
  15. theme: new ThemeData(
  16. primarySwatch: Colors.blue,
  17. ),
  18. routes: {
  19. "/": (_) => new MyHomePage(title: "Flutter WebView Demo"),
  20. "/widget": (_) => new WebviewScaffold(
  21. url: selectedUrl,
  22. appBar: new AppBar(
  23. title: new Text("Widget webview"),
  24. ),
  25. withZoom: true,
  26. )
  27. },
  28. );
  29. }
  30. }
  31. class MyHomePage extends StatefulWidget {
  32. MyHomePage({Key key, this.title}) : super(key: key);
  33. final String title;
  34. @override
  35. _MyHomePageState createState() => new _MyHomePageState();
  36. }
  37. class _MyHomePageState extends State<MyHomePage> {
  38. // Instance of WebView plugin
  39. final flutterWebviewPlugin = new FlutterWebviewPlugin();
  40. // On destroy stream
  41. StreamSubscription _onDestroy;
  42. // On urlChanged stream
  43. StreamSubscription<String> _onUrlChanged;
  44. // On urlChanged stream
  45. StreamSubscription<WebViewStateChanged> _onStateChanged;
  46. TextEditingController _urlCtrl = new TextEditingController(text: selectedUrl);
  47. TextEditingController _codeCtrl =
  48. new TextEditingController(text: "window.navigator.userAgent");
  49. GlobalKey<ScaffoldState> _scaffoldKey = new GlobalKey();
  50. final _history = [];
  51. @override
  52. initState() {
  53. super.initState();
  54. flutterWebviewPlugin.close();
  55. _urlCtrl.addListener(() {
  56. selectedUrl = _urlCtrl.text;
  57. });
  58. // Add a listener to on destroy WebView, so you can make came actions.
  59. _onDestroy = flutterWebviewPlugin.onDestroy.listen((_) {
  60. if (mounted) {
  61. // Actions like show a info toast.
  62. _scaffoldKey.currentState
  63. .showSnackBar(new SnackBar(content: new Text("Webview Destroyed")));
  64. }
  65. });
  66. // Add a listener to on url changed
  67. _onUrlChanged = flutterWebviewPlugin.onUrlChanged.listen((String url) {
  68. if (mounted) {
  69. setState(() {
  70. _history.add("onUrlChanged: $url");
  71. });
  72. }
  73. });
  74. _onStateChanged =
  75. flutterWebviewPlugin.onStateChanged.listen((WebViewStateChanged state) {
  76. if (mounted) {
  77. setState(() {
  78. _history.add("onStateChanged: ${state.type} ${state.url}");
  79. });
  80. }
  81. });
  82. }
  83. @override
  84. void dispose() {
  85. // Every listener should be canceled, the same should be done with this stream.
  86. _onDestroy.cancel();
  87. _onUrlChanged.cancel();
  88. _onStateChanged.cancel();
  89. flutterWebviewPlugin.dispose();
  90. super.dispose();
  91. }
  92. @override
  93. Widget build(BuildContext context) {
  94. return new Scaffold(
  95. key: _scaffoldKey,
  96. appBar: new AppBar(
  97. title: new Text('Plugin example app'),
  98. ),
  99. body: new Column(
  100. mainAxisAlignment: MainAxisAlignment.center,
  101. children: [
  102. new Container(
  103. padding: const EdgeInsets.all(24.0),
  104. child: new TextField(controller: _urlCtrl),
  105. ),
  106. new RaisedButton(
  107. onPressed: () {
  108. flutterWebviewPlugin.launch(selectedUrl,
  109. rect: new Rect.fromLTWH(
  110. 0.0, 0.0, MediaQuery.of(context).size.width, 300.0),
  111. userAgent: kAndroidUserAgent);
  112. },
  113. child: new Text("Open Webview (rect)"),
  114. ),
  115. new RaisedButton(
  116. onPressed: () {
  117. flutterWebviewPlugin.launch(selectedUrl, hidden: true);
  118. },
  119. child: new Text("Open 'hidden' Webview"),
  120. ),
  121. new RaisedButton(
  122. onPressed: () {
  123. flutterWebviewPlugin.launch(selectedUrl);
  124. },
  125. child: new Text("Open Fullscreen Webview"),
  126. ),
  127. new RaisedButton(
  128. onPressed: () {
  129. Navigator.of(context).pushNamed("/widget");
  130. },
  131. child: new Text("Open widget webview"),
  132. ),
  133. new Container(
  134. padding: const EdgeInsets.all(24.0),
  135. child: new TextField(controller: _codeCtrl),
  136. ),
  137. new RaisedButton(
  138. onPressed: () {
  139. Future<String> future =
  140. flutterWebviewPlugin.evalJavascript(_codeCtrl.text);
  141. future.then((String result) {
  142. setState(() {
  143. _history.add("eval: $result");
  144. });
  145. });
  146. },
  147. child: new Text("Eval some javascript"),
  148. ),
  149. new RaisedButton(
  150. onPressed: () {
  151. setState(() {
  152. _history.clear();
  153. });
  154. flutterWebviewPlugin.close();
  155. },
  156. child: new Text("Close"),
  157. ),
  158. new RaisedButton(
  159. onPressed: () {
  160. flutterWebviewPlugin.getCookies().then((m) {
  161. setState(() {
  162. _history.add("cookies: $m");
  163. });
  164. });
  165. },
  166. child: new Text("Cookies"),
  167. ),
  168. new Text(_history.join("\n"))
  169. ],
  170. ),
  171. );
  172. }
  173. }