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

flutter 的 in_app_web_view實現(xiàn)下載功能

這篇具有很好參考價值的文章主要介紹了flutter 的 in_app_web_view實現(xiàn)下載功能。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

flutter與前端交互,利用in_app_web_view實現(xiàn)下載功能:

首先下載庫,終端輸入

flutter pub add flutter_inappwebview

之后導出

import 'package:flutter_inappwebview/flutter_inappwebview.dart';

即可使用。

創(chuàng)建in_app_web_view:

InAppWebView(
     initialOptions:
          InAppWebViewGroupOptions(
              crossPlatform:InAppWebViewOptions(
                useOnDownloadStart:true,
              ),
              android: AndroidInAppWebViewOptions()
          ),
      //老版本:initialUrl    新版本:initialUrlRequest
      initialUrlRequest: URLRequest(
        url: Uri.parse(widget.url),
      )
)

因為要下載文件,所以請務必手動設置?useOnDownloadStart 為 true(否則出發(fā)文件下載的監(jiān)聽)。

initialUrlRequest中可填寫自己想首先打開的url地址。

可參考例子:flutter_inappwebview_examples/main.dart at main · pichillilorenzo/flutter_inappwebview_examples · GitHub

https://github.com/pichillilorenzo/flutter_inappwebview_examples/blob/main/file_download/lib/main.dart

填寫自己需要的回調(diào)(例子中的一點錯誤,沒有開啟 useOnDownloadStart, 因此不會下載成功,在使用時請設置為true)

正常情況下,配合downloader和android_path_provider,普通https鏈接即可下載文件。

?文章來源地址http://www.zghlxwxcb.cn/news/detail-474535.html

而遇到blob鏈接時,還需要進行更多操作來確保文件的下載:

可參考javascript - Flutter WebView blob pdf download - Stack Overflow

https://stackoverflow.com/questions/64865972/flutter-webview-blob-pdf-download/64902313#64902313

因為Android不支持blob鏈接下載,因此我們嵌套javascript處理下載鏈接,在in_app_web_view的build中重寫onWebViewCreated方法,添加javascriptHandler:

onWebViewCreated: (InAppWebViewController controller) {
        if (mounted) {
          setState(() {
            _inAppWebCtrl = controller;
            _inAppWebCtrl!.addJavaScriptHandler(
              handlerName: 'blobToBase64Handler',
              callback: (data) async {
                if (data.isNotEmpty) {
                  final String receivedFileInBase64 = data[0];
                  final String receivedMimeType = data[1];

                  // NOTE: create a method that will handle your extensions
                  final String extension =
                  _mapMimeTypeToExtension(receivedMimeType);
                  String tmpFileName = 'tmpfile';
                  _createFileFromBase64(
                      receivedFileInBase64, tmpFileName, extension);
                }
              },
            );
          });
        }
      },

首先在assets中添加js文件夾,然后創(chuàng)建 base64.js 文件

var xhr = new XMLHttpRequest();
var blobUrl = "blobUrlPlaceholder";
console.log(blobUrl);
xhr.open('GET', blobUrl, true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  if (this.status == 200) {
    var blob = this.response;
    var reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onloadend = function() {
      var base64data = reader.result;
      var base64ContentArray = base64data.split(",");
      var mimeType = base64ContentArray[0].match(/[^:\s*]\w+\/[\w-+\d.]+(?=[;| ])/)[0];
      var decodedFile = base64ContentArray[1];
      console.log(mimeType);
      window.flutter_inappwebview.callHandler('blobToBase64Handler', decodedFile, mimeType);
    };
  };
};
xhr.send();

?

注意js中的callhander的名字參數(shù),對應創(chuàng)建webview時addJavascriptHandler中的name。

另外是文件類型映射函數(shù)和文件下載函數(shù):

  String _mapMimeTypeToExtension(String mimeType) {
    String extension = '';
    switch(mimeType) {
      case 'image/png': extension = 'png'; break;
      case 'application/msword': extension = 'doc'; break;
      case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document':
        extension = 'docx';
        break;
      case 'image/jpeg': extension = 'jpg'; break;
      case 'image/gif': extension = 'gif'; break;
      case 'image/svg+xml': extension = 'svg'; break;
      case 'image/tiff': extension = 'tif'; break;
      case 'text/plain': extension = 'txt'; break;
      case 'application/vnd.ms-powerpoint': extension = 'ppt'; break;
      case 'application/vnd.openxmlformats-officedocument.presentationml.presentation':
        extension = 'pptx';
        break;
      case 'application/vnd.ms-excel': extension = 'xls'; break;
      case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet':
        extension = 'xlsx';
        break;
      case 'application/zip': extension = 'zip'; break;
      case 'application/x-7z-compressed': extension = '7z'; break;
      case 'application/pdf': extension = 'pdf'; break;
    }
    return extension;
  }

  _createFileFromBase64(String base64content, String fileName, String yourExtension) async {
    var bytes = base64Decode(base64content.replaceAll('\n', ''));
    final file = File("$_localPath/$fileName.$yourExtension");
    await file.writeAsBytes(bytes.buffer.asUint8List());
    
  }

最后重寫inappwebview中的下載請求方法:

      onDownloadStartRequest: (controller, downloadStartRequest) async {
          var jsContent = await rootBundle.loadString("assets/js/base64.js");
// 運行javascript代碼解析blob
          await controller.evaluateJavascript(
              source: jsContent.replaceAll("blobUrlPlaceholder",
                  downloadStartRequest.url.toString()));
      },

總結(jié):因為android本身不能解析blob,我們因此使用javascript作為翻譯:運行順序:

onDownloadStartRequest -> javascript文件 -> webviewController中的handler的callback,最后以流的方式寫入文件。

