• Flutetr flutter_downloader 1.3.1


    安装

    dependencies:
      flutter_downloader: ^1.3.1
    

    配置

    Java:

    // MyApplication.java
    package com.example.flutter_demo;  // 设置你的
    
    import io.flutter.app.FlutterApplication;
    import io.flutter.plugin.common.PluginRegistry;
    import io.flutter.plugins.GeneratedPluginRegistrant;
    
    public class MyApplication extends FlutterApplication implements PluginRegistry.PluginRegistrantCallback {
        @Override
        public void registerWith(PluginRegistry registry) {
            GeneratedPluginRegistrant.registerWith(registry);
        }
    }
    

    Or Kotlin:

    // MyApplication.kt
    package com.example.flutter_demo // 设置你的
    
    import io.flutter.app.FlutterApplication
    import io.flutter.plugin.common.PluginRegistry;
    import io.flutter.plugins.GeneratedPluginRegistrant
    
    internal class MyApplication : FlutterApplication(), PluginRegistry.PluginRegistrantCallback {
        override fun registerWith(registry: PluginRegistry) {
            GeneratedPluginRegistrant.registerWith(registry)
        }
    }
    

    更新AndroidManifest.xml

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.flutter_demo">
    
        <!-- new -->
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <!-- new -->
    
        <!-- io.flutter.app.FlutterApplication is an android.app.Application that
             calls FlutterMain.startInitialization(this); in its onCreate method.
             In most cases you can leave this as-is, but you if you want to provide
             additional functionality it is fine to subclass or reimplement
             FlutterApplication and put your custom class here. -->
    
             <!-- 更新  android:name -->
        <application
            android:name=".MyApplication"
            android:label="flutter_demo"
            android:icon="@mipmap/ic_launcher">
            <activity
                android:name=".MainActivity"
                android:launchMode="singleTop"
                android:theme="@style/LaunchTheme"
                android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
                android:hardwareAccelerated="true"
                android:windowSoftInputMode="adjustResize">
                <!-- This keeps the window background of the activity showing
                     until Flutter renders its first frame. It can be removed if
                     there is no splash screen (such as the default splash screen
                     defined in @style/LaunchTheme). -->
                <meta-data
                    android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                    android:value="true" />
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    
            <!--   flutter_downloader     new-->
            <provider
                android:name="vn.hunghd.flutterdownloader.DownloadedFileProvider"
                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>
    
            <provider
                android:name="androidx.work.impl.WorkManagerInitializer"
                android:authorities="${applicationId}.workmanager-init"
                android:enabled="false"
                android:exported="false" />
    
            <provider
                android:name="vn.hunghd.flutterdownloader.FlutterDownloaderInitializer"
                android:authorities="${applicationId}.flutter-downloader-init"
                android:exported="false">
                <!-- changes this number to configure the maximum number of concurrent tasks -->
                <meta-data
                    android:name="vn.hunghd.flutterdownloader.MAX_CONCURRENT_TASKS"
                    android:value="5" />
            </provider>
            <!--        new -->
        </application>
    </manifest>
    

    andriod 上简单的使用

    // main.dart
    import 'dart:io';
    import 'dart:isolate';
    import 'dart:ui';
    
    import 'package:flutter/material.dart';
    import 'package:flutter_downloader/flutter_downloader.dart';
    import 'package:path_provider/path_provider.dart';
    import 'package:permission_handler/permission_handler.dart';
    
    void main() async {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      @override
      _HomePageState createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      String downloadId;
      String _link = "https://i.loli.net/2019/10/18/gE3PTycd9SF5VqY.jpg";
      String _localPath;
    
      ReceivePort _port = ReceivePort();
    
      @override
      void initState() {
        super.initState();
        _init();
      }
    
      Future<void> _init() async {
        await FlutterDownloader.initialize();
        IsolateNameServer.registerPortWithName(
            _port.sendPort, 'downloader_send_port');
        _port.listen((dynamic data) {
          print('UI Isolate Callback: $data');
          String id = data[0];
          DownloadTaskStatus status = data[1];
          int progress = data[2];
    
          print("status: $status");
          print("progress: $progress");
          print("id == downloadId: ${id == downloadId}");
        });
        FlutterDownloader.registerCallback(downloadCallback);
    
        _localPath = (await _findLocalPath()) + '/Download';
        final savedDir = Directory(_localPath);
        bool hasExisted = await savedDir.exists();
        if (!hasExisted) {
          savedDir.create();
        }
      }
    
      static void downloadCallback(
          String id, DownloadTaskStatus status, int progress) {
        print(
            'Background Isolate Callback: task ($id) is in status ($status) and process ($progress)');
        final SendPort send =
            IsolateNameServer.lookupPortByName('downloader_send_port');
        send.send([id, status, progress]);
      }
    
      Future<String> _findLocalPath() async {
        final directory = await getExternalStorageDirectory();
        return directory.path;
      }
    
      Future<bool> _checkPermission() async {
        if (Theme.of(context).platform == TargetPlatform.android) {
          PermissionStatus permission = await PermissionHandler()
              .checkPermissionStatus(PermissionGroup.storage);
          if (permission != PermissionStatus.granted) {
            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;
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home Page'),
          ),
          body: Center(
            child: Text('home page'),
          ),
          floatingActionButton: FloatingActionButton(
            child: Icon(Icons.arrow_downward),
            onPressed: () async {
              if (await _checkPermission()) {
                final taskId = await FlutterDownloader.enqueue(
                  url: _link,
                  savedDir: _localPath,
                  showNotification:
                      true, // show download progress in status bar (for Android)
                  openFileFromNotification:
                      true, // click on notification to open downloaded file (for Android)
                );
                downloadId = taskId;
              }
            },
          ),
        );
      }
    }
    

    中文模板res/values-b+zh+ZH/strings.xml

      
    <resources>
    <string name="flutter_downloader_notification_started">下载开始</string>
    <string name="flutter_downloader_notification_in_progress">正在下载</string>
    <string name="flutter_downloader_notification_canceled">下载取消</string>
    <string name="flutter_downloader_notification_failed">下载错误</string>
    <string name="flutter_downloader_notification_complete">下载完成</string>
    <string name="flutter_downloader_notification_paused">下载暂停</string>
    </resources>
    
  • 相关阅读:
    C语言的数组
    C语言的组成 以及预编译
    python实战——网络爬虫之request
    python实战——网络爬虫
    web渗透-sqli-labs-master 下载与安装
    PHP之旅4 php 超全局变量
    PHP之旅9 MySQL数据库
    PHP之旅8 URL与表单
    mysql数据库事务隔离级别与设置
    xsell 过期后的处理方法
  • 原文地址:https://www.cnblogs.com/ajanuw/p/11703515.html
Copyright © 2020-2023  润新知