使用 dart:HTML 库在 Flutter Web 中选择文件时如何获取 Flutter 中的文件名?

Posted

技术标签:

【中文标题】使用 dart:HTML 库在 Flutter Web 中选择文件时如何获取 Flutter 中的文件名?【英文标题】:How to get the file name in Flutter when using dart:HTML library to pick file in Flutter Web? 【发布时间】:2021-04-16 23:35:18 【问题描述】:

在我的项目中,我定义了一个函数uploadPdf()。 在 Raised Button 处调用此函数来选择一个文件,它工作正常。它打印文件名。现在我想将该文件名转换为文本小部件。为此,我将 fileName 定义为全局变量,并最初分配了值。在 uploadPdf() 函数中调用此变量,以便在获取新值时更新该值,但不会更改。它仍然显示我最初分配的相同值。 谢谢!


//Flutter Full Code
import 'package:flutter/material.dart';
import 'dart:html';

String fileName = "no item selected";

void uploadPdf() 
  InputElement uploadInput = FileUploadInputElement()..accept = 'pdf/*';
  uploadInput.click();
  uploadInput.onChange.listen((event) 
    final file = uploadInput.files.first;
    fileName = file.name;
    print(fileName);
    final reader = FileReader();
    reader.readAsDataUrl(file);
    reader.onLoadEnd.listen((event) 
      print('done');
    );
  );


class ButtonChange extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    return Column(
      children: [
        RaisedButton(
          onPressed: () => uploadPdf(),
          child: Text("Upload Button"),
        ),
        Text(fileName)
      ],
    );
  




【问题讨论】:

【参考方案1】:

您需要将ButtonChange 小部件转换为StatefulWidget,并将uploadPdf() 函数移动到状态类中,并在更新文件名后调用setState

void uploadPdf() 
  InputElement uploadInput = FileUploadInputElement()..accept = 'pdf/*';
  uploadInput.click();
  uploadInput.onChange.listen((event) 
    final file = uploadInput.files.first;
    setState(() 
       fileName = file.name; 
    );
    fileName = file.name;
    print(fileName);
    final reader = FileReader();
    reader.readAsDataUrl(file);
    reader.onLoadEnd.listen((event) 
      print('done');
    );
  );
  

【讨论】:

感谢它的工作,但它们是一个小问题...我需要再次单击按钮并必须取消然后它会更新最后一个值。 @Prateek 我更新了我的答案。我猜onChange 是异步的,所以 setState 将在 fileName 更新之前执行。请在 onChange 事件中移动setState,它会立即更新。 感谢@Calvin,现在它会立即更新文件名。

以上是关于使用 dart:HTML 库在 Flutter Web 中选择文件时如何获取 Flutter 中的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

flutter解决 dart:html 只支持 flutter_web 其他平台编译报错 Avoid using web-only libraries outside Flutter web(代码片段

使用 Flutter Provider 时,SignalR 客户端颤振库在另一个小部件中显示空值

在 Flutter Web 中上传多个文件(图像)

#yyds干货盘点#dart系列之:HTML的专属领域,除了javascript之外,dart也可以

dart:html 中的 Geolocation.getCurrentPosition 在启用 NNBD 的发布模式下不工作

Flutter 平台特定依赖项