Dart:流中的监听器永远不会触发 onError 函数
Dart: Listeners on stream never trigger onError function
我正在构建一个 flutter 应用程序并使用 Bloc。我在流的接收器上添加 sink.addError('some error text')
。
在 Bloc 中,我向流添加了一个侦听器,它具有 onDone
、onError
和 data
等功能。现在发生的是,我添加到接收器中的所有内容,甚至 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 结果:
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!
请告诉我一个有效的解决方案!
您的听众在原始 Stream 上,而不是转换后的 Stream。
调用 stream.transform()
returns 一个 new 流,除了添加一个侦听器外,它不会改变原始流。
您需要 textFieldStream.listen(...)
才能看到错误。
我正在构建一个 flutter 应用程序并使用 Bloc。我在流的接收器上添加 sink.addError('some error text')
。
在 Bloc 中,我向流添加了一个侦听器,它具有 onDone
、onError
和 data
等功能。现在发生的是,我添加到接收器中的所有内容,甚至 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 结果:
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!
请告诉我一个有效的解决方案!
您的听众在原始 Stream 上,而不是转换后的 Stream。
调用 stream.transform()
returns 一个 new 流,除了添加一个侦听器外,它不会改变原始流。
您需要 textFieldStream.listen(...)
才能看到错误。