国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用

這篇具有很好參考價(jià)值的文章主要介紹了flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用

在使用inappwebview時(shí)候,需要flutter端與JS進(jìn)行交互,調(diào)用相應(yīng)的方法,在inappwebview中的JavaScript Handlers。
flutter inappwebview實(shí)現(xiàn)flutter與javascript方法調(diào)用,移動(dòng)開(kāi)發(fā),flutter開(kāi)發(fā)實(shí)戰(zhàn),flutter,flutter,inappwebview,HTML5,webview,javascript

一、JavaScript Handlers

要添加JavaScript Handlers,可以使用InAppWebViewController.addJavaScriptHandler方法,在該方法中定義handlerName和JavaScript端調(diào)用它時(shí)要調(diào)用的回調(diào)?;卣{(diào)可以返回要在JavaScript端發(fā)送的數(shù)據(jù)。如果您需要在加載網(wǎng)頁(yè)后立即管理JavaScript處理程序,則應(yīng)在創(chuàng)建InAppWebView時(shí)調(diào)用InAppWebViewController.addJavaScriptHandler。

以下是如何注冊(cè)JavaScript處理程序的示例:

onWebViewCreated: (controller) {
  // register a JavaScript handler with name "myHandlerName"
  controller.addJavaScriptHandler(handlerName: 'myHandlerName', callback: (args) {
    // print arguments coming from the JavaScript side!
    print(args);

    // return data to the JavaScript side!
    return {
      'bar': 'bar_value', 'baz': 'baz_value'
    };
  });
},

在JavaScript端,要執(zhí)行回調(diào)處理程序并將數(shù)據(jù)發(fā)送到Flutter,您需要使用window.Flutter_inappwebview.callHandler(handlerName,…args)方法,其中handlerName是一個(gè)字符串,表示您正在調(diào)用的處理程序名稱(chēng),args是可以發(fā)送到Fluter方面的可選參數(shù)。

注意:

如果相更換一個(gè)名字,我們可以更換一個(gè)名字來(lái)嵌套window.flutter_inappwebview

window.myCustomObj = { callHandler: window.flutter_inappwebview.callHandler } and, then, you can use window.myCustomObj.callHandler

此外,可以通過(guò)這種方式包裝整個(gè)特定的處理代碼:

const myHandlerName = (…args) => window.flutter_inappwebview.callHandler(‘myHandlerName’, …args);

然后調(diào)用myHandlerName();

在Javascript端,如果需要調(diào)用callHandler,需要監(jiān)聽(tīng)flatterInAppWebViewPlatformReady??梢允褂迷趂latterInAppWebViewPlatformReady事件被分派時(shí)設(shè)置的全局標(biāo)志變量,并在調(diào)用window.flutter_inappwebview.callHandler方法之前使用它。

示例代碼如下

// execute inside the "flutterInAppWebViewPlatformReady" event listener
window.addEventListener("flutterInAppWebViewPlatformReady", function(event) {
 const args = [1, true, ['bar', 5], {foo: 'baz'}];
 window.flutter_inappwebview.callHandler('myHandlerName', ...args);
});

// or using a global flag variable
var isFlutterInAppWebViewReady = false;
window.addEventListener("flutterInAppWebViewPlatformReady", function(event) {
 isFlutterInAppWebViewReady = true;
});
// then, somewhere in your code
if (isFlutterInAppWebViewReady) {
 const args = [1, true, ['bar', 5], {foo: 'baz'}];
 window.flutter_inappwebview.callHandler('myHandlerName', ...args);
}

在flutter端,F(xiàn)lutter在執(zhí)行注入方法時(shí)候,調(diào)用evaluateJavascript來(lái)執(zhí)行callHandler,這個(gè)flutterInAppWebViewPlatformReady無(wú)需監(jiān)聽(tīng),因?yàn)檫@個(gè)flutterInAppWebViewPlatformReady已經(jīng)Ready了。

