如何在异步获取数据时动态更新 ListView?

huangapple go评论47阅读模式
英文:

How to dynamically update ListView while fetching data asynchronously?

问题

我正在尝试找出在获取数据列表时更新 ListView.builder() 的最佳方法。基本上,我是分批下载数据的 -- 比如一次下载一组 10 张图片 -- 然后在未来完成后在 ListView.builder 中显示它们,下面还有一个指示器表示我们仍在获取数据。并且一直执行此操作,直到所有数据都被获取。

最佳实现方式是什么?

我拥有的示例代码如下:

void _fetchImages() async {
  // 获取图片
  for (...) {
    final results = await Future.wait[imageFutures];
    
    // 在这里更新列表
    imageList.addAll(results); // 假设数据以正确的格式返回
    setState((){});
  }  
}

@override
void initState() {
  super.initState();
  _fetchImages();
}

@override
Widget build(BuildContext context) {
  return ListView.builder(...);
}
英文:

I am trying to figure out the best way to update a ListView.builder() while I'm fetching a list of data. Essentially, I am downloading data in batches -- let's say a group of 10 images at a time -- and displaying them in a ListView.builder after the future completes, with an indicator below it to signify that we're still fetching data. And do this until everything is fetched.

What's the best way of going about this?

Example code of what I have:

void _fetchImages() async {
  // Fetch images
  for (...) {
    final results = await Future.wait[imageFutures];
    
    // update list here
    imageList.addAll(results); // let's say data comes back in correct format
    setState((){});
  }  
}

@override
void initState() {
  super.initState();
  _fetchImages();
}

@override
Widget build(BuildContext context) {
  return ListView.builder(...);
}

答案1

得分: 0

从`Stream`返回`List`,然后你可以使用`StreamBuilder`。
```dart
    return StreamBuilder<List<MyImage>>(
      stream: dataStream,
      builder: (BuildContext context, AsyncSnapshot<List<MyImage>> snapshot) {
        if (snapshot.hasData) {
          return Center(
            child: ListView.builder(
                ...
          );
        }
        return SomeWidget(
         ...
        );
      },
    );
英文:

Return List from Stream then you can use StreamBuilder.

    return StreamBuilder<List<MyImage>>(
      stream: dataStream,
      builder: (BuildContext context, AsyncSnapshot<List<MyImage>> snapshot) {
        if (snapshot.hasData) {
          return Center(
            child: ListView.builder(
                ...
          );
        }
        return SomeWidget(
         ...
        );
      },
    );

huangapple
  • 本文由 发表于 2023年2月16日 04:59:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/75465386.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定