【问题标题】:NULL Accumulator on ScanStreamTransformerScanStreamTransformer 上的 NULL 累加器
【发布时间】:2019-03-05 08:42:52
【问题描述】:

我正在实现一个需要递归调用来获取所有数据的 api。我已经实现了一个具有recursive transformer 的 Bloc 组件。但是,似乎转换器在递归调用中不断返回空累加器。

cmets_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();
  }
}

app.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)

_cmetsTransformer 仅执行在cache[id] = _repository.fetchItem(id); ; 上引发错误的第一个实例

【问题讨论】:

    标签: flutter rxdart


    【解决方案1】:

    显然cachenull。这是因为您没有在变压器的累加器函数中返回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>>{},
        );
      }
    

    【讨论】:

    • 我做了一些调试,发现它的缓存是空的,为什么我的ScanStreamTransformer会有一个空缓存值
    • @IsaacObella 看起来你正在用 null 填充它。您是否调试过您的 repository.fetchItem 方法返回的内容?
    • 是的,我做到了,当没有找到数据时,它返回一个空值,但即使在为其添加空值检查后,它仍然会在cache[id] = _repository.fetchItem(id); 处抛出错误,声称缓存为空。
    • @IsaacObella 愚蠢的我。我想知道我在抽什么,哈哈。一直以来,我都知道cachenull。但我不知道为什么我在回答中写了cache[id],也不知道为什么我专注于处理来自_repository.fetchItem(id) 的空值。尽管如此,我想我发现了这个错误。您没有在转换器的累加器函数中返回 cache,因为它不是箭头函数。
    • 如果你在抽烟,那我就很高了,我什至看不到丢失的退货声明。谢谢@Amsakanna。
    猜你喜欢
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多