Тип ошибки «Будущее ‹dynamic›» не является подтипом типа «StreamTransformer‹ List ‹String›, List ‹String› ›»

Я получаю сообщение об ошибке "Тип" Future "не является подтипом типа" StreamTransformer, List> "в моем BLOC".

Это структура моего приложения: BLOC (а именно, reports_bloc). Репозиторий (а именно репозиторий). Поставщик API (а именно api_provider).

Более подробно, файл поставщика API извлекает данные из Интернета. Файл репозитория подготавливает данные от поставщика API (на самом деле я также использую БД, поэтому я предпочитаю иметь файл репозитория). BLOC предназначен для получения данных из репозитория и добавления их в Stream и Sink соответственно. Я считаю, что проблема в BLOC (я, вероятно, ошибаюсь здесь в отношении добавления данных в Stream и "Sinking").

Код здесь:

 //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;
   }

Ожидаемый результат - иметь возможность добавлять данные из репозитория и загружать их.


person Deshola    schedule 02.02.2019    source источник


Ответы (1)


Мне удалось исправить эту ошибку. Проще говоря, я переопределил конструктор класса ReportsBloc, как показано ниже:

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

Однако я не совсем уверен, что это хорошая практика, но она все равно устранила мою проблему.

person Deshola    schedule 04.02.2019
comment
Вы можете напрямую определить все отчеты для результата потока. - person Isaac Obella; 02.05.2019
comment
Затем вместо получения всех отчетов в конструкторе. Сделайте это в виджетах initState или, если вы используете onGenerateRoute в генераторе router перед загрузкой маршрута; - person Isaac Obella; 02.05.2019