【问题标题】:Dart: Listeners on stream never trigger onError functionDart:流上的侦听器永远不会触发 onError 函数
【发布时间】:2019-04-12 03:40:57
【问题描述】:

我正在构建一个颤振应用程序并使用 Bloc。我在流的接收器上添加sink.addError('some error text')

在 Bloc 中,我为流添加了一个侦听器,它具有 onDoneonErrordata 等功能。现在发生的事情是,我在接收器中添加的所有内容,甚至 sink.addError 都被归类为数据,而不是错误。我想弄清楚,如何区分sink中添加的数据,以及sink.addError中添加的错误。

最初我认为onError(error){} 没有被调用。是不是,sink.addError('some error text') 也被认为是流中的数据。如果是,那么我需要一种区分数据和错误数据的方法。这是一些代码,可以帮助您了解我的问题的要点:

class Bloc extends Object with Validators { 
  final _controller;   
  final DataBloc dataBloc;

  BlocTextField({ this.dataBloc}) : _controller = initMethod(dataBloc);

  //TODO: Issue with Stream.listen where onError is never called   
  static BehaviorSubject<dynamic> initMethod(DataBloc dataBloc) {
    final _controller = new BehaviorSubject<dynamic>();

    _controller.stream.listen((data) {
      print("Data in "+ data);
    }, onError: (error) {
      print("Error in "+ error);
    });

    return _controller;
  }

  //To change data to our Stream using Sink.   
  Function(dynamic) get changeField=> _controller.sink.add;

  //To add field data from Stream.   
  textFieldStream => _controller.stream.transform(validateField());

  dispose() {
     _textFieldController.close();  
  } 
}

现在,当我尝试在此流中添加数据时。这是我的验证器

class Validators {
  validateField() {
    return StreamTransformer<dynamic, dynamic>.fromHandlers(
      handleData: (FieldStream, sink) {
        sink.addError("Some error here");
    });
  }
}

控制台输出为:Data in some error here

这是我的颤振医生结果:

flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel beta, v0.9.4, on Mac OS X 10.13.6 17G3025, locale en-US)
[✓] Android toolchain - develop for Android devices (Android SDK 28.0.0)
[✓] iOS toolchain - develop for iOS devices (Xcode 9.4.1)
[✓] Android Studio (version 3.2)
[✓] VS Code (version 1.27.2)
[✓] Connected devices (1 available)

• No issues found!

请告诉我,一个有效的解决方案!

【问题讨论】:

  • StreamTransformers 不是这样工作的。你需要先访问streamController
  • @RémiRousselet 您认为它真的是streamTransformer吗?我可以访问流控制器。在此示例中,我只是在接收器错误中添加了一个字符串。它应该可以工作,而且确实可以。我在我的数据中得到了字符串。我只是在问如何区分直接添加到接收器中的数据或添加为接收器中的错误。希望这能为你清除它!
  • 可惜我没有完全理解你的架构

标签: stream dart flutter listener


【解决方案1】:

您的听众在原始流上,而不是转换后的流上。

stream.transform() 的调用返回一个 流,它不会改变原始流,除了添加一个侦听器。

您需要textFieldStream.listen(...) 才能查看错误。

【讨论】:

    猜你喜欢
    • 2019-08-28
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2023-03-11
    • 2021-05-22
    • 2015-04-19
    相关资源
    最近更新 更多