代码之家  ›  专栏  ›  技术社区  ›  Isaac Obella

rxdart递归变压器

  •  0
  • Isaac Obella  · 技术社区  · 7 年前

    我正在实现一个需要递归调用来获取所有数据的api。我实现了一个具有 recursive transformer . 然而,看起来转换器在递归调用中一直返回一个空累加器。

    评论组.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)
    

    这个 _评论员 只执行引发错误的第一个实例 cache[id] = _repository.fetchItem(id); ;

    0 回复  |  直到 7 年前
        1
  •  1
  •   Amsakanna    7 年前

    显然 cache null . 因为你没有回来 隐藏物 在变压器的蓄电池功能内。您需要返回它,因为它不是一个箭头函数。

      _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>>{},
        );
      }