在StreamBuilder中加载数据时如何显示进度指示器?

时间:2019-04-05 03:57:29

标签: dart flutter

考虑我有这个

            StreamBuilder(
              stream: myBloc.productList,
              builder: (context, AsyncSnapshot<List<Product>> snapshot) {
                if (snapshot.hasData && snapshot != null) {
                  if (snapshot.data.length > 0) {
                    return buildProductList(snapshot);
                  }
                  else if (snapshot.data.length==0){
                    return Center(child: Text('No Data'));
                  }
                } else if (snapshot.hasError) {
                  return ErrorScreen(errMessage: snapshot.error.toString());
                }
                return CircularProgressIndicator();
              },
            ),

起初,进度指示器将正常工作,但是当找不到数据并且一旦显示“无数据”时,进度指示器将不再出现。

仅加载数据时如何显示进度指示器。并在没有数据时不显示数据,在有数据时不显示数据?

这就是集团的一部分

  final _fetcher = BehaviorSubject<List<Product>>();
  Observable<List<Product>> get productList => _fetcher.stream;

只需从RESTAPI中获取数据,然后将其放入列表中

List<Product> product = await _repository.fetchProduct().catchError((err) => _fetcher.addError(err));

_fetcher.sink.add(product);

2 个答案:

答案 0 :(得分:1)

首先,snapshot.hasDatasnapshot.data != null实际上是完全相同的(hasData在内部调用data != null)。我实际上在这里误读了您的代码,但是snapshot永远不会是null。因此,您仍然可以删除它。

这里的问题是您对Stream的工作方式有误解。如果您当前正在添加product,则流不会推送更新。它怎么会知道什么时候要做呢?仅当您在其上调用add时它才会更新,在这种情况下data不会是null。因此,没有进度指示器。

您可以在加载时添加null来轻松解决该问题:

_fetcher.sink.add(null); // to show progress indicator

List<Product> product = await _repository.fetchProduct().catchError((err) => _fetcher.addError(err));

_fetcher.sink.add(product); // to show data

答案 1 :(得分:0)

snapshot.connectionState可以判断您的数据是否仍在加载...

if (snapshot.connectionState == ConnectionState.waiting) {
  return CircularProgressIndicator();
}