【问题标题】:An eexception occurs when using flutter_downloader package使用flutter_downloader包时出现异常
【发布时间】:2020-11-06 01:23:39
【问题描述】:

我正在尝试使用 flutter_downloader 包下载一些文件(图像/pdf)。有一个带有 ListTiles 的 listView,每个 ListTiles 都包含一个单击时开始下载的按钮,但是在滚动列表视图时会发生此错误。

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] 未处理异常:'package:flutter_downloader/src/downloader.dart':断言失败:第 30 行 pos 12:'!_initialized':FlutterDownloader.initialize () 只能调用一次!

//我的代码是这样的:

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';

class DownloadFile extends StatefulWidget {

  DownloadFile({this.downloadUrl});
  final String downloadUrl;

  @override
  _DownloadFileState createState() => _DownloadFileState();
}

class _DownloadFileState extends State<DownloadFile> {
  String downloadId;
  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) {
      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
  void dispose() {
    super.dispose();
  }
  //---------------------------------------------------------------
  @override
  Widget build(BuildContext context) {
    return FlatButton(
      onPressed: () async {
        if (await _checkPermission()) {
          final taskId = await FlutterDownloader.enqueue(
            url: widget.downloadUrl,
            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;
        }
      },
      child: Text('Downloa File',style: TextStyle(color: Colors.teal),)
    );
  }
}

【问题讨论】:

  • 错误信息是说您尝试多次调用FlutterDownloader.initialize()。如果您的代码代表一个下载按钮,其中会有很多,则将为每个按钮调用 initialize() 函数,从而导致您遇到错误。移动 FlutterDownloader.initialize() 调用,使其在应用程序的生命周期内只调用一次。
  • 其实不行。移动 FlutterDownloader.initialize() 时出现这个错误:FlutterDownloader.initialize() must be called at least once!

标签: flutter


【解决方案1】:

根据flutter_downloader包中的Usage section和你遇到的错误,你不能多次调用FlutterDownloader.initialize

您可以在应用程序的 main 方法中执行此操作,就像这样:

WidgetsFlutterBinding.ensureInitialized();
await FlutterDownloader.initialize();

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2011-10-15
    • 2015-02-05
    • 2014-08-06
    • 1970-01-01
    • 2011-09-15
    • 2016-11-08
    • 2011-08-11
    相关资源
    最近更新 更多