Dart: слушатели в потоке никогда не вызывают функцию onError - PullRequest
0 голосов
/ 08 ноября 2018

Я создаю приложение для флаттера и использую Bloc. Я добавляю sink.addError('some error text') в мойку потока.

В блоке я добавил слушателя в поток, который имеет такие функции, как onDone, onError и data. Теперь, что происходит, все, что я добавляю в сток, даже sink.addError классифицируется как данные, а не как ошибка. Я хочу выяснить, как дифференцировать данные, добавленные в сток, и ошибки, добавленные в сток .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!

Пожалуйста, дайте мне знать, правильное решение!

1 Ответ

0 голосов
/ 10 ноября 2018

Ваши слушатели находятся в исходном потоке, а не в преобразованном потоке.

Вызов stream.transform() возвращает новый поток, он не изменяет оригинал, за исключением добавления прослушивателя.

Вам нужно textFieldStream.listen(...), чтобы увидеть ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...