【问题标题】:Flutter - running two async in two widgetsFlutter - 在两个小部件中运行两个异步
【发布时间】:2022-11-20 20:38:49
【问题描述】:

我需要在一个小部件中运行 async 方法,但该小部件仍在等待 async 方法结束。

所以我有这段代码:

class MainList extends StatelessWidget {
  final List<TemplateData> list;

  TemplatesList({required this.list});

  @override
  Widget build(BuildContext context) {
    final int index = (templates.length / 2).round();
    final listLeft =
    list.sublist(0, index);
    final listRight=
    list.sublist(index, templates.length);

    return SingleChildScrollView(
      child: Padding(
        padding: const EdgeInsets.all(8),
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Flexible(child: _List(templateData: listLeft)),
            Flexible(child: _List(templateData: listRight)),
          ],
        ),
      ),
    );
  }
}

class _List extends StatefulWidget{
  final List<TemplateData> fileNames;

  const MemeList({required this.fileNames});

  @override
  State<StatefulWidget> createState() => _MemeListState();
}

class _ListState extends State<_List>{
  late List fileDownloaded;
  @override
  void initState() {
    super.initState();
    fileDownloaded = widget.fileNames.map((e) => false).toList();
    downloadPreviews(widget.fileNames);
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [for (String file in widget.fileNames) MyItem(name: file, is_downloaded:fileDownloaded[widget.fileNames.indexOf(file)],)],
    );
  }
  Future downloadFiles(List<TemplateData> fileNames) async {
    fileNames.forEach((file) async{
        await downloadFile(file);
        setState(() {
          fileDownloaded[widget.fileNames.indexOf(file)] = true;
        });
      }
    });
  }
}

在我的应用程序中,我有两个列表,一个在左边,一个在右边。构建应用程序时,会逐渐为每个列表下载文件。我的问题是第一个列表(左侧)的下载速度比第二个快。我想要的是同时下载它们。我是编程的初学者,所以我需要你的帮助。

【问题讨论】:

    标签: flutter list dart asynchronous android-widget


    【解决方案1】:

    您可以使用Future.wait()方法等待所有期货完成。在下面的代码中,await Future.wait(futures) 将等到所有文件都下载完毕,只有在下载完之后才会执行setState

      Future downloadFiles(List<TemplateData> fileNames) async {
        final futures = <Future>[];
        for (final file in fileNames) {
          futures.add(downloadFile(file));
        }
    
        await Future.wait(futures);
    
        setState(() {
          for (final file in fileNames) {
            fileDownloaded[widget.fileNames.indexOf(file)] = true;
          }
        });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2021-04-28
      • 2023-03-07
      • 1970-01-01
      • 2023-02-05
      • 1970-01-01
      相关资源
      最近更新 更多