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