?

到了這里,關于flutter 的 in_app_web_view實現(xiàn)下載功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • 移動端學習:實現(xiàn)App中的下載功能,在手機接管文件系統(tǒng)

    移動端學習:實現(xiàn)App中的下載功能,在手機接管文件系統(tǒng)

    我感覺把學習中遇到的問題記錄下來,寫成文章,然后和很多人一起討論,還是一個很不錯的學習方法的。 請問有大佬知道vue2項目打包的apk的導出功能為什么失效了嗎?網(wǎng)頁,h5的應該還是可以下載的。我又不想導出功能和后端有交互,想純前端下載,網(wǎng)頁的下載寫法好像打

    2024年02月22日
    瀏覽(19)
  • Java Web 實現(xiàn)文件上傳和下載接口功能

    Java Web 實現(xiàn)文件上傳和下載接口功能

    上傳用post或者get請求都可以,這里代碼中用post做的示例。 文件下載除了靜態(tài)訪問(及nginx、tomcat等服務器映射到后的文件web路徑)下載以外?,還可以通過流的方式下載,代碼如下: 上傳用post或者get請求都可以,這里代碼中用post做的示例。 ?ForbiddenException 訪問權限異常類

    2024年02月11日
    瀏覽(106)
  • uni-app web-view的使用

    在上一頁點擊需要跳轉(zhuǎn)到app內(nèi)置的瀏覽器里(app跳h5頁面),uniapp提供了web-view 需要新建頁面,在新頁面里引用web-view,在新頁面里才加上網(wǎng)址(h5) 1,在所需頁面引入 1,在項目里(uni-app)運用(子傳父) 3,html頁面 https://gitee.com/dcloud/uni-app/raw/dev/dist/uni.webview.1.5.4.js

    2024年02月11日
    瀏覽(17)
  • uni-app之微信小程序?qū)崿F(xiàn)‘下載+保存至本地+預覽’功能

    uni-app之微信小程序?qū)崿F(xiàn)‘下載+保存至本地+預覽’功能

    目錄 一、H5如何實現(xiàn)下載功能 二、微信小程序?qū)崿F(xiàn)下載資源功能方面與H5有很大的不同 三、?微信小程序?qū)崿F(xiàn)文件(doc,pdf等格式,非圖片)下載(下載-保存-預覽)功能 四、圖片預覽、保存、轉(zhuǎn)發(fā)、收藏:uni.previewImage() 五、 我當前遇到‘關于文件預覽uni.openDocument()’API的問

    2024年02月15日
    瀏覽(31)
  • uniapp 開發(fā) APP 使用 web-view 引入H5 app與 h5 頁面通信

    uniapp 可以同時兼容 APP 和 H5,但有時候有些功能在 APP 中實現(xiàn)不了而在 H5 中可以實現(xiàn),就可以采用 web-view 的方式在 APP 模式下顯示 H5 頁面。但是 APP 和 H5 儲存的參數(shù)是不能共享的,例如token,就涉及到 APP 與 H5 之間的參數(shù)傳遞。 H5 向 APP 傳參:引入 webview.js ,調(diào)用 uni.postMes

    2024年02月13日
    瀏覽(22)
  • uni-app和web-view頁面相互傳參

    首先:這里說的是uni-app開發(fā)的APP項目,嵌入web-view頁面,并進行相互傳參,如果和您想了解的內(nèi)容相符,請繼續(xù)閱讀。 一、說到web-view嵌入uni-app開發(fā)的APP,傳參方面很多人首先會想到url傳參。 這種方法是app向webview傳參最簡單的方式,但也存在許多弊端: 1.參數(shù)會被抓取,如

    2024年02月08日
    瀏覽(24)
  • 強大的Flutter App升級功能

    注意:無特殊說明,F(xiàn)lutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 應用程序升級功能是App的基礎功能之一,如果沒有此功能會造成用戶無法升級,應用程序的bug或者新功能老用戶無法觸達,甚至損失這部分用戶。 對于應用程序升級功能的重要性就無需贅

    2024年04月15日
    瀏覽(24)
  • uniapp web-view 小程序內(nèi)嵌H5 打開地圖 喚起APP

    ??uniapp開發(fā)小程序內(nèi)嵌H5的場景中,有需求如下: ??在已知某個地點經(jīng)緯度的情況下,可以在H5打開地圖查看該地點的位置,以及能夠喚起手機上的地圖APP進行導航等操作。 ??此時uni.openLocation在喚起導航的時候,是打開在線的導航鏈接,且會由于小程序的限制無法正常

    2024年02月16日
    瀏覽(30)
  • uni-app開發(fā)微信小程序 web-view通訊

    uni-app開發(fā)微信小程序 web-view通訊

    最近開發(fā)了一個微信小程序嵌套vue頁面 vue頁面 有時候會使用到微信小程序的api 但是有的api他h5是不支持的 ?官方文檔中提供的兩種方法 @message 內(nèi)嵌的h5頁面不支持 Window的postMessage 在h5端使用沒啥問題,這該死的uni-app頁面不管怎么弄都會報那個window的錯? 還是我太菜了。。。

    2024年02月19日
    瀏覽(89)
  • FlutterBoost 實現(xiàn)Flutter頁面內(nèi)嵌iOS view

    在使用Flutter混合開發(fā)中會遇到一些原生比Flutter優(yōu)秀的控件,不想使用Flutter的控件,想在Flutter中使用原生控件。這時就會用到 Flutter頁面中內(nèi)嵌 原生view,這里簡單介紹一個 內(nèi)嵌 iOS 的view。 注:這里使用了 FlutterBoost。網(wǎng)上大部分都是代碼執(zhí)行不起來,本案例起碼可以正常使

    2024年02月12日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包