Дарт: Как мне узнать длину стрима?

Я хочу получить длину потока BehaviorSubject, но не могу этого понять.

test('get stream length', ()async{
    BehaviorSubject<int> subject = new BehaviorSubject(seedValue: 0);

    var act = await subject.stream.length;

    expect(act, 1);
  }); 

Как мне получить такую ​​длину?


person taross    schedule 26.02.2019    source источник


Ответы (1)


Длину потока можно узнать только после его закрытия. Пока он не закрыт, всегда возможно, что будет добавлено другое событие.

https://api.dartlang.org/stable/2.1.1/dart-async/Stream/length.html

свойство длины

Future<int> length

Количество элементов в этом потоке.

Ожидает всех элементов этого потока. Когда этот поток заканчивается, возвращаемое будущее дополняется количеством элементов.

Если этот поток выдает ошибку, возвращаемое будущее завершается этой ошибкой, и обработка останавливается.

Эта операция прослушивает этот поток, и нешироковещательный поток не может быть повторно использован после определения его длины.

  test('get stream length', ()async{
    BehaviorSubject<int> subject = new BehaviorSubject(seedValue: 0);

    var actFuture = await subject.stream.length;
    await subject.close();

    expect(actFuture, completion(equals(1));
  }); 
person Günter Zöchbauer    schedule 26.02.2019
comment
Спасибо! Я хочу знать длину потока, чтобы получить последнее значение другого потока с помощью '' 'anotherStream.elementAt (length); '' ', разве это невозможно? Стоит ли попробовать другой путь? - person taross; 27.02.2019
comment
Вы не можете получить elementAt(x) из потока так легко. Что, если этот элемент уже был испущен ранее? Ручей похож на капающий кран. Вы заранее не знаете, сколько капель сойдет. Вы можете собирать капли (например, в List), а затем использовать их. Для вашего конкретного варианта использования могут быть более эффективные способы, но непонятно, чего именно вы пытаетесь достичь. - person Günter Zöchbauer; 27.02.2019
comment
О, я вижу. Спасибо. Это действительно легко понять. - person taross; 27.02.2019
comment
Я пытаюсь добавить ‹Something› к последнему элементу потока List ‹Something› в потоке ‹Something›, я хочу использовать его как снимок Firestore. Но, возможно, мне не следует использовать поток в потоке ... - person taross; 27.02.2019
comment
Пакет rxdart предоставляет множество функций для выполнения любых операций с потоками, но вам нужно изменить свое мышление. Поток - это не коллекция, это серия событий, растянутых на какое-то время или на бесконечное время. - person Günter Zöchbauer; 27.02.2019
comment
Ты прав. Мне надо выучить стрим ... Благодарю за совет. (и нашла combineLatest2 метод, попробую.) - person taross; 27.02.2019
comment
Существует специальный канал Gitter для rxdart gitter.im/ReactiveX/rxdart. - person Günter Zöchbauer; 27.02.2019