android - (BloC) StreamBuilder 总是 !snapshot.hasData

标签 android ios dart flutter

我正在学习 Flutter 的 BloC 设计模式。

这是我的教程https://medium.com/flutterpub/architecting-your-flutter-project-bd04e144a8f1

我的问题是 StreamBuilder 中的 snapshot.data 始终为 null。

这是我的幻灯片模型:

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();
  }
}

幻灯片 block :

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

最佳答案

我觉得可能跟

getAllSlide() {
    List<SlideModel> slides = _repository.getAllSlide();
    _streamController.sink.add(slides);
  } 

在您的 slideBloc 文件中。

试着把它变成这样:

fetchAllMovies() async {
    ItemModel itemModel = await _repository.fetchAllMovies();
    _moviesFetcher.sink.add(itemModel);
  }

如果有帮助,请告诉我。

关于android - (BloC) StreamBuilder 总是 !snapshot.hasData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56157209/

相关文章:

json - 在 Dart 中格式化 JSON 的类结构

flutter - 我在 flutter 打上有地理位置问题

android - 由于 list 设置,蜂窝不支持

android - 启动默认 Android 壁纸选择器

android - 如何使用 dockerfile 在模拟器上构建并运行 android apk

ios - 如何为每个设备制作 Storyboard

flutter - 如何在 flutter 中画出这个

android - 在 Android Studio 项目上找不到参数的方法 test()

下载许多大文件时出现 iOS 内存警告

ios - 锁定 Objective-C 中的全类