考虑我有这个
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);
答案 0 :(得分:1)
首先,snapshot.hasData
和snapshot.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();
}