0

我正在实现文件上传。我想使用 CircularProgressIndicator 显示上传进度。

FileUploadController 类的uploadFile() 函数将文件上传到服务器并告知上传进度的百分比。并且每帧都会调用“NotifyListeners()”来通知上传进度。

我尝试使用此信息绘制一个 CircularProgressIndicator,但出现错误。“在构建过程中调用了 setstate() 或 markneedsbuild()。

  @override
  Widget build(BuildContext context) {
    var uploadController = Provider.of<FileUploadController>(context);
    uploadController.uploadFile(userFiles, context);//upload files and update uploadPercentage
    return ListTile(
      leading: Stack(
        children: [
          CircularProgressIndicator(
            value: userFiles.uploadPercentage,
            strokeWidth: userFiles.uploadPercentage == 1 ? 0 : 1,
          ),
          Positioned(
            right: 3,
            left: 3,
            top: 3,
            bottom: 3,
            child: CircleAvatar(
              backgroundColor: Colors.white,
              backgroundImage:
                  AssetImage('assets/images/fileTypeLogos/pdf.png'),
            ),
          ),
        ],
      ),
      title: Text(widget.fileName),
      trailing: IconButton(
        icon: Icon(Icons.close),
        onPressed: () => widget.removeWhenCloseButtonTap(widget.fileName),
      ),
    );
  }

我认为问题是在 build() 中调用 notifyListeners() (uploadFile 函数调用它)。我该如何解决?

4

1 回答 1

0

是的,这可能就是问题所在。您可能想在uploadFile()内部进行调用initState()

FileUploadController uploadController(BuildContext context) => Provider.of<FileUploadController>(context);

@override
void initState() {
  super.initState();
  uploadController(context).uploadFile(userFiles, context);
}

如果您在无状态小部件中,请将其转换为有状态小部件。

于 2021-02-03T21:02:59.597 回答