flutter - ScanStreamTransformer 上的 NULL 累加器
问题描述
我正在实现一个需要递归调用来获取所有数据的 api。我已经实现了一个 Bloc 组件,该组件具有recursive transformer
. 但是,似乎转换器在递归调用中不断返回空累加器。
comments_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();
}
}
应用程序.dart
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)
_commentsTransformer仅执行引发错误的第一个实例cache[id] = _repository.fetchItem(id);
;
解决方案
显然cache
是null
。这是因为您没有返回cache
变压器的累加器功能。您需要返回它,因为它不是箭头函数。
_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>>{},
);
}
推荐阅读
- sas - 将文件夹内容打印到 SAS 中的文本文件
- android - 输入调度超时 (ANR)
- python - Python - 从电子邮件中删除附件
- c# - Rhino.Mocks - 从存根获取模拟实例
- java - Java RPN 计算器 NullPointerException 错误
- javascript - 使用节点 pg 从 csv 文件将多行插入 db
- python - 字符串传递给 rpy2 的奇怪行为 - 从字符串中删除前导零
- python - 如何对数据框中的前几行求和?
- typescript - 如何在 Vue 3 Typescript 中定义可选数据
- maven - Maven 依赖插件,copyDependencies:不能指定'distributionManagement.status'