0

switchMap 不会取消先前的 http 请求。并且当调用streamcontroller close 时,内部流不会取消。帮帮我,谢谢

class AssetManagementViewModel implements ViewModel {
  // Inputs
  void refresh() => _refresh.add(null);

  // Outputs
  late final Stream<List<Asset>> assets;

  final _refresh = StreamController<void>.broadcast();

  AssetManagementViewModel({required this.api}) {
    _getAssets() => api
        .getAssets(null)
        .map((event) => event.map((json) => Asset.fromJson(json)).toList());

    assets = _getAssets().asBroadcastStream().concatWith([
      _refresh.stream.switchMap((value) {
        return _getAssets(); // 2.don‘t cancel
      }).shareReplay(maxSize: 1)
    ]);
  }

  final AssetManagementAPI api;

  @override
  void dispose() {
    _refresh.close(); // 1.when call
  }
}

这是API流生成器,我找不到更好的方法

  Stream<List> getAssets(params) {
    print("will send getAssets request");
    final controller = StreamController<List>();
    rootBundle.loadString("lib/resource/assetData.json").then((value) {
      final list = jsonDecode(value);
      Future.delayed(Duration(seconds: 3)).then((value) {
        print("response getAssets request");
        controller.add(list);
        controller.close();
      });
    });
    controller.onCancel = () {
      print("cancel getAssets request");
      // dioToken.cancel ...
    };

    return controller.stream;
  }
4

0 回答 0