如何收听(&Close"Event)颤动网络中的文件下载窗口? [英] How to listen("close" event) to the file download window in flutter web?

查看:23
本文介绍了如何收听(&Close"Event)颤动网络中的文件下载窗口?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码允许使用universal_html.InputElement uploadInput = universal_html.FileUploadInputElement();网页颤动打开文件上载窗口,并选择必要的文件将其加载到项目中。如果用户没有选择任何照片并点击关闭/取消窗口,我想对此作出反应。如何理解用户关闭窗口?



  final completer = Completer<List<String>>();
  universal_html.InputElement uploadInput = universal_html.FileUploadInputElement();
  uploadInput.multiple = true;
  uploadInput.accept = 'image/*';
  uploadInput.click();

  uploadInput.addEventListener('change', (e) async {
    final files = uploadInput.files;
    Iterable<Future<String>> resultsFutures = files.map((file) {
      final reader = universal_html.FileReader();
      reader.readAsDataUrl(file);
      reader.onError.listen((error) => completer.completeError(error));
      return reader.onLoad.first.then((_) => reader.result as String);
    });
    final results = await Future.wait(resultsFutures);
    completer.complete(results);
  });

  universal_html.document.body.append(uploadInput);
  final List<String> images = await completer.future;

  uploadInput.remove();


推荐答案

包的Web实现中使用了管理此类事件的方法file_picker

这里有一个代码示例可以帮助您(您也可以从包中找到完整的实现here):

import 'dart:html' as html;
import 'dart:async';

Future<html.File?> pickFile(String type) async {
  final completer = Completer<List<html.File>?>();
  final input = html.FileUploadInputElement() as html.InputElement;
  input.accept = '$type/*';

  var changeEventTriggered = false;
  void changeEventListener(html.Event e) {
    if (changeEventTriggered) return;
    changeEventTriggered = true;

    final files = input.files!;
    final resultFuture = files.map<Future<html.File>>((file) async {
      final reader = html.FileReader();
      reader.readAsDataUrl(file);
      reader.onError.listen(completer.completeError);
      return file;
    });
    Future.wait(resultFuture).then((results) => completer.complete(results));
  }

  void cancelledEventListener(html.Event e) {
    html.window.removeEventListener('focus', cancelledEventListener);

    // This listener is called before the input changed event,
    // and the `uploadInput.files` value is still null
    // Wait for results from js to dart
    Future.delayed(Duration(milliseconds: 500)).then((value) {
      if (!changeEventTriggered) {
        changeEventTriggered = true;
        completer.complete(null);
      }
    });
  }

  input.onChange.listen(changeEventListener);
  input.addEventListener('change', changeEventListener);

  // Listen focus event for cancelled
  html.window.addEventListener('focus', cancelledEventListener);

  input.click();

  final results = await completer.future;
  if (results == null || results.isEmpty) return null;
  return results.first;
}

我们的想法是在focus事件上依赖侦听器,这样当您在没有加载任何数据的情况下失去对文件选取器窗口的关注时,它将用null值来完成您的未来。

这篇关于如何收听(&Close&quot;Event)颤动网络中的文件下载窗口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