flutter使用dio實現 檔案下載並實現進度監聽總結

早起的年輕人發表於2020-06-03

題記 —— 執劍天涯,從你的點滴積累開始,所及之處,必精益求精,即是折騰每一天。

重要訊息

在這裡插入圖片描述


  ///當前進度進度百分比  當前進度/總進度 從0-1
  double currentProgress =0.0;
  ///下載檔案的網路路徑
  String apkUrl ="";
  ///使用dio 下載檔案
  void downApkFunction() async{
    /// 申請寫檔案許可權
    bool isPermiss =  await checkPermissFunction();
    if(isPermiss) {
      ///手機儲存目錄
      String savePath = await getPhoneLocalPath();
      String appName = "rk.apk";

      ///建立DIO
      Dio dio = new Dio();

      ///引數一 檔案的網路儲存URL
      ///引數二 下載的本地目錄檔案
      ///引數三 下載監聽
      Response response = await dio.download(
          apkUrl, "$savePath$appName", onReceiveProgress: (received, total) {
        if (total != -1) {
          ///當前下載的百分比例
          print((received / total * 100).toStringAsFixed(0) + "%");
          // CircularProgressIndicator(value: currentProgress,) 進度 0-1
          currentProgress = received / total;
          setState(() {

          });
        }
      });
    }else{
      ///提示使用者請同意許可權申請
    }
  }

複製程式碼

Android許可權目前分為三種:正常許可權、危險許可權、特殊許可權

正常許可權 直接在AndroidManifest中配置即可獲得的許可權。大部分許可權都歸於此。 危險許可權,Android 6.0之後將部分許可權定義於此。 危險許可權不僅需要需要在AndroidManifest中配置,還需要在使用前check是否真正擁有許可權,以動態申請。

在ios中,使用xcode開啟本目錄

選中Xcode 工程中的 info.plist檔案,右鍵選擇Open As - Source Code,將許可權配置的程式碼copy到裡面即可,鍵值對中的內容可按專案需求相應修改。

<!-- 相簿 --> 
<key>NSPhotoLibraryUsageDescription</key> 
<string>需要您的同意,APP才能訪問相簿</string> 
<!-- 相機 --> 
<key>NSCameraUsageDescription</key> 
<string>需要您的同意,APP才能訪問相機</string> 
<!-- 麥克風 --> 
<key>NSMicrophoneUsageDescription</key> 
<string>需要您的同意,APP才能訪問麥克風</string> 
<!-- 位置 --> 
<key>NSLocationUsageDescription</key> 
<string>需要您的同意, APP才能訪問位置</string> 
<!-- 在使用期間訪問位置 --> 
<key>NSLocationWhenInUseUsageDescription</key> 
<string>App需要您的同意, APP才能在使用期間訪問位置</string> 
<!-- 始終訪問位置 --> 
<key>NSLocationAlwaysUsageDescription</key> 
<string>App需要您的同意, APP才能始終訪問位置</string> 
<!-- 日曆 --> 
<key>NSCalendarsUsageDescription</key> 
<string>App需要您的同意, APP才能訪問日曆</string> 
<!-- 提醒事項 --> 
<key>NSRemindersUsageDescription</key> 
<string>需要您的同意, APP才能訪問提醒事項</string> 
<!-- 運動與健身 --> 
<key>NSMotionUsageDescription</key> 
<string>需要您的同意, APP才能訪問運動與健身</string> 
<!-- 健康更新 --> 
<key>NSHealthUpdateUsageDescription</key> 
<string>需要您的同意, APP才能訪問健康更新 </string> 
<!-- 健康分享 --> 
<key>NSHealthShareUsageDescription</key> 
<string>需要您的同意, APP才能訪問健康分享</string> 
<!-- 藍芽 --> 
<key>NSBluetoothPeripheralUsageDescription</key> 
<string>需要您的同意, APP才能訪問藍芽</string> 
<!-- 媒體資料庫 --> 
<key>NSAppleMusicUsageDescription</key> 
<string>需要您的同意, APP才能訪問媒體資料庫</string>
複製程式碼

在 flutter 專案目錄中,我們也可以開啟 info.plist 檔案配置,如下圖所示

在這裡插入圖片描述
在這裡使用的是 permission_handler 外掛來申請許可權的

permission_handler: ^4.3.0
複製程式碼

申請許可權程式碼如下

  ///PermissionGroup.storage 對應的是 
  ///android 的外部儲存 (External Storage)
  ///ios 的Documents` or `Downloads`
  checkPermissFunction() async {
    if (Theme.of(context).platform == TargetPlatform.android) {
      ///安卓平臺中 checkPermissionStatus方法校驗是否有儲存卡的讀寫許可權 
      PermissionStatus permission = await PermissionHandler()
          .checkPermissionStatus(PermissionGroup.storage);
      if (permission != PermissionStatus.granted) {
        ///無許可權那麼 呼叫方法 requestPermissions 申請許可權
        Map<PermissionGroup, PermissionStatus> permissions =
            await PermissionHandler()
                .requestPermissions([PermissionGroup.storage]);
        ///校驗使用者對許可權申請的處理
        if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
          return true;
        }
      } else {
        return true;
      }
    } else {
      return true;
    }
    return false;
  }
複製程式碼

申請好許可權後,我們需要確定下來儲存卡的路徑,在這裡使用的是 path_provider 外掛

path_provider: 1.6.0
複製程式碼
  ///獲取手機的儲存目錄路徑
  ///getExternalStorageDirectory() 獲取的是  android 的外部儲存 (External Storage)
  ///  getApplicationDocumentsDirectory 獲取的是 ios 的Documents` or `Downloads` 目錄
  Future<String> getPhoneLocalPath() async {
    final directory = Theme.of(context).platform == TargetPlatform.android
        ? await getExternalStorageDirectory()
        : await getApplicationDocumentsDirectory();
    return directory.path;
  }
複製程式碼

完畢

相關文章