Flutter ScanStreamTransformer上的空累加器

Flutter ScanStreamTransformer上的空累加器,flutter,rxdart,Flutter,Rxdart,我正在实现一个api,它需要递归调用来获取所有数据。我实现了一个Bloc组件,它有一个递归转换器。然而,在递归调用中,转换器似乎一直在返回null累加器 评论\u bloc.dart class CommentsBloc { final _repository = Repository(); final _commentsFetcher = PublishSubject<int>(); final _commentsOutput = BehaviorSubject<

我正在实现一个api,它需要递归调用来获取所有数据。我实现了一个Bloc组件,它有一个
递归转换器
。然而,在递归调用中,转换器似乎一直在返回null累加器

评论\u bloc.dart

class CommentsBloc {
  final _repository = Repository();
  final _commentsFetcher = PublishSubject<int>();
  final _commentsOutput = BehaviorSubject<Map<int, Future<ItemModel>>>();

  // Stream Getters
  Observable<Map<int, Future<ItemModel>>> get itemWithComments =>
      _commentsOutput.stream;

  // Sink getters
  Function(int) get fetchItemWithComments => _commentsFetcher.sink.add;

  CommentsBloc() {
    _commentsFetcher.stream
        .transform(_commentsTransformer())
        .pipe(_commentsOutput);
  }

  _commentsTransformer() {
    return ScanStreamTransformer<int, Map<int, Future<ItemModel>>>(
      (cache, int id, index) {
        cache[id] = _repository.fetchItem(id);
        cache[id].then((ItemModel item) {
          item.kids.forEach((kidId) => fetchItemWithComments(kidId));
        });
      },
      <int, Future<ItemModel>>{},
    );
  }

  dispose() {
    _commentsFetcher.close();
    _commentsOutput.close();
  }
}
return MaterialPageRoute(
  builder: (BuildContext context) {
    final itemId = int.parse(settings.name.replaceFirst('/', ''));
    final commentsBloc = CommentsProvider.of(context);

    commentsBloc.fetchItemWithComments(itemId);

    return NewsDetail(itemId: itemId);
  },
  );
错误

E/flutter (17142): [ERROR:flutter/shell/common/shell.cc(178)] Dart Error: Unhandled exception:
E/flutter (17142): NoSuchMethodError: The method '[]=' was called on null.
E/flutter (17142): Receiver: null
E/flutter (17142): Tried calling: []=(19307509, Instance of 'Future<ItemModel>')
E/flutter (17142): #0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
E/flutter (17142): #1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
E/flutter (17142): #2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
E/flatter(17142):[错误:flatter/shell/common/shell.cc(178)]省道错误:未处理的异常:
E/Flatter(17142):NoSuchMethodError:对null调用了方法“[]=”。
E/颤振(17142):接收器:空
E/Flatter(17142):尝试调用:[]=(19307509,“未来”的实例)
E/颤振(17142):#0#。(dart:async/zone.dart:1112:29)
E/flatter(17142):#1 microtaskLoop(dart:async/schedule_microtask.dart:41:21)
E/flatter(17142):#2"开始微任务循环(dart:async/schedule"微任务。dart:50:5)
\u commentsTransformer只执行在
缓存[id]=\u repository.fetchItem(id)上抛出错误的第一个实例;

;

显然
缓存
空的
。这是因为您没有在transformer的累加器函数中返回缓存。您需要返回它,因为它不是箭头函数

  _commentsTransformer() {
    return ScanStreamTransformer<int, Map<int, Future<ItemModel>>>(
      (cache, int id, index) {
        cache[id] = _repository.fetchItem(id);
        cache[id].then((ItemModel item) {
          item.kids.forEach((kidId) => fetchItemWithComments(kidId));
        });
        return cache;    //  <-- code fix here.
      },
      <int, Future<ItemModel>>{},
    );
  }
\u commentsTransformer(){
回程扫描变压器(
(缓存,int-id,索引){
cache[id]=\u repository.fetchItem(id);
缓存[id]。然后((ItemModel项){
item.kids.forEach((kidId)=>fetchItemWithComments(kidId));
});

return cache;//我做了一些调试,发现缓存为空,为什么我的
ScanStreamTransformer
会有空缓存value@IsaacObella看起来您正在用null填充它。您调试了
存储库.fetchItem
方法返回的内容吗?是的,我调试了,当找不到数据时,它返回null,但是即使为它添加了空检查,它仍然会在
cache[id]=\u repository.fetchItem(id);
处抛出错误,声称缓存为空。@IsaacObella愚弄了我。我想知道我抽的是什么lol。这段时间我一直知道
cache
null
。但我不知道为什么写
cache[id]
在我的回答中,我不知道为什么我要集中精力处理
\u repository.fetchItem(id)中的空值
。尽管如此,我想我还是发现了错误。您没有在transformer的累加器函数中返回
cache
,因为它不是箭头函数。如果您吸烟,那么我很兴奋,我甚至看不到缺少的return语句。谢谢@amsakana。