(BloC)StreamBuilder始终是!snapshot.hasData

时间:2019-05-15 20:32:27

标签: android ios dart flutter

我正在学习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);
        }
      },
    );
  }

2 个答案:

答案 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);
        }
      },
    );
  }

这是解决问题的一种方法。希望有帮助。