Flutter文件下载管理插件flutter_android_downloader的使用

Flutter文件下载管理插件flutter_android_downloader的使用

flutter_android_downloader 是一个用于调用安卓系统下载管理器的插件。

添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_android_downloader: ^1.0.0

创建下载

使用 FlutterAndroidDownloader.download 方法来创建下载任务。该方法会返回下载任务的 ID。

int downloadId = FlutterAndroidDownloader.download("url", "path", "fileName","originName","headers");

参数说明

参数名 参数类型 说明
url String 下载地址
path String 下载路径, Android 10 及以上默认下载到内置存储目录的 Download 文件夹
fileName String 保存的文件名称
originName String 下载来源名称
headers Map<String,String> 请求头, 参数可选

监听下载完成回调信息

使用 FlutterAndroidDownloader.listen 方法来监听下载完成的回调信息。

FlutterAndroidDownloader.listen((id) {
  print("success $id");
  // to do something
});

完整使用示例

以下是一个完整的使用示例,展示了如何初始化下载监听并执行下载操作。

import 'package:flutter/material.dart';
import 'package:flutter_android_downloader/flutter_android_downloader.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    // 初始化下载监听
    FlutterAndroidDownloader.listen((data) {
      print("success $data");
      // to do something
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: IconButton(
            icon: Icon(Icons.file_download),
            onPressed: () {
              download();
            },
          ),
        ),
      ),
    );
  }

  // 执行下载操作
  void download() async {
    int id = await FlutterAndroidDownloader.download(
      "https://dl.hdslb.com/mobile/latest/iBiliPlayer-bili.apk?t=1582264529000",
      "/storage/emulated/0/Download",
      "bilibili.apk",
      'test',
      {},
    );
    print("ID => $id");
  }
}

更多关于Flutter文件下载管理插件flutter_android_downloader的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文件下载管理插件flutter_android_downloader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_android_downloader插件进行文件下载管理的代码示例。这个插件主要用于Android平台上的文件下载管理,因此下面的代码将专注于Android的实现。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加flutter_android_downloader依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_android_downloader: ^x.x.x  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android项目

android/app/src/main/AndroidManifest.xml文件中添加以下权限和声明:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        ... >
        <provider
            android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"
            android:authorities="${applicationId}.flutter_downloader_provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>
    </application>
</manifest>

然后,在android/app/src/main/res/xml/目录下创建一个名为provider_paths.xml的文件,并添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/com.example.yourapp/files/Pictures" />
    <external-path name="my_downloads" path="Download/" />
</paths>

3. 初始化FlutterDownloader

在你的Flutter应用的main.dart文件中,添加初始化代码:

import 'package:flutter/material.dart';
import 'package:flutter_downloader/flutter_downloader.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 初始化FlutterDownloader
  FlutterDownloader.initialize(
      debug: true // 设置为true以查看日志输出
  ).then((value) {
    runApp(MyApp());
  }).catchError((error, stackTrace) {
    print("Failed to initialize FlutterDownloader: $error");
  });
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DownloadPage(),
    );
  }
}

4. 下载文件

创建一个简单的下载页面DownloadPage,其中包含一个按钮用于触发文件下载:

import 'package:flutter/material.dart';
import 'package:flutter_downloader/flutter_downloader.dart';

class DownloadPage extends StatefulWidget {
  @override
  _DownloadPageState createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('File Downloader'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _downloadFile,
          child: Text('Download File'),
        ),
      ),
    );
  }

  void _downloadFile() async {
    final taskId = await FlutterDownloader.enqueue(
      url: 'https://example.com/yourfile.zip',
      savedDir: '/storage/emulated/0/Download/',
      showNotification: true,
      openFileFromNotification: true,
    );

    print('Enqueued task with id ($taskId)');
  }
}

5. 处理下载状态

为了处理下载状态(如完成、错误等),你可以监听下载事件:

@override
void initState() {
  super.initState();

  // 监听下载事件
  FlutterDownloader.registerCallback((id, status, progress) {
    print("Download task ($id) is in status ($status)");
    if (status == DownloadTaskStatus.complete) {
      // 下载完成后的操作,例如打开文件
      // FlutterDownloader.open(taskId: id);
    }
  });
}

确保在AndroidManifest.xml中声明的FLUTTER_DOWNLOADER_NOTIFICATION_CLICKFLUTTER_DOWNLOADER_UPDATE_RECEIVED广播接收器被正确配置,以便在应用后台时也能处理下载事件。这通常插件已经为你处理好了,但如果你需要自定义行为,可能需要进一步配置。

6. 处理权限请求(如果需要)

如果你的应用目标版本是Android 6.0(API级别23)或更高版本,你还需要在运行时请求存储权限。这可以通过permission_handler插件来实现,但具体实现细节超出了本示例的范围。

以上就是一个基本的Flutter文件下载管理示例,使用了flutter_android_downloader插件。希望这对你有所帮助!

回到顶部