我正在处理一个对话框,该对话框具有通过 StreamResource 动态生成的文件的下载链接,当用户单击下载按钮时,对话框应该关闭。很简单。但是,当用户打开对话框并单击下载按钮时,有时会成功下载创建的文件。问题是,在其他时候,用户在尝试下载创建的文件时可能会随机遇到“找不到资源/文件”错误消息。在重现问题的代码片段下方。
public class HomeView extends VerticalLayout{
Dialog dialog;
public HomeView() {
//Set up dialog
dialog = new Dialog();
Button downloadButton = new Button("Download");
//This might be the problem. Dialog might be closed before the download even starts?
downloadButton.addClickListener(click -> dialog.close());
Anchor anchor = new Anchor();
anchor.add(downloadButton);
anchor.setHref(new StreamResource("file", () -> createInputStream()));
dialog.add(anchor);
//Add a button to open dialog
Button openDialog = new Button("Open Dialog");
openDialog.addClickListener(click -> dialog.open());
add(openDialog);
}
private InputStream createInputStream() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
outputStream.write("text".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
return new ByteArrayInputStream(outputStream.toByteArray());
}
因此,用户有时可能会在按下下载时遇到资源未找到错误消息。
有趣的是,如果我在 createInputStream() 方法中关闭对话框,我不会收到错误消息。下面举个例子。
public class HomeView extends VerticalLayout{
Dialog dialog;
public HomeView() {
dialog = new Dialog();
Button downloadButton = new Button("Download");
//Commented out
//downloadButton.addClickListener(click -> dialog.close());
Anchor anchor = new Anchor();
anchor.add(downloadButton);
anchor.setHref(new StreamResource("file", () -> createInputStream()));
dialog.add(anchor);
Button openDialog = new Button("Open Dialog");
openDialog.addClickListener(click -> dialog.open());
add(openDialog);
}
private InputStream createInputStream() {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
outputStream.write("text".getBytes());
} catch (IOException e) {
e.printStackTrace();
}
//Close the dialog here
dialog.close();
return new ByteArrayInputStream(outputStream.toByteArray());
}
现在,无论我点击下载按钮多少次,我都没有收到资源错误消息,并且对话框仍然按预期关闭。
我正在使用 Vaadin 13.0.1。
所以最后我有这个问题。 第一个代码片段不能 100% 工作,但第二个代码片段似乎可以,为什么?