Как использовать Dart Stream


Что такое поток?

https://dart.dev/tutorials/language/streams

На официальном сайте указано.

  • Асинхронная серия выполнений.
  • Может также производить Ошибки.
  • Существует два типа потоков: одиночная подписка и трансляция.

Давайте выполним пример.

Future<int> sumStream(Stream<int> stream) async {
  var sum = 0;
  await for (final value in stream) {
    sum += value;
  }
  return sum;
}
Войдите в полноэкранный режим Выход из полноэкранного режима

Будущее (тип функции?) Продолжайте добавлять содержимое пара с ?
Если вы запустите функцию из main, вы увидите

void main() async {
  sumStream(10)
}
Войдите в полноэкранный режим Выход из полноэкранного режима
Error: The argument type 'int' can't be assigned to the parameter type 'Stream<int>'.
 - 'Stream' is from 'dart:async'.
  sumStream(10)
            ^
Error: Compilation failed.
Войдите в полноэкранный режим Выход из полноэкранного режима

В нем говорится, что функция не принимается, если она не является потоком.

Я думал, что нужно набирать его только как TS.
Stream + тип int и передать его в качестве аргумента.
Попробуйте передать его в качестве аргумента и выполнить его.

  var: Stream<int> number = 10;
Войдите в полноэкранный режим Выход из полноэкранного режима

Однако не удалось определить переменные с типом Stream.


Попробуйте создать StreamController

https://qiita.com/JunichiHashimoto/items/7ca7ec6cd2c9af0714eb

Я обнаружил, что можно использовать StreamController для создания переменной и поместить в нее содержимое с помощью sink.
Поместите в него содержимое с помощью раковины и выньте его с помощью ручья.
Содержимое помещается в него с помощью раковины и вынимается с помощью струи.

import 'dart:async';

main() {
  final controller = StreamController();
  controller.sink.add(1);
  controller.sink.add(2);
  controller.sink.add("Tidus");


  controller.stream.listen((value){
    print(value);
  });
}
Войдите в полноэкранный режим Выход из полноэкранного режима
1
2
Tidus
Войдите в полноэкранный режим Выход из полноэкранного режима

Операция была подтверждена с помощью DartPad.

Импортируя dart:async
Теперь можно использовать StreamController.

Это поток, поэтому он является переменной, но вы можете добавлять к нему все больше и больше переменных.
Тип может быть любым.

И когда вы слушаете steam.listen, он выводит их в том порядке, в котором вы их ввели.
Это можно интерпретировать таким образом.

Давайте рассмотрим асинхронную обработку функций.

https://qiita.com/JunichiHashimoto/items/7ca7ec6cd2c9af0714eb#stream%E3%82%92%E8%BF%94%E3%81%99%E9%96%A2%E6%95%B0%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

В той же статье объясняется асинхронная обработка функций.

Если вы добавите async* к функции, вы можете изменить аргумент, принимаемый с обычным int, на Stream в качестве возвращаемого значения, а также изменить аргумент, принимаемый с обычным int, на Feature в качестве возвращаемого значения.

Если вы добавите немаркированный async к функции, вы можете рассматривать аргументы, полученные Stream, как возвращаемое значение Feature.

Функция может быть интерпретирована как


Резюме

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

Переменные потока могут быть добавлены с помощью sink.

Когда вы нажимаете кнопку listen на переменной Stream, она выплевывает все свое содержимое.

Если вы создадите функцию Future, которая получает асинхронный поток с помощью async, она не будет работать, если вы передадите ей обычную переменную int или string.

Если вы создадите функцию Future в async*, которая преобразует переменную int или string в Stream, вы можете создать промежуточный патрубок, который может принимать int или string и преобразовывать их в Stream.

Оцените статью
devanswers.ru
Добавить комментарий