【问题标题】:Error "type 'Future<dynamic>' is not a subtype of type 'StreamTransformer<List<String>, List<String>>'"错误“类型 'Future<dynamic>' 不是类型 'StreamTransformer<List<String>, List<String>>' 的子类型”
【发布时间】:2019-06-26 23:08:09
【问题描述】:

我在我的 BLOC 中收到错误消息“类型 'Future' 不是类型 'StreamTransformer, List> 的子类型”。

这是我的应用程序的结构: 一个 BLOC(即,reports_bloc)。 一个Repository(即repository)。 一个 API Provider(即 api_provider)。

详细来说,API Provider 文件在线获取数据。 Repository 文件准备好来自 API Provider 的数据(实际上,我也在使用 DB,这也是我选择使用 Repository 文件的原因)。 BLOC 旨在从 Repository 获取数据并相应地将其添加到 Stream 和 Sink。我相信问题出在 BLOC 中(关于添加到 Stream 和“下沉”数据,我可能在这里弄错了)。

代码在这里:

 //reports_bloc.dart
  import 'package:rxdart/rxdart.dart';
  import '../resources/repository.dart';

  class ReportsBloc  {
    final _repository = Repository();
    final _allReports = PublishSubject<List<dynamic>>();

    Observable<List<dynamic>> allReports;  

    ReportsBloc(){
      allReports = _allReports.stream.transform(fetchAllReports());
    }

    fetchAllReports() async{
      var reports = await _repository.fetchAllReports();
       _allReports.sink.add(reports);
    }

    dispose() {
     _allReports.close();
    }
  }



  //repository.dart
  import 'dart:async';
  import 'api_provider.dart';

  class Repository {

    ApiProvider apiProvider = ApiProvider();

    Future<List<dynamic>> fetchAllReports(){
      var response =  apiProvider.getAllReports();
      return response;
    }  
  }


  //api_provider.dart
  Future<List<dynamic>> getAllReports() async {
    List<dynamic> reports = [];

    final response = await http.get("$_root$_getAllReports");
    var result = json.decode(response.body); 

    for(var i = 0; i < result.length; i++){
      reports.add(result[i]);
      print(reports[i]['type']);
    }

    return reports;
   }

预期的结果是能够从存储库添加数据并接收它。

【问题讨论】:

    标签: dart stream flutter rxdart bloc


    【解决方案1】:

    我已经能够修复这个错误。简单地说,我所做的就是重新定义 ReportsBloc 类的构造函数,如下所示:

    ReportsBloc(){
      fetchAllReports();
      allReports = _allReports.stream;
    }
    

    但是,我不确定这是否是一个好习惯,但无论如何它解决了我的问题。

    【讨论】:

    • 您可以直接将所有报告定义为流结果。
    • Observable&lt;List&lt;dynamic&gt;&gt; allReports = _allReports.stream;
    • 然后不是在构造函数中获取所有报告。在小部件initState 中执行此操作,或者如果您在加载路线之前在router 生成器中使用onGenerateRoute
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 2021-12-29
    • 2023-01-08
    • 2021-07-06
    • 2021-02-17
    • 2021-07-17
    • 2021-03-17
    • 2021-04-07
    相关资源
    最近更新 更多