gpt4 book ai didi

Flutter web 上传文件取消事件

转载 作者:行者123 更新时间:2023-12-05 06:55:59 28 4
gpt4 key购买 nike

我在 Flutter 中开发了一个网络应用程序,我想从文件系统加载一个文件。为此,我使用以下代码:

static Future<Uint8List> chooseImage(dynamic parent, dynamic provider) async {
Uint8List uploadedImage;
final completer = Completer<List<String>>();
InputElement uploadInput = FileUploadInputElement();
uploadInput.accept = 'image/*';
uploadInput.click();
uploadInput.addEventListener('change', (e) async {
final files = uploadInput.files;
Iterable<Future<String>> resultsFutures = files.map((file) {
final reader = FileReader();
reader.readAsDataUrl(file);
reader.onError.listen((error) => completer.completeError(error));
return reader.onLoad.first.then((_) async {
String result = reader.result as String;
uploadedImage = base64Decode(result.substring(22, result.length));
return reader.result as String;
});
});

final results = await Future.wait(resultsFutures);
completer.complete(results);
});
document.body.append(uploadInput);
final List<String> images = await completer.future;
parent.setState(() {
parent.pickedImage = uploadedImage;
});
uploadInput.remove();
return uploadedImage;
}

在我的应用程序中,当用户按下此弹出窗口中的“取消”按钮时,我需要处理这种情况: enter image description here

我已经为 onFocus、onSuspen、onSubmit、onEnded、onAbort 添加了监听器,但是当按下取消按钮时,这些事件都不会被触发。

如何处理弹窗取消?

最佳答案

I've already answered to a similar question here

您已经可以在包 file_picker 的 Web 实现中找到管理此类事件的方法。 .

因为您使用的浏览器不同,取消事件的管理方式可能不同,最通用的解决方案是依赖窗口中 focus 事件的监听器,这样您就可以在失去焦点时在没有加载任何数据的文件选择器窗口上,它将以 null 值完成您的 future 。

代码示例

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

来源

关于Flutter web 上传文件取消事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65205877/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com