可以在onLoadStop中調(diào)用代碼

onLoadStop: (controller, url) async {
  await controller.evaluateJavascript(source: """
    const args = [1, true, ['bar', 5], {foo: 'baz'}];
    window.flutter_inappwebview.callHandler('myHandlerName', ...args);
  """);
},

window.flutter_inappwebview.callHandler返回一個(gè)JavaScript Promise,該P(yáng)romise可用于獲取回調(diào)返回的json結(jié)果。在這種情況下,只需返回您想要發(fā)送的數(shù)據(jù),它將使用dart:convert庫(kù)中的jsonEncode自動(dòng)進(jìn)行json編碼。

一個(gè)簡(jiǎn)單的示例代碼


import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';

Future main() async {
  WidgetsFlutterBinding.ensureInitialized();

  if (Platform.isAndroid) {
    await AndroidInAppWebViewController.setWebContentsDebuggingEnabled(true);
  }
  
  runApp(new MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => new _MyAppState();
}

class _MyAppState extends State<MyApp> {

  InAppWebViewGroupOptions options = InAppWebViewGroupOptions(
      android: AndroidInAppWebViewOptions(
        useHybridComposition: true,
      ),);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
          appBar: AppBar(title: Text("JavaScript Handlers")),
          body: SafeArea(
              child: Column(children: <Widget>[
                Expanded(
                  child: InAppWebView(
                    initialData: InAppWebViewInitialData(
                        data: """
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    </head>
    <body>
        <h1>JavaScript Handlers</h1>
        <script>
            window.addEventListener("flutterInAppWebViewPlatformReady", function(event) {
                window.flutter_inappwebview.callHandler('handlerFoo')
                  .then(function(result) {
                    // print to the console the data coming
                    // from the Flutter side.
                    console.log(JSON.stringify(result));
                    
                    window.flutter_inappwebview
                      .callHandler('handlerFooWithArgs', 1, true, ['bar', 5], {foo: 'baz'}, result);
                });
            });
        </script>
    </body>
</html>
                      """
                    ),
                    initialOptions: options,
                    onWebViewCreated: (controller) {
                      controller.addJavaScriptHandler(handlerName: 'handlerFoo', callback: (args) {
                        // return data to the JavaScript side!
                        return {
                          'bar': 'bar_value', 'baz': 'baz_value'
                        };
                      });

                      controller.addJavaScriptHandler(handlerName: 'handlerFooWithArgs', callback: (args) {
                        print(args);
                        // it will print: [1, true, [bar, 5], {foo: baz}, {bar: bar_value, baz: baz_value}]
                      });
                    },
                    onConsoleMessage: (controller, consoleMessage) {
                      print(consoleMessage);
                      // it will print: {message: {"bar":"bar_value","baz":"baz_value"}, messageLevel: 1}
                    },
                  ),
                ),
              ]))),
    );
  }
}


二、監(jiān)聽(tīng)自定義CustomEvent

可以設(shè)置一個(gè)消息事件偵聽(tīng)器(與postMessage一起使用)或一個(gè)自定義事件偵聽(tīng)器。

// message event listener
window.addEventListener("message", (event) => {
  console.log(event.data);
}, false);

// or custom event listener
window.addEventListener("myCustomEvent", (event) => {
  console.log(event.detail);
}, false);

然后使用window.dispatch

// using postMessage method
window.postMessage({foo: 1, bar: false});

// or dispatching a custom event
const event = new CustomEvent("myCustomEvent", {
    detail: {foo: 1, bar: false}
});
window.dispatchEvent(event);

因此,可以在運(yùn)行時(shí)使用InAppWebViewController.eevaluatteJavascript方法或在web應(yīng)用程序內(nèi)部設(shè)置這些事件偵聽(tīng)器,并使用相同的方法調(diào)度這些事件。

例如:

