我正在学习Flutter的BloC设计模式。
这是我的教程https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1
我的问题是snapshot.data
中的StreamBuilder
始终为空。
这是我的SlideModel:
class SlideModel {
Widget dot;
String urlImage, name;
SlideModel(this.dot, this.urlImage, this.name);
}
这是我的提供者:
class SlideProvider {
List<SlideModel> getList() {
List<SlideModel> listSlide = List<SlideModel>();
listSlide.add(SlideModel(
Dots.dot(Colors.black54), 'https://i.imgur.com/c7Uvh6h.jpg', 'A'));
listSlide.add(SlideModel(
Dots.dot(Colors.black54),
'https://cdn.shopify.com/s/files/1/0810/8331/files/category_banner_ip8.jpg?1347021331059137510',
'B'));
listSlide.add(SlideModel(
Dots.dot(Colors.black54), 'https://i.imgur.com/gAumC4V.jpg', 'C'));
listSlide.add(SlideModel(
Dots.dot(Colors.black54), 'https://i.imgur.com/n7g3Naf.jpg', 'D'));
return listSlide;
}
}
这是我的存储库:
class Repository {
SlideProvider _slideProvider = SlideProvider();
List<SlideModel> getAllSlide() {
return _slideProvider.getList();
}
}
SlideBloc:
class SlideBloc {
Repository _repository = Repository();
final _streamController = PublishSubject<List<SlideModel>>();
Observable<List<SlideModel>> stream() {
return _streamController.stream;
}
getAllSlide() {
List<SlideModel> slides = _repository.getAllSlide();
_streamController.sink.add(slides);
}
dispose(){
_streamController.close();
}
}
final slideBloc = SlideBloc();
这是我的UI窗口小部件,始终打印“无数据”。 我要修复它:
@override
Widget build(BuildContext context) {
slideBloc.getAllSlide();
// TODO: implement build
return StreamBuilder(
stream: slideBloc.stream(),
builder: (context, snapshot) {
if (!snapshot.hasError) {
if (snapshot.hasData) {
return slideShow(snapshot.data);
} else {
print('No data');
return Text('No Data');
}
} else {
print(snapshot.error);
return Text(snapshot.error);
}
},
);
}
答案 0 :(得分:1)
我认为可能与
有关getAllSlide() {
List<SlideModel> slides = _repository.getAllSlide();
_streamController.sink.add(slides);
}
slideBloc文件内部。
尝试这样:
fetchAllMovies() async {
ItemModel itemModel = await _repository.fetchAllMovies();
_moviesFetcher.sink.add(itemModel);
}
让我知道是否有帮助。
答案 1 :(得分:0)
使用StreamBuilder
小部件时,您可以使用 StreamController ,如下所示。
class SlideBloc {
Repository _repository = Repository();
final _streamController = StreamController<List<SlideModel>>();
Stream<List<SlideModel>> stream() {
return _streamController.stream;
}
getAllSlide() {
List<SlideModel> slides = _repository.getAllSlide();
_streamController.sink.add(slides);
}
dispose(){
_streamController.close();
}
}
final slideBloc = SlideBloc();
您可以在用户界面中指定所需的模型,请参见:
@override
Widget build(BuildContext context) {
slideBloc.getAllSlide();
return StreamBuilder<List<SlideModel>>(
stream: slideBloc.stream(),
builder: (context, snapshot) {
if (!snapshot.hasError) {
if (snapshot.hasData) {
print(snapshot.data.first.name);
return Text('Has DATA');
} else {
print('No data');
return Text('No Data');
}
} else {
print(snapshot.error);
return Text(snapshot.error);
}
},
);
}
这是解决问题的一种方法。希望有帮助。