首页 > 解决方案 > 当应用程序在颤动或断开互联网连接并重新连接时从头开始上传文件

问题描述

我正在使用flutter中的workmanager在后台将文件上传到firebase云存储,当应用程序在后台时效果很好,但是当应用程序被用户杀死时,上传过程从头开始,以及当用户断开互联网并重新连接它开始上传过程从开始。

这是我的上传功能

  Future<void> uploadVideo() async {
    List<String> filesPath = [];

    await Future.forEach(imgSource, (AssetEntity element) async {
      File file = await element.file;
      filesPath.add(file.path);
    });

    await Workmanager().registerOneOffTask(
      "1",
      uploadFileTask,
      inputData: <String, dynamic>{
        'filesPath': filesPath,
      },
      constraints: Constraints(
        networkType: NetworkType.connected,
        requiresBatteryNotLow: true,
      ),
      backoffPolicy: BackoffPolicy.exponential,
      existingWorkPolicy: ExistingWorkPolicy.keep,

    );

  }


// Here is callbackDispatcher function


void callbackDispatcher() {
  Workmanager().executeTask((task, inputData) async {
    switch (task) {
      case uploadFileTask:
        try {
          List<dynamic> dynamicType = inputData["filesPath"];
          List<String> filesPath =
              dynamicType.map((e) => e.toString()).toList();

          await Firebase.initializeApp();
          int counter = 1;

          List<String> downloadUrlLinks = [];


          await Future.forEach(filesPath, (String filePath) async {
            File file = File(filePath);
            String fullPath = getRandomName(file.path);
            String storagePath = "test/$fullPath";

            print("Full path HM" + fullPath);

            String downloadUrl = await CloudService.uploadFileWithProgressBar(
              file: file,
              filePath: storagePath,
              maxLength: filesPath.length,
              uploadedLength: counter,
            );

            downloadUrlLinks.add(downloadUrl);

            counter++;
          });
          await NotificationService.finishedNotification(
              title: 'Uploading files finished');

          print("download link:     " + downloadUrlLinks.toString());

          downloadUrlLinks = [];

        } catch (e) {
          print("uploading error" + e.toString());
        }

        break;
    }

    return Future.value(true);
  });
}


标签: flutterdart

解决方案


推荐阅读