onLoadStop: (controller, url) async {
  await controller.evaluateJavascript(source: """
    window.addEventListener("myCustomEvent", (event) => {
      console.log(JSON.stringify(event.detail));
    }, false);
  """);

  await Future.delayed(Duration(seconds: 5));

  controller.evaluateJavascript(source: """
    const event = new CustomEvent("myCustomEvent", {
      detail: {foo: 1, bar: false}
    });
    window.dispatchEvent(event);
  """);
},
onConsoleMessage: (controller, consoleMessage) {
  print(consoleMessage);
  // it will print: {message: {"foo":1,"bar":false}, messageLevel: 1}
},

三、小結(jié)

flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用。描述可能不是特別準(zhǔn)確,請(qǐng)見(jiàn)諒。

學(xué)習(xí)記錄,每天不停進(jìn)步。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-773625.html

到了這里,關(guān)于flutter開(kāi)發(fā)實(shí)戰(zhàn)-inappwebview實(shí)現(xiàn)flutter與Javascript方法調(diào)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • flutter:webview_flutter和flutter_inappwebview的簡(jiǎn)單使用

    flutter:webview_flutter和flutter_inappwebview的簡(jiǎn)單使用

    最近在研究如何在應(yīng)用程序中嵌入Web視圖,發(fā)現(xiàn)有兩個(gè)庫(kù)不錯(cuò)。 一個(gè)是官方維護(hù)、一個(gè)是第三方維護(hù)。因?yàn)闆](méi)說(shuō)特別的需求,就使用了官方庫(kù),實(shí)現(xiàn)一些簡(jiǎn)單功能是完全ok的 不建議使用,因?yàn)樾Ч辉趺礃?,?dāng)然也可能是我太菜不會(huì)用,下面這個(gè)問(wèn)題就很難理解為什么會(huì)這樣

    2024年02月12日
    瀏覽(20)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-Running Gradle task ‘a(chǎn)ssembleDebug‘ 的解決方法

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Running Gradle task ‘a(chǎn)ssembleDebug‘ 的解決方法

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Running Gradle task ‘a(chǎn)ssembleDebug‘ 的解決方法 使用Android studio經(jīng)常出現(xiàn)Running Gradle task ‘a(chǎn)ssembleDebug‘問(wèn)題,記錄一下解決方法。 將repositories中的google(), mavenCentral() buildscript下的repositories與allprojects下的repositories均更改成aliyun 更改后的結(jié)果如下 將buildscript中reposito

    2024年02月13日
    瀏覽(20)
  • 【Flutter跨平臺(tái)插件開(kāi)發(fā)】如何實(shí)現(xiàn)kotlin跟C++的相互調(diào)用

    在 Kotlin 中,可以使用 JNI (Java Native Interface) 來(lái)調(diào)用 C++ 代碼 調(diào)用步驟: 創(chuàng)建 C++ 文件并實(shí)現(xiàn)函數(shù)。 在 Kotlin 中聲明需要調(diào)用的 native 函數(shù)并加載 native 庫(kù)。 調(diào)用示例 Flutter 插件項(xiàng)目的例子 在 Flutter 插件中引用已有的 C++ 源碼需要以下步驟: 首先,在 Flutter 插件的 android 目錄下

    2024年01月25日
    瀏覽(100)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與iOS雙向通信 最近開(kāi)發(fā)中需要iOS與flutter實(shí)現(xiàn)通信,這里使用的MethodChannel 如果需要flutter與Android實(shí)現(xiàn)雙向通信,請(qǐng)看 https://blog.csdn.net/gloryFlow/article/details/132218837 這部分與https://blog.csdn.net/gloryFlow/article/details/132218837中的一致,這里實(shí)現(xiàn)一下

    2024年02月13日
    瀏覽(25)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-事件總線EventBus實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-事件總線EventBus實(shí)現(xiàn) 在開(kāi)發(fā)中,經(jīng)常會(huì)需要一個(gè)廣播機(jī)制,用以跨Widget事件通知。 事件總線 實(shí)現(xiàn)了訂閱者模式,訂閱者模式包含發(fā)布者和訂閱者兩種角色,可以通過(guò)事件總線來(lái)觸發(fā)事件和監(jiān)聽(tīng)事件。 實(shí)現(xiàn)eventBus 在工程的pubspec.yaml引入庫(kù) 1.使用event_bus庫(kù) 創(chuàng)建一

    2024年02月15日
    瀏覽(27)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與原生Android雙向通信

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-MethodChannel實(shí)現(xiàn)flutter與原生Android雙向通信 最近開(kāi)發(fā)中需要原生Android與flutter實(shí)現(xiàn)通信,這里使用的MethodChannel MethodChannel:用于傳遞方法調(diào)用(method invocation)。 通道的客戶端和宿主端通過(guò)傳遞給通道構(gòu)造函數(shù)的通道名稱(chēng)進(jìn)行連接 一個(gè)應(yīng)用中所使用的所有通道名稱(chēng)

    2024年02月13日
    瀏覽(20)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-dio文件下載實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-dio文件下載實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-dio文件下載實(shí)現(xiàn) 在開(kāi)發(fā)中,需要下載文件,這里使用的是dio dio 是一個(gè)強(qiáng)大的 Dart HTTP 請(qǐng)求庫(kù),支持全局配置、Restful API、FormData、攔截器、 請(qǐng)求取消、Cookie 管理、文件上傳/下載、超時(shí)以及自定義適配器等。 在工程中pubspec.yaml引入dio 我們對(duì)dio進(jìn)行封裝 文件下

    2024年02月11日
    瀏覽(26)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-Universal Links配置及flutter微信分享實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Universal Links配置及flutter微信分享實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-Universal Links配置及flutter微信分享實(shí)現(xiàn) 在最近開(kāi)發(fā)中碰到了需要實(shí)現(xiàn)微信分享,在iOS端需要配置UniversalLink,在分享使用fluwx插件來(lái)實(shí)現(xiàn)微信分享功能。 1.1、什么是UniversalLink Universal link 是Apple在iOS9推出的一種能夠方便的通過(guò)傳統(tǒng)HTTPS鏈接來(lái)啟動(dòng)APP的功能,可以使

    2024年01月19日
    瀏覽(23)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-指紋、面容ID驗(yàn)證插件實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-指紋、面容ID驗(yàn)證插件實(shí)現(xiàn)

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-指紋、面容ID驗(yàn)證插件實(shí)現(xiàn) 在iOS開(kāi)發(fā)中,經(jīng)常出現(xiàn)需要指紋、面容ID驗(yàn)證的功能。 指紋、面容ID是一種基于用生物識(shí)別技術(shù),通過(guò)掃描用戶的面部特征來(lái)驗(yàn)證用戶身份。 在iOS中實(shí)現(xiàn)指紋、面容ID驗(yàn)證功能,步驟如下 2.1 info.plist配置 在info.plist中配置允許訪問(wèn)FAC

    2024年02月13日
    瀏覽(28)
  • flutter開(kāi)發(fā)實(shí)戰(zhàn)-實(shí)現(xiàn)推送功能Push Notification

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-實(shí)現(xiàn)推送功能Push Notification

    flutter開(kāi)發(fā)實(shí)戰(zhàn)-實(shí)現(xiàn)推送功能Push Notification 推送服務(wù)現(xiàn)在可以說(shuō)是所有 App 的標(biāo)配了,最近在Flutter工程項(xiàng)目上實(shí)現(xiàn)推送功能。flutter上實(shí)現(xiàn)推送功能需要依賴(lài)原生的功能,需要插件實(shí)現(xiàn),這里使用的是極光推送的服務(wù)。 效果圖如下 在使用極光推送功能時(shí),需要使用的是極光提

    2024年02月16日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包