首页 > 解决方案 > 在 Flutter 后台上传

问题描述

在后台上传数据的最佳方式是什么,但在用户切换屏幕时不要取消此上传?我还想在上传完成时显示 Snackbar(即使我已经在不同的屏幕上)。

在 Android 上,我一直在使用 Service + BroadcastReceiver 或 WorkManager。我在 Flutter 中找不到这样做的方法。

标签: flutter

解决方案


你可以使用 package https://pub.dev/packages/flutter_uploader
这个插件是基于WorkManagerinAndroidNSURLSessionUploadTaskiniOS在后台运行上传任务。

创建新的上传任务:

final uploader = FlutterUploader();

final taskId = await uploader.enqueue(
  url: "your upload link", //required: url to upload to
  files: [FileItem(filename: filename, savedDir: savedDir, fieldname:"file")], // required: list of files that you want to upload
  method: UploadMethod.POST, // HTTP method  (POST or PUT or PATCH)
  headers: {"apikey": "api_123456", "userkey": "userkey_123456"},
  data: {"name": "john"}, // any data you want to send in upload request
  showNotification: false, // send local notification (android only) for upload status
  tag: "upload 1"); // unique tag for upload task
);

监听上传进度

final subscription = uploader.progress.listen((progress) {
  //... code to handle progress
});

对于Snackbar,您可以ScaffoldMessenger使用Snackbar persist across routes https://flutter.dev/docs/release/break-changes/scaffold-messenger

现在的ScaffoldMessenger句柄SnackBars为了persist across routes并且总是显示在当前的脚手架上。默认情况下,根 ScaffoldMessenger 包含在MaterialApp
创建ScaffoldMessenger一个范围内,所有后代都在其中Scaffolds注册以接收 SnackBar,这就是它们在这些转换中持续存在的方式。使用 代码片段ScaffoldMessenger提供的根目录时MaterialApp

ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: const Text('snack'),
        duration: const Duration(seconds: 1),
        action: SnackBarAction(
          label: 'ACTION',
          onPressed: () { },
        ),
      ));

推荐阅读