Sfoglia il codice sorgente

Return JavascriptMessage object for onPostMessage
update example for onPostMessage

rin.lv 6 anni fa
parent
commit
af79e4c978

+ 35 - 11
example/lib/main.dart

@@ -7,7 +7,9 @@ import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
 const kAndroidUserAgent =
     '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';
 
-String selectedUrl = 'https://flutter.io';
+String selectedUrl = 'https://damp-coast-35782.herokuapp.com';
+
+const List<String> jsChannels = ['Print'];
 
 void main() => runApp(MyApp());
 
@@ -26,6 +28,7 @@ class MyApp extends StatelessWidget {
         '/widget': (_) {
           return WebviewScaffold(
             url: selectedUrl,
+            javascriptChannels: jsChannels,
             appBar: AppBar(
               title: const Text('Widget WebView'),
             ),
@@ -99,6 +102,8 @@ class _MyHomePageState extends State<MyHomePage> {
 
   StreamSubscription<double> _onScrollXChanged;
 
+  StreamSubscription<JavascriptMessage> _onPostMessage;
+
   final _urlCtrl = TextEditingController(text: selectedUrl);
 
   final _codeCtrl = TextEditingController(text: 'window.navigator.userAgent');
@@ -121,7 +126,8 @@ class _MyHomePageState extends State<MyHomePage> {
     _onDestroy = flutterWebViewPlugin.onDestroy.listen((_) {
       if (mounted) {
         // Actions like show a info toast.
-        _scaffoldKey.currentState.showSnackBar(const SnackBar(content: const Text('Webview Destroyed')));
+        _scaffoldKey.currentState.showSnackBar(
+            const SnackBar(content: const Text('Webview Destroyed')));
       }
     });
 
@@ -134,15 +140,17 @@ class _MyHomePageState extends State<MyHomePage> {
       }
     });
 
-    _onProgressChanged = flutterWebViewPlugin.onProgressChanged.listen((double progress) {
+    _onProgressChanged =
+        flutterWebViewPlugin.onProgressChanged.listen((double progress) {
       if (mounted) {
         setState(() {
           _history.add("onProgressChanged: $progress");
         });
       }
     });
-    
-    _onScrollYChanged = flutterWebViewPlugin.onScrollYChanged.listen((double y) {
+
+    _onScrollYChanged =
+        flutterWebViewPlugin.onScrollYChanged.listen((double y) {
       if (mounted) {
         setState(() {
           _history.add('Scroll in Y Direction: $y');
@@ -150,7 +158,8 @@ class _MyHomePageState extends State<MyHomePage> {
       }
     });
 
-    _onScrollXChanged = flutterWebViewPlugin.onScrollXChanged.listen((double x) {
+    _onScrollXChanged =
+        flutterWebViewPlugin.onScrollXChanged.listen((double x) {
       if (mounted) {
         setState(() {
           _history.add('Scroll in X Direction: $x');
@@ -158,7 +167,8 @@ class _MyHomePageState extends State<MyHomePage> {
       }
     });
 
-    _onStateChanged = flutterWebViewPlugin.onStateChanged.listen((WebViewStateChanged state) {
+    _onStateChanged =
+        flutterWebViewPlugin.onStateChanged.listen((WebViewStateChanged state) {
       if (mounted) {
         setState(() {
           _history.add('onStateChanged: ${state.type} ${state.url}');
@@ -166,13 +176,23 @@ class _MyHomePageState extends State<MyHomePage> {
       }
     });
 
-    _onHttpError = flutterWebViewPlugin.onHttpError.listen((WebViewHttpError error) {
+    _onHttpError =
+        flutterWebViewPlugin.onHttpError.listen((WebViewHttpError error) {
       if (mounted) {
         setState(() {
           _history.add('onHttpError: ${error.code} ${error.url}');
         });
       }
     });
+
+    _onPostMessage =
+        flutterWebViewPlugin.onPostMessage.listen((JavascriptMessage message) {
+      if (mounted) {
+        setState(() {
+          _history.add('onPostMessage: ${message.channel} ${message.message}');
+        });
+      }
+    });
   }
 
   @override
@@ -185,6 +205,7 @@ class _MyHomePageState extends State<MyHomePage> {
     _onProgressChanged.cancel();
     _onScrollXChanged.cancel();
     _onScrollYChanged.cancel();
+    _onPostMessage.cancel();
 
     flutterWebViewPlugin.dispose();
 
@@ -210,9 +231,11 @@ class _MyHomePageState extends State<MyHomePage> {
               onPressed: () {
                 flutterWebViewPlugin.launch(
                   selectedUrl,
-                  rect: Rect.fromLTWH(0.0, 0.0, MediaQuery.of(context).size.width, 300.0),
+                  rect: Rect.fromLTWH(
+                      0.0, 0.0, MediaQuery.of(context).size.width, 300.0),
                   userAgent: kAndroidUserAgent,
-                  invalidUrlRegex: r'^(https).+(twitter)', // prevent redirecting to twitter when user click on its icon in flutter website
+                  invalidUrlRegex:
+                      r'^(https).+(twitter)', // prevent redirecting to twitter when user click on its icon in flutter website
                 );
               },
               child: const Text('Open Webview (rect)'),
@@ -241,7 +264,8 @@ class _MyHomePageState extends State<MyHomePage> {
             ),
             RaisedButton(
               onPressed: () {
-                final future = flutterWebViewPlugin.evalJavascript(_codeCtrl.text);
+                final future =
+                    flutterWebViewPlugin.evalJavascript(_codeCtrl.text);
                 future.then((String result) {
                   setState(() {
                     _history.add('eval: $result');

+ 1 - 0
lib/flutter_webview_plugin.dart

@@ -1,4 +1,5 @@
 library flutter_webview_plugin;
 
 export 'src/base.dart';
+export 'src/javascript_message.dart';
 export 'src/webview_scaffold.dart';

+ 7 - 3
lib/src/base.dart

@@ -4,6 +4,8 @@ import 'dart:ui';
 import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 
+import 'javascript_message.dart';
+
 const _kChannel = 'flutter_webview_plugin';
 
 // TODO: more general state for iOS/android
@@ -31,7 +33,7 @@ class FlutterWebviewPlugin {
   final _onScrollYChanged = StreamController<double>.broadcast();
   final _onProgressChanged = new StreamController<double>.broadcast();
   final _onHttpError = StreamController<WebViewHttpError>.broadcast();
-  final _onPostMessage = StreamController<Map<String, String>>.broadcast();
+  final _onPostMessage = StreamController<JavascriptMessage>.broadcast();
 
   Future<Null> _handleMessages(MethodCall call) async {
     switch (call.method) {
@@ -65,7 +67,9 @@ class FlutterWebviewPlugin {
             WebViewHttpError(call.arguments['code'], call.arguments['url']));
         break;
       case 'javascriptChannelMessage':
-        _onPostMessage.add(call.arguments);
+        final JavascriptMessage javascriptMessage = JavascriptMessage(
+            call.arguments['channel'], call.arguments['message']);
+        _onPostMessage.add(javascriptMessage);
         break;
     }
   }
@@ -95,7 +99,7 @@ class FlutterWebviewPlugin {
 
   Stream<WebViewHttpError> get onHttpError => _onHttpError.stream;
 
-  Stream<Map<String, String>> get onPostMessage => _onPostMessage.stream;
+  Stream<JavascriptMessage> get onPostMessage => _onPostMessage.stream;
 
   /// Start the Webview with [url]
   /// - [headers] specify additional HTTP headers

+ 16 - 0
lib/src/javascript_message.dart

@@ -0,0 +1,16 @@
+/// A message that was sent by JavaScript code running in a [WebView].
+
+class JavascriptMessage {
+  /// Constructs a JavaScript message object.
+  ///
+  /// The `channel` parameter must not be null.
+  /// The `message` parameter must not be null.
+  const JavascriptMessage(this.channel, this.message)
+      : assert(message != null, channel != null);
+
+  /// The contents of the channel that was sent by the JavaScript code.
+  final String channel;
+
+  /// The contents of the message that was sent by the JavaScript code.
+  final String message;
+}

+ 7 - 3
lib/src/webview_scaffold.dart

@@ -7,12 +7,12 @@ import 'package:flutter/rendering.dart';
 import 'base.dart';
 
 class WebviewScaffold extends StatefulWidget {
-
   const WebviewScaffold({
     Key key,
     this.appBar,
     @required this.url,
     this.headers,
+    this.javascriptChannels,
     this.withJavascript,
     this.clearCache,
     this.clearCookies,
@@ -42,6 +42,7 @@ class WebviewScaffold extends StatefulWidget {
   final PreferredSizeWidget appBar;
   final String url;
   final Map<String, String> headers;
+  final List<String> javascriptChannels;
   final bool withJavascript;
   final bool clearCache;
   final bool clearCookies;
@@ -146,6 +147,7 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
             webviewReference.launch(
               widget.url,
               headers: widget.headers,
+              javascriptChannelNames: widget.javascriptChannels,
               withJavascript: widget.withJavascript,
               clearCache: widget.clearCache,
               clearCookies: widget.clearCookies,
@@ -178,7 +180,8 @@ class _WebviewScaffoldState extends State<WebviewScaffold> {
             }
           }
         },
-        child: widget.initialChild ?? const Center(child: const CircularProgressIndicator()),
+        child: widget.initialChild ??
+            const Center(child: const CircularProgressIndicator()),
       ),
     );
   }
@@ -201,7 +204,8 @@ class _WebviewPlaceholder extends SingleChildRenderObjectWidget {
   }
 
   @override
-  void updateRenderObject(BuildContext context, _WebviewPlaceholderRender renderObject) {
+  void updateRenderObject(
+      BuildContext context, _WebviewPlaceholderRender renderObject) {
     renderObject..onRectChanged = onRectChanged;
   }
 }