background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "Урок 15: "Основы Dart - асинхронность часть третья (Stream)"

input logo icon
Обложка аудиозаписи
Подождите немного, мы готовим ссылки для удобного просмотра видео без рекламы и его скачивания.
console placeholder icon
Теги видео
|

Теги видео

dart
flutter
async
await
stream
StreamController
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:03
сегодня я буду проводить его
00:00:05
1 но на самом деле мало что изменится
00:00:07
потому что мой друг мало участвует в
00:00:12
записях
00:00:13
итак сегодня будем продолжать тему
00:00:17
асинхронного выполнения и будем говорить
00:00:20
о стримах
00:00:21
они на самом деле не здесь документации
00:00:24
а где то вот тут находится кажется давно
00:00:28
the dark росинка синхронно ваши вот
00:00:31
стрим тут что-то про них немножко
00:00:33
написано прежде чем
00:00:36
непосредственную что-то показывать и
00:00:38
рассказывать им скатилась качества от
00:00:43
вернее не что а что такое стрим что это
00:00:47
не совсем вот трат блин запутано говорю
00:00:51
сейчас покажу вначале видео про синхрон
00:00:55
чину самом самом начале я говорил вам
00:00:57
что есть такое понятие как поток
00:00:59
процесса вот это все и тут интересный
00:01:01
момент что сейчас я буду рассказывать
00:01:03
пас простым
00:01:04
stream и она переводится на русский как
00:01:07
поток и здесь у кого-то может возникнуть
00:01:10
впечатление что именно про этот потоки
00:01:12
говорил вначале про эти потоки и типа
00:01:15
они позволяют обрабатывать код
00:01:16
одновременно на самом деле нет потому
00:01:19
что те потоки они
00:01:20
thread и это тоже переводится на русский
00:01:24
как поток такая вот интересная штука но
00:01:28
если вот эти thread'ы потоки они
00:01:31
позволяют действительно обрабатывать код
00:01:33
синхронно the stream выверни не
00:01:37
синхронно многопоточности выполнить код
00:01:39
одновременно два разных у спуска в одну
00:01:43
и ту же кинуть времени the stream не тут
00:01:45
такая же синхронная штука как и фича
00:01:47
только единственное что их там может
00:01:49
быть несколько что значит несколько я
00:01:51
потом покажу но пока что вот вы должны
00:01:53
понимать что это немножко не то то есть
00:01:56
три мы это не те потоки которые
00:01:58
позволяют код обрабатывать одновременно
00:02:01
вот теперь после такого дисплей мира
00:02:04
можно уже непосредственно переходить к
00:02:05
стримам они все там же автор kasing
00:02:07
библиотечки у нас определены не что это
00:02:10
такое мы разговаривали про фьючерсе и
00:02:14
выяснили что они позволяют отложить
00:02:16
выполнение какого-либо действия на
00:02:19
попозже там по времени или по завершению
00:02:21
какого-то результата например по
00:02:23
окончании загрузки из сети или
00:02:27
считывания файлы с диска и так далее но
00:02:30
ключевая особенность всех вич была в том
00:02:32
что они возвращают один результат пошли
00:02:34
в сеть вернули результат подождали 10
00:02:37
секунд получили результат цикл запросили
00:02:42
файл получили содержимое этого файла оно
00:02:44
всегда было одно но иногда у нас событий
00:02:48
таких может быть несколько вот например таймер
00:02:51
может быть то таймер запустим он будет
00:02:54
тикать пока мы его не выключил и здесь
00:02:58
уже нужно на другой инструмент работы с
00:02:59
этой синхрон чины и это как раз
00:03:02
потоки здесь я себе немножко подготовил
00:03:05
примеров потому что потоки это уже не
00:03:08
так просто чтобы быстрых накидывать вот
00:03:11
сейчас я вам объясню чтоб не было
00:03:14
непонятно типа человека откуда оно
00:03:15
взялось и так те самые потоки они стрелы
00:03:19
вот так вот они называются это класс как
00:03:23
всегда и он generic мы должны указать у
00:03:26
него что это за поток то есть какие
00:03:28
значения он будет проецировать пока что
00:03:31
пока что можно воспринимать стрим как
00:03:33
орель то есть вот если фьюче это просто
00:03:36
переменная то обычно и 1 значение от
00:03:39
ustream это массив который вот только во
00:03:42
времени разделён и его значения там
00:03:45
появляются не все сразу как мы себя
00:03:46
постепенно и так же как и массив он
00:03:49
может иметь какой-то тип
00:03:51
вот например вот этот стрим может
00:03:53
интерьера возвращать мог могли бы
00:03:55
поставить там динамик или общем не суть
00:03:58
важно ну я сделал в опциональным потому
00:04:00
что его пока еще не инициализировал пока
00:04:02
это просто переменная лицензирование
00:04:04
позже это собственно action я чуть
00:04:07
попозже расскажу что это такое и так вот
00:04:10
типа риса например это
00:04:12
пока я уберу и пройдусь по вот этому
00:04:14
коду стримы тоже на класс мы посмотрели
00:04:18
можно создавать различными способами
00:04:20
милых редкость создают вот так это
00:04:24
просто пример вообще можно так не знаю
00:04:27
здесь мы не посмотрим конечно это тут у
00:04:31
меня есть немножко примеров из
00:04:33
конструкторов то есть у него много
00:04:34
конструкторов ustream a stream можно
00:04:36
создать просто стрим ничего делать не
00:04:39
будет ничего не будет возвращать можно
00:04:41
пустой стрим создать по сути это 2
00:04:43
эквивалентные команда s3 мы стремимся
00:04:45
как правило тоже нигде не используется
00:04:48
стрим который содержит одну ошибку тоже
00:04:51
не приходилось мне когда использовать но
00:04:53
возможно это полезно это пока мы опустим
00:04:56
string с фича
00:04:59
то есть можно из окна фичи сделать стрим
00:05:01
тоже возможно иногда для склейки
00:05:03
некоторых участках кода стрим с
00:05:06
нескольких вич опять же для склейки
00:05:09
некоторых участках кода либо для более
00:05:11
удобной обработки этих вещь ну и так
00:05:13
далее тут вот всякое разное может быть
00:05:15
вот стрим который просто одно значение в
00:05:19
себе будет содержать и вот мы
00:05:20
использовали стрим periodic это можно
00:05:23
сказать что таймер то есть вот этот
00:05:25
стрим будет проецировать события с
00:05:28
периодичностью от которой мы тут ему
00:05:30
указали решен и здесь и указал что одну секунду
00:05:33
а здесь что он будет возвращать вот как
00:05:36
бы сюда падает ему переменная как и
00:05:38
сколько раз он уже текло я назвал и
00:05:41
youtube можно назвать подругому и вы
00:05:43
могли бы как-нибудь это обработать чтоб
00:05:45
значение было какое-то другое на нам
00:05:46
здесь intercharm достаточно вот мы
00:05:48
создали стрим окей стрим у нас есть что
00:05:51
с ним можно теперь и интересного сделать
00:05:52
но самое распространенное действие
00:05:56
которое делается со стримами это
00:05:58
подписка на них то есть вот помните
00:06:00
когда мы писали все еще какое-нибудь ну
00:06:04
вот у меня здесь фьючерс
00:06:08
еще долей например мы писали в неё да и
00:06:11
land исполнялся когда всё ещё получала
00:06:15
свое значение просто вроде бы да
00:06:17
учитывая что мы это разобрали а здесь
00:06:20
немножко другая технология у нас есть
00:06:21
стрим вот этот вот и у него есть метод
00:06:24
лесам что он делает каждый раз когда в
00:06:28
стриме появляется значение а я сказал
00:06:30
что их там может быть много со временем
00:06:33
они там появляются выполняется вот это
00:06:36
будет замыкание ну и в нем всего лишь
00:06:39
при не стоит обычный вот что еще нужно
00:06:42
показать но через какое-то время через
00:06:44
10 секунд я этот стрим завершаем
00:06:47
subscription вернее через концу ну пока
00:06:50
это можно убрать чтоб она не слушал
00:06:53
минимальный набор вот так вот то есть мы
00:06:55
создали стрим но просто для примера вот
00:06:59
этим таймером и стриме создали и
00:07:01
подписались на него теперь запускаем
00:07:04
этот пример
00:07:05
и видим в консоли вот исполнилось вам-то
00:07:08
а потом пошли циферки ноль один два три
00:07:12
четыре но и она будет тикать так сколько
00:07:15
угодно и они здесь появляются как раз в
00:07:18
период
00:07:19
вот этот период раз в секунду в может
00:07:23
быть несколько непонятно но пока что
00:07:25
stream и я говорю это аналог массива в
00:07:28
котором значение появляются не сразу и
00:07:31
если массив хранил все свои значения кто
00:07:34
здесь они выпадают
00:07:36
можно просматривать стрим как трубу то
00:07:39
есть представьте вы сделали такую трубу
00:07:41
вот это вот стрим и вы просто с одного
00:07:44
края этой трубы кидаете что-то из
00:07:46
другого она выпадает вот там где
00:07:50
выпадает вы делаете леса на ловите эти
00:07:52
события
00:07:54
забрасываете букета в зависимости от
00:07:56
контекста мы сейчас разберем какие
00:07:58
способы ездить забрасывания и какие есть
00:08:01
способы ловли из этой трубы вопрос
00:08:05
вы может возникнуть зачем все это нужно
00:08:07
но какие говорю это для того чтобы
00:08:09
обрабатывать последовательность событий
00:08:11
которая может происходить во времени то
00:08:13
есть не сразу все за раз иначе мы
00:08:15
использовали массив а именно во времени
00:08:17
например таймер он там с некоторой
00:08:19
периодичностью имеет что еще может быть
00:08:22
например мы можем так ловить не знаю
00:08:27
например нажатие кнопочки на в камере
00:08:31
представьте мы написали камеру смотрим
00:08:33
где искать или пользователь может нажать
00:08:35
сфотографировать в этот момент нам
00:08:37
фотографию упадет потом через какое то
00:08:39
время пользователь еще нажмет нам снова
00:08:41
фотографий упадет и мы как бы эти
00:08:43
события будем постоянно ловите
00:08:45
обрабатывать пока согласен может быть не
00:08:47
понятно но в дальнейшем на практике
00:08:50
думаю мы это крутим и так что можно
00:08:54
сделать но ты говорю самое простое это
00:08:57
есть stream и мы этот стрим обрабатываем
00:08:59
следующая история это правда субстанций
00:09:03
просто так прослушивать я даже не знаю
00:09:06
здесь она наверное в этом базовом
00:09:07
примере продолжит работать если я напишу
00:09:10
вот так но не всегда это будет работать
00:09:13
в реальных приложениях потому что просто
00:09:15
субскрайб шин пропадет и мы им управлять
00:09:17
не сможем а нам хочется им управлять
00:09:19
всегда нужно управлять этой подпиской в
00:09:21
реальных приложениях чтобы не бросить и
00:09:24
есть если его просто так бросить она
00:09:26
может вечно тикать и отжирать рисуюсь
00:09:29
ресурсы управления поэтому вот этот вот
00:09:31
ли сам метод
00:09:33
вот если вы посмотрите на его сигнатуру
00:09:35
то увидите что вот он возвращает стрим
00:09:37
субскрайб шим того же типа что и события
00:09:39
он rip радиусе создал еще одну
00:09:42
переменную как раз этого типа string
00:09:44
заносит римской общины доджер и как
00:09:47
только я подписался
00:09:49
я этот результат сюда положил зачем это
00:09:51
нужно подпиской как я уже говорю можно
00:09:53
управлять самый такой вариант это
00:09:56
сделать просто суп скорейшем концу когда
00:10:00
оно больше не нужно то есть если мы
00:10:01
больше не хотим получать эти события мы
00:10:05
конце ли мы ее и все они она больше вот
00:10:07
вот этот лист на сразу отключается от
00:10:09
снимает больше не ловят события
00:10:12
но если я сейчас вот так напишу то мы
00:10:14
ничего просто в консоли мы увидим ванду
00:10:17
и все почему потому что мы отписали
00:10:19
списке сразу же как только подписались и
00:10:22
ни один овен не успел к нам залететь
00:10:25
поэтому чтобы увидеть эффект нужно
00:10:28
отписаться не сразу чуть попозже давайте
00:10:31
я воспользуюсь уже знакомый на пью 4 и
00:10:33
через 10 секунд я как раз выполнил вот
00:10:36
это действие субскрайб концу запускаем и
00:10:40
вот 012
00:10:42
ну так как у нас события раз в секунду
00:10:44
отписывайся через 10 секунд и у нас тут
00:10:46
девяточка последняя должна будет быть
00:10:49
все как я и сказал 10 секунд прошло и мы
00:10:54
писались и сразу же события в консоли
00:10:56
перестали к нам попадать вот такая вот
00:10:59
базовая штука что ещё можно сделать по
00:11:04
управлению собственном давайте уже раз
00:11:07
уж мы концу рассмотрю
00:11:08
рассмотрим все все до конца и я запишу
00:11:14
еще вот сюда вот несколько функций и
00:11:17
тоже всех фьючер будут они чтобы не
00:11:20
сразу выполняться
00:11:21
подписку субскрайб шин можно еще ставить
00:11:24
на паузу и возобновлять ее работу
00:11:27
paused концы принципиально отличается
00:11:30
концов это значит все прекратить с
00:11:32
концами то есть вот концу субстанция она
00:11:35
все он останавливается и будет внизу
00:11:36
обновляемая паузы это значит что мы
00:11:39
временно приостановили прослушивание и в
00:11:41
дальнейшем мы можем его возобновить
00:11:44
через рисуем и так тот же самый стрим
00:11:46
как вы видите ничего здесь не менял так
00:11:49
тот же субскрайб шим меняется только вот
00:11:51
этот код опять же фьючер
00:11:53
через 5 секунд после начала всего этого
00:11:57
дела я поставлю на паузу
00:11:59
через 10 секунд я дернул прослушиванию
00:12:02
нужны review и через 15 сделают конца
00:12:07
смотрим опять же ноль один два три
00:12:12
четыре все вот пришло десять пять секунд
00:12:15
мы стоим на паузе
00:12:18
сейчас 5 секунд и стекле и мы продолжаем
00:12:20
пять шесть семь восемь все но успела
00:12:24
чуть поменьше теперь будете событий но
00:12:26
не суть важно главное что вот видите
00:12:29
давайте разберем это как часто нам
00:12:32
пригодится
00:12:33
со стримом эти операции проводить как я
00:12:37
сказал лесам это самая частая операция
00:12:39
стримы вообще очень часто встречаются в
00:12:42
программировании на flattery то есть они
00:12:45
постоянно окружают нас и работать с ними
00:12:47
придется или самой часто операции то
00:12:52
есть если у вас есть trim вам нужно его
00:12:53
слушать это обязательно иначе непонятно
00:12:55
зачем вам стрим вообще тогда нужен
00:12:57
пауз и рисуем это редкий операцию то
00:13:01
есть они конечно же необходим бывают
00:13:03
полезны в тех или иных ситуациях но не
00:13:06
так часто вот дальше что здесь и council
00:13:12
концу тоже очень часто операциям то есть
00:13:14
если вы подписались на подписочку
00:13:16
где-нибудь ну например вот крыльевые
00:13:18
красками с камеры и подписались на
00:13:21
события что фотка пришло то конечно же
00:13:24
когда вы этот экран закрываете вам
00:13:26
обязательно нужно будет субскрайб концу
00:13:28
чтобы освободить его такие ресурсы и
00:13:32
прекратить эту подписку на вот такие вот
00:13:36
дела мы можем делать с этими самыми
00:13:38
стримами давайте пойдем дальше что еще
00:13:42
интересного можно сделать когда-то
00:13:45
как-то я вчера говорил про
00:13:47
осинка white но не вчера на прошлом
00:13:50
уроке я сказал что она работает еще и со
00:13:53
стримами с массивом форм и действительно
00:13:56
мы можем переписать наш пример вот так
00:13:59
вот сейчас я прям скопируем все было
00:14:03
закинуть сюда вот все тот же наш стрим
00:14:09
тут ничего не поменялось только здесь
00:14:11
вот теперь вместо
00:14:14
ли сама стоит avoid то есть мы ожидали
00:14:18
он мне сейчас показывает ошибку почему
00:14:20
потому что это работает только функциях
00:14:22
помечены хостинг разумеется вот теперь
00:14:25
наша функция синхронный теперь мы можем
00:14:27
вот работать и стримом как с обычным
00:14:29
массивом с помощью функции for то есть
00:14:32
вот наш стрим и все поставилось писатель
00:14:34
знак потому что она канал по хорошему
00:14:36
нужно было бы проверить что он мил вот
00:14:38
так в продакшене писать никогда нельзя
00:14:40
нам здесь сойдет и так я беру stream и
00:14:43
просто осин хроника перебираю каждый
00:14:46
элемент то есть каждый виток вот здесь
00:14:48
вот это не сразу все сработает
00:14:50
срабатывать вот этот код будет именно
00:14:52
когда об стриме будет появляться новое
00:14:55
значение и также через 10 секунд я
00:14:59
субскрайб шина браво
00:15:01
проверяем что все работают 2012 и так
00:15:06
далее сейчас до 10 идет об
00:15:16
идет дальше почему она идет дальше здесь
00:15:20
наверное все удивились а все дело в том
00:15:23
что я останавливаюсь об ставшим но
00:15:27
посмотрите внимательно где-нибудь я
00:15:30
присваиваю его то есть он используется
00:15:31
только в двухместных объявления
00:15:33
переменной и концу на самом деле
00:15:36
субскрайб шим я ничего не присваивают то
00:15:38
есть обед он вот вот этот вот синтаксис
00:15:41
for a white
00:15:42
он не генерируется по skype шину на его
00:15:44
не возвращает а значит мы его не можем
00:15:45
положить а значит мы не можем управлять
00:15:48
таким образом получается ситуации что
00:15:51
вот вот такой способ он вечный он будет
00:15:54
работать пока будет работать stream и
00:15:57
это иногда это то что нам подходит
00:16:00
иногда это то что нам нужно например
00:16:02
если мы знаем что стрим скоро завершится
00:16:05
стримы кстати можно завершать сам чуть
00:16:08
позже покажу как это сделать да без
00:16:12
завершения субскрайб шину и так далее но
00:16:14
в целом нужно быть аккуратным под этой
00:16:17
штукой красиво выглядит да но контроля
00:16:21
меньше потому что мы не можем суп
00:16:23
стоявший получить ну и плюс здесь если
00:16:26
посмотреть внимательно давайте я еще раз
00:16:28
перезапущу то поведение опять же
00:16:30
поменялось все функции вот мы видим в
00:16:33
консоли want u
00:16:34
но мы не видим фри и не увидим никогда
00:16:36
free почему потому что функция теперь
00:16:38
асинхронной вот на вот этом моменте она
00:16:40
останавливается ждет события и грубо
00:16:43
говоря пока наш стримлю завершится мы
00:16:45
сюда никогда не перейдем вот этот код в
00:16:48
принципе не исполнится часто это не то
00:16:50
чтобы вы видите и вот так то работает
00:16:54
здесь нужно сделать небольшую ремарку я
00:16:57
очень люблю осинка override при работе с
00:16:59
ключами но не очень их люблю при работе
00:17:03
с со стримами
00:17:04
это вкусовщина понятное дело то есть вы
00:17:07
можете иметь другое мнение но тем не
00:17:10
менее мне кажется что это не лучший
00:17:12
синтаксис опять же повторюсь это
00:17:14
вкусовщина вы можете выработать свое
00:17:16
мнение
00:17:17
этот счет ok посмотрели что теперь со
00:17:20
стримами можно и так работать что еще
00:17:21
посмотрим системе стримы давайте такой
00:17:26
пример сейчас напишу вот этот вот
00:17:32
использую нет ни вот этот а самый самый
00:17:35
первый пример верну
00:17:38
самый первый пример стрим subscription
00:17:41
создаем stream подписываемся на него
00:17:44
чтобы слушать через 10 секунд
00:17:46
останавливаем прослушивания запускаем
00:17:48
убеждаемся что он работает именно так
00:17:50
как мои планировали она идет сейчас там
00:17:55
на девятке опять и становится общего
00:17:59
замечательно все работает можно ли этот
00:18:02
стрим прослушивать два раза давайте я не
00:18:05
знаю попробую еще scion
00:18:07
subscription винта написать тут
00:18:10
subscription 2 написать соответственно
00:18:13
здесь все поправить здесь поправить
00:18:16
здесь первый subscription мы
00:18:18
останавливаем не должны строить стараюсь
00:18:20
ослепшим давайте попробуем и мы получаем
00:18:25
ошибку
00:18:26
нельзя один и тот же стрим прослушивать
00:18:29
дважды
00:18:30
стрим has already разбились in the grid
00:18:33
что уже уже прослушивание стрима идет
00:18:35
строилась мы не можем подписаться здесь
00:18:37
конечно не очень понятно вообще зачем я
00:18:39
начал об этом говорить но типа какой в
00:18:41
этом смысл подписываться на стрим дважды
00:18:44
вот здесь в реальных приложениях смысл
00:18:46
от этого очень даже запросто может быть
00:18:49
представьте что у вас есть некое событие
00:18:52
например вот стрим который возвращает
00:18:54
авторизован ли пользователь
00:18:55
то есть изменения и туда падает там 0
00:18:59
повторюсь не авторизован один
00:19:00
авторизован зачем это может понадобиться
00:19:02
делать ну например наше приложение
00:19:04
там имеет срок годности авторизации и к
00:19:08
примеру там после входа через какое то
00:19:10
время но
00:19:11
де авторизовываться там банковское
00:19:13
приложение чтобы значит не храме
00:19:15
сохранять авторизацию это время
00:19:17
выкидываем оттуда и вот мы это события
00:19:19
ловим чтоб там не знаю как то на это
00:19:21
отреагировать показать экран авторизации
00:19:23
пользователю и так далее и вполне
00:19:25
возможно что эту штуку нужно в
00:19:27
нескольких местах показывает там
00:19:29
неправильно на каждом экране как-то
00:19:30
обрабатывать тогда стрим может быть 1-а
00:19:33
подписываться мы можем на него куча
00:19:35
разных мест чтобы это событие ловить так
00:19:37
что делать если нам все-таки хочется
00:19:42
значит получить этот результат
00:19:45
подписаться на него два раза все очень
00:19:48
просто нужно вот здесь добавить сброд к
00:19:51
stream то есть мы берем возвращаем стрим
00:19:53
обычный вот этот вот метод и в него
00:19:55
вызываем метод а сброд костре ну можно
00:19:58
конечно сделать и так более красивым
00:20:02
способом что стрима разброд к стрим
00:20:05
написать так так тоже понятно что она
00:20:08
всё продолжает работать то есть мы
00:20:11
сначала обычный стрим создали
00:20:13
тут лишний а потом не создали его же
00:20:17
бродкаст версию но это просто чтобы
00:20:20
понятно было написал сейчас я вот так
00:20:22
напишу в одну строку
00:20:23
окей теперь он наш стрим бродкасты что
00:20:26
значит бродкаст это то что на него можно
00:20:28
подписываться много раз и теперь мы
00:20:31
видим в консоли 001 122 3344 то есть
00:20:36
каждая цифра к обрабатывается два раза
00:20:38
потому что она сначала обрабатывается
00:20:40
одним или синдром и тут же
00:20:42
обрабатывается вторым лесникам таким
00:20:45
образом вот на стримы можно
00:20:46
подписываться из разных мест если они
00:20:48
имеют тип бродкаст если не имеют можно
00:20:52
всегда сделать из обычного стримом
00:20:54
провод к стрим не пользоваться
00:21:05
и чихнул так продолжаем здесь смотреть
00:21:10
это более крутой пример писал себе так
00:21:14
стрима вы это мы прошли вот провод каст
00:21:19
что здесь получается но абсолютно тот же
00:21:22
пример совсем тот же только название
00:21:25
более правильные subscription muons
00:21:26
absolution ту все-таки цифры в названиях
00:21:29
переменных использовать не хорошая идея
00:21:31
и вот здесь в принтах добавлено тоже
00:21:35
какой-никакой какой лесами выводит
00:21:39
сейчас консоль ну это же самое абсолютно
00:21:41
только теперь видно что это суп sky
00:21:43
оборванцем скрайбер тусонской оборванцем
00:21:45
scrubber ту все на этом тоже заострять
00:21:49
внимание не будем пойдем дальше что еще
00:21:51
можно рассказать про стримы
00:21:55
[музыка]
00:21:57
да давайте посмотрим еще один пример тот
00:22:01
же самый бродкаст только на этот раз с
00:22:03
советами копирую все это дело вот наш
00:22:08
исходный пример бродкасты subscribe
00:22:10
и вот ли сами делаем вставляю все тоже
00:22:14
самое также мы собственно кем селим но
00:22:17
как-то знаете уже awake
00:22:19
сараево никакого отношения не имеет их
00:22:21
можно даже удалить
00:22:22
давайте тоже удалю что под у вас не
00:22:24
случалось вот этот код теперь у нас
00:22:26
никак не affected ничего тот же самый
00:22:29
стрим тип также он брал каст как в
00:22:32
предыдущем примере только теперь мы вот
00:22:34
об этом и мы рассматриваем давайте
00:22:36
посмотрим что будет теперь и мы видим
00:22:39
что у нас срабатывает только один print
00:22:42
почему не два
00:22:44
возникнет у вас вопрос его почему только
00:22:46
один вид стрим бродкаст все правильно
00:22:48
все как мы сказали а все дело в том вот
00:22:51
что все все в той же технология работы
00:22:55
away the он не идет дальше по коду пока
00:22:59
работает соответственно вот этот стрим
00:23:04
пока стрим живой пока он не завершится
00:23:07
пока он не завершится да мы его слушаем
00:23:11
не переходим к следующему году то есть
00:23:13
там вот и free нету в консоли если вы
00:23:15
посмотрите танк где этот пример начался
00:23:19
в ubuntu и все и мы застряли и застрелим
00:23:22
навечно дальше не пойдем так что тут
00:23:25
тоже нужно быть аккуратным конечно это
00:23:28
не значит что справка стримами нельзя
00:23:30
работать через awake
00:23:32
они могли бы быть в разных местах в
00:23:34
разных местах они бы работали
00:23:35
замечательно можно даже переписать
00:23:38
немножко этот пример тогда вот так вот
00:23:40
фанк одни фондов пусть будет куча воет
00:23:51
так рисом вам честно пишу функцию что
00:23:59
она будет делать а нам вы должно быть
00:24:01
асинхронная сама по себе и она будет вот
00:24:04
как раз через такой awake слушать
00:24:07
наш стрим и делаю точно такую же функцию
00:24:11
2 ну и собственно говоря продолжаю
00:24:18
слушать наш стрим и здесь здесь я умей
00:24:21
на uber алиасинг то есть main теперь
00:24:23
наша обычная функция она ничего не ждет
00:24:26
совсем нечего и
00:24:29
подписываюсь и санбан песенки
00:24:36
теперь смотрите в чем главное отличие
00:24:39
main теперь обычной асинхронная функция
00:24:41
она ничего не ждет асинхронные функции
00:24:43
именно вот эти две каждая из них
00:24:45
асинхронным поэт так как main ничего не
00:24:48
ждет он будет выполнять каждую строку
00:24:51
эту выполнит эту еду а вот уже внутри
00:24:53
этих функций начнется прослушивания так
00:24:58
остановим очистим консоль
00:25:00
запустить 001 1223 344
00:25:09
все замечательно тоже работает только
00:25:11
нужно вот осинка в этом аккурат не
00:25:14
понимать как они меняют работу функции
00:25:17
и так далее чтобы вот не попадать в
00:25:19
просак какой-нибудь муки с этим тоже
00:25:22
разобрались
00:25:23
пойдем дальше я вам уже сказал что
00:25:27
стримы можно создавать по-разному и так
00:25:29
обычно редко делают но если вам нужен
00:25:32
прям таймер то можно воспользоваться и
00:25:34
так это не является какой-то плохой
00:25:36
тракт так там практикой создавать стримы
00:25:38
через периоде просто как правило одни не
00:25:41
нужны именно такие нужно что-нибудь
00:25:43
другое то есть триумф который вот мы
00:25:46
реально можем класть какие-то наши
00:25:48
событие как я уже объяснял труба что-то
00:25:50
кладем что-то здесь выпадает моя-то
00:25:53
ловим обрабатываем там через a weight
00:25:55
for или через ли сон то есть тоже
00:25:58
обрабатываем и сейчас у нас в клала сюда
00:26:02
вот стрим periodic создавал таймер
00:26:03
который туда раз в секунду закидывал
00:26:05
события а соответственно они тут папа
00:26:08
далее мы их ловили
00:26:09
теперь мы хотели бы больше контролем
00:26:11
получить и для этого мы воспользуемся
00:26:14
вот такой вот штукой давайте опять
00:26:18
пример скопирую и буду разбирать его по
00:26:22
частям мы будем
00:26:27
воспользуемся такой штукой как stream
00:26:29
controller stream controller этот класс
00:26:32
он тоже generic как вы уже догадались
00:26:35
потому что видит кисти сент он вот этот
00:26:38
джон тип указывают на то какие опять же
00:26:42
данные будут нашим стриме stream
00:26:44
controller это не стрим вот это тоже
00:26:47
важный момент который нужно запомнить
00:26:49
эта штука которая может управлять
00:26:51
стримом то есть до этого опять же
00:26:54
представляем труба у нас вот такая вот
00:26:56
можно вот это как трубу предстоит мы
00:26:59
закидывали сюда тут ловили изначально мы
00:27:01
создали тут таймер он всегда кидал все
00:27:04
больше мы к этому таймерами как получить
00:27:06
доступ не могли теперь у нас есть
00:27:08
контроллер кроме ту ну я не знаю что
00:27:11
можно выступить показать в качестве
00:27:13
контроллера наверное
00:27:15
хорошо показал теперь у нас есть stream
00:27:18
controller
00:27:19
теннисом стрима то контроллер он вот так
00:27:22
как подсоединяется к нему тут эту труба
00:27:24
и теперь контроллер который управляем мы
00:27:27
мы в контроллер и можем сказать новых
00:27:31
как сказать визуализирует нажатием
00:27:34
кнопки то есть мой контроллер и жмем
00:27:36
кнопку и контроллер кидает стриме винт
00:27:39
начнем другую кнопку там другой
00:27:41
кидается и здесь так же попадается и
00:27:43
также продолжаем ловить замечательно
00:27:46
замечательно теперь вот то есть три
00:27:48
контроллер это не стрим эта штука чтобы
00:27:50
иметь возможность что-то в stream
00:27:52
накидывать по необходимости также все
00:27:55
знакомые нам subscription и правда
00:27:57
достаточно уже 1 для этого примера вот
00:28:00
мы создали контроллер и теперь смотреть
00:28:02
имея контроллер не мы можем вызывать у
00:28:04
него метод от и добавлять туда значение
00:28:07
так как это с тем контроллер типа
00:28:10
интеджер мы добавляем туда цифр вот я
00:28:12
добавляю 1 2 3 4 5
00:28:15
вот пять добавил дальше добавлять на
00:28:19
хорошо как их ловить ustream контроллера
00:28:22
есть свойство stream и вот это тот стрим
00:28:25
который мы только что рассматривали вот
00:28:26
это уже тот самый steam т.е. stream
00:28:28
controller держит street мы на него
00:28:30
подписываемся на этот стрим все как и
00:28:32
раньше то есть метод леса и выводим
00:28:36
принт в консольных дальше еще мы
00:28:37
захотели еще добавили несколько событий
00:28:39
6 7 8 9 10
00:28:42
соответственно в конце нам нужно что то
00:28:45
с этим сделать также через 10 секунд я
00:28:49
останавливаюсь abstraction концом это
00:28:52
вам знакомо и я закрываю контролю то
00:28:55
есть контроллер позволяет еще есть там
00:28:57
стрим закрыть то есть сначала я
00:28:59
остановил подписку потом я закрываю
00:29:02
контроллеры говорю все больше там ты не
00:29:04
нужен никаких событий мы тебя не
00:29:06
докидываем соответственно все больше то
00:29:10
есть трубу демонтируем и убираем больше
00:29:13
она работать не будет вот такая вот
00:29:15
история запускаем смотрим что у нас
00:29:17
консоли
00:29:20
long time free и вот 123 все 10 событий
00:29:26
вылетели сюда
00:29:27
программа еще работает вот 10 секунд
00:29:29
закончилась соответственно все закрылось
00:29:31
замечательно интересный момент такой
00:29:36
давайте я сделаю еще вот вот так вот
00:29:38
сейчас вот здесь вот через 10 секунд я
00:29:41
добавлю 11 посмотрим что будет ну и
00:29:45
давайте я не 10 а три секунды поставлю
00:29:48
побыстрее тем более у нас тут без
00:29:49
задержки все закидывается 10 и вот
00:29:53
проходит 3 секунды добавляется 11 но мы
00:29:58
уже ее не успеваем увидеть нам почему
00:30:01
потому что концом тут же козлит
00:30:04
субскрайб и она просто не успевает
00:30:06
долететь контроллеры же синхронная все
00:30:09
приколы синхронности и пока он там вот в
00:30:12
трубу помещается и начинает через неё
00:30:14
проваливаться мы делаем концу тут
00:30:17
следует сказать что на самом деле там
00:30:18
есть хитрый механизм который называется
00:30:21
even клуб но я приняла специально ничего
00:30:24
не говорил и я думаю что для старта это
00:30:28
не нужно то есть не то что не нужно это
00:30:32
очень полезной информации знать
00:30:33
правильный клуб но пока что можно
00:30:35
обойтись без нее поэтому я упрощаю и вот
00:30:38
говорю что пока летит в трубе
00:30:41
соответственно мы делаем концу многие
00:30:43
работают что если мы добавим сюда
00:30:45
двенадцать
00:30:46
посмотрим то есть мы теперь погасить
00:30:50
субскрайб шим еще контроллер живой мы
00:30:52
добавляли 12 по идее ничего не должно
00:30:55
измениться эффект будет точно такой же
00:30:57
да все хорошо работает и теперь в конце
00:31:00
помещаю добавляют 13 уже после того как
00:31:03
закрыл контролем то есть все контроллер
00:31:05
закрыт тупо демонтирована
00:31:07
добавляю 13 и получаю ошибку он говорит
00:31:13
что нельзя добавлять события после того
00:31:15
как контроллер прекратил свою работу
00:31:17
потому что после того как мы его закрыли
00:31:19
вот с этим тоже нужно быть аккуратным
00:31:22
закон закрытый контроллер больше
00:31:25
ивенты не докидываем контроллер обычно
00:31:28
закрывают именно тогда когда вам не
00:31:30
нужно все мы поработали такие события
00:31:32
туда покидали больше работать не хотим
00:31:35
гарантированно делаем клаус
00:31:38
так что еще интересного еще сюда
00:31:41
добавить можно так чем например а
00:31:48
следующий пример как вы понимаете вы
00:31:51
наверное обратили внимание что я здесь
00:31:53
сделал часть адов до того как подписался
00:31:56
на лису и тем не менее они не пропали
00:31:59
вот они в консоли как были так и есть 1
00:32:02
2 3
00:32:03
а часть я сделал после того как
00:32:05
подписался
00:32:06
это тоже такая особенность стримов если
00:32:09
в него что-то стрим закинули до того как
00:32:11
произошла первая подписка
00:32:13
это никуда не теряется это стою это
00:32:16
копится в стремя то есть вот та же
00:32:18
история вот наша труба
00:32:19
мы сюда что-то кидаем кидаем кидаем а
00:32:22
тут пока не слушаем нет леса на то есть
00:32:25
отсутствие леса на можно рассматривать
00:32:27
как заглушку то есть вот заглушка стоит
00:32:29
мы в трубу события докидываем они просто
00:32:32
в ней копятся труба безразмерная капица
00:32:34
может сколько угодно пока память на
00:32:36
устройстве не закончится как только мы
00:32:39
подписываемся то есть добавляем лесу
00:32:41
сразу же заглушку убирается вместо нее
00:32:43
подставляется леса но он вот все что
00:32:46
накопилось в трубе проваливается и мы
00:32:48
соответственно и кевин ты можем поймать
00:32:50
и обработать то есть не нужно бояться
00:32:52
вот до того как вы подписались
00:32:54
наши события в контроллер можно
00:32:57
закидывать они не пропадут ну и
00:32:58
соответственно то что мы после закинули
00:33:00
тоже никуда не пропала и вышла в этот
00:33:03
контроллер все замечательно и порядок
00:33:06
гарантирую то есть вот важно мы
00:33:08
закидывали 12345 и выходила она нам тоже
00:33:13
123456 хоть во времени это и разнесено
00:33:16
то есть еще раз повторяюсь все то есть
00:33:18
контроль работает асинхронный брались не
00:33:21
срабатывает не сразу же
00:33:22
а через какое-то время поэтому вот у нас
00:33:24
сначала там в три срабатывает вы видите
00:33:27
ван ту фри и только потом у нас вот
00:33:30
срабатывают вот эти вот единицы то есть
00:33:32
это происходит через какое-то время
00:33:34
но тем ни менее порядок гарантируется
00:33:37
если вы сначала добавили 1 а потом два
00:33:40
то и в ли сын они попадут ровней
00:33:43
не сразу через какое то время но порядок
00:33:45
быть тоже сначала 1 потом два
00:33:47
этого geely знак без железобетонное
00:33:50
правило но дальше есть одна один
00:33:53
интересный момент в лесу они попадают
00:33:56
ровно в том порядке в котором мы их
00:33:58
отправили как я сказал
00:33:59
тут все работает хорошо но вот сам ли
00:34:03
сон можно сделать пока мы пока он вот
00:34:05
такой синхронный то он и обрабатывает их
00:34:07
по порядку ну понятное дело синхронная
00:34:09
функция сначала одна закончилась потом
00:34:11
вторая и так далее но если мы сделаем
00:34:13
лесам асинхронным то вот вот эта вот
00:34:16
функция уже она может выполняться не по
00:34:19
порядку почему потому что как это как
00:34:22
вам объяснить вот мы накидали в трубу с
00:34:25
этих событий они провалились а мы их вот
00:34:28
в ли сон ловим сразу же как и не
00:34:30
выпадают то есть 1 2 3 4 5 6 этом и так
00:34:33
далее но
00:34:34
весам содержит функцию которую он будет
00:34:37
запускать запустит он эту функцию сразу
00:34:39
же по порядку но функция может быть и
00:34:42
синхронный и соответственно оно само по
00:34:44
себе оно уже все она уже запустилась
00:34:47
дальше стрим или сам никак ее не
00:34:51
ограничиваю танцев главно запустить а
00:34:53
как оно там будет выполняться им уже все
00:34:55
равно и вот если функция синхронная и
00:34:57
они выполняются разные разные промежутки
00:35:00
времени то результат мы от них получим
00:35:03
через разные промежутки времени смотрите
00:35:05
я сделал функцию синхронной и если у
00:35:08
меня четные элементы прилетают тут же
00:35:11
12345 и вот если элемент чет не прилетел
00:35:14
то я внутри делаю задержку на 2 секунды
00:35:17
и только потом пред если элемент
00:35:20
нечетный то я сразу делаю print и вот
00:35:22
сейчас и увидите что мы получим
00:35:26
результатами по порядку запускаю вот
00:35:30
сначала 13 13 5 так а чё тут пример там
00:35:36
и остался я добавляю события после того
00:35:39
как закрыл контроллер так это убираю еще
00:35:41
раз запускаем уже без всяких ошибок
00:35:44
вот 1357 9 и только потом
00:35:48
два-четыре-шесть-восемь-десять
00:35:49
вот это тоже важно учитывать то есть 3
00:35:52
контрольных работ сохраняет порядок
00:35:54
добавления лис он запускает свою функцию
00:35:57
в порядке добавления сама функция
00:35:59
которая находится внутри внутри леса на
00:36:02
может занимать уже какое-то разный
00:36:04
промежуток времени и соответственно если
00:36:06
она синхронна и то они уже могут
00:36:09
выполнять не по порядку то есть 2
00:36:12
обработчик второго элементов в
00:36:14
контроллере может начаться раньше чем
00:36:17
завершится обработчик первое это важный
00:36:20
момент про него нужно обязательно
00:36:22
помнить так что еще осталось а ну и
00:36:26
последний пример он достаточно простой
00:36:29
из заготовленных мной ранее
00:36:33
это про то что в контроллере вот у нас
00:36:36
есть три мы уже видели мы можем его тоже
00:36:41
сделать а сброд костре блоки сохранил в
00:36:43
переменную и под тоже подписаться на
00:36:46
него из нескольких мест это не
00:36:48
возбраняется соответственно если еще
00:36:50
запущу этот пример то повторится просто
00:36:53
вывод в консоль и вот все события про
00:36:57
дублировались потому что мы сделали
00:36:59
стрим бродкаст вам и теперь в него на
00:37:03
него подписались дважды не дважды
00:37:06
выводили в консоль
00:37:07
такая вот штука так но смотрите давайте
00:37:12
ли еще последнюю вещь ну скажу какая
00:37:15
которая есть stream controller
00:37:17
потому что возможно вы про нее
00:37:20
когда-нибудь увидите узнаете вам будет
00:37:22
интересно что это потому что мне было
00:37:24
именно так ustream контроллера есть
00:37:27
конструктор и в этот конструктор можно
00:37:29
соответственно закидывать некоторые вот
00:37:33
мент он ли сам он пауз анри съем он
00:37:37
console то есть соответственно вот эти
00:37:39
замыкания будут срабатывать тогда когда
00:37:41
одно из событий произойдет если мы
00:37:43
начали подписываться с призываю
00:37:45
сработает он лесом если там пристало
00:37:47
подписка на паузу то вот мы он пауз
00:37:51
сработает он рисуем как правило это не
00:37:53
часто пригождается но нужно про это
00:37:56
знать сейчас я про это подробно
00:37:57
рассказывать не буду я подробней
00:37:59
расскажу про вот sing falls
00:38:01
это такой интересный параметр который по
00:38:03
умолчанию стоит фолз то есть грубо
00:38:06
говоря если вы ничего не пишите то это
00:38:08
будет так эквивалентно и тогда
00:38:10
контроллер работает реальные синхронно
00:38:12
как я вам и показывал
00:38:13
то есть если я его еще раз запущу то
00:38:16
увижу в консоли вот вам потом от от от
00:38:19
то потом подписка настроена потом free
00:38:24
потом еще одна подписка настроена ну и
00:38:27
потом уже мы ничего не выводим и только
00:38:29
потом начинают срабатывать вот все вот
00:38:31
эти вот вещи это естественное поведение
00:38:34
для контроллера для стрима где stream
00:38:37
controller про для стрима и так далее то
00:38:39
есть он работает и синхронно иначе как я
00:38:42
сказал если вам не нужно еще откроешь
00:38:43
нам возьмите обычные от массив но вот
00:38:47
разработчики здесь добавили вот этот
00:38:49
флаг который можно поставить в true и
00:38:51
тогда поведение изменится наш контроллер
00:38:54
становится синхронным давайте все
00:38:56
установлю почищу консоль запущу еще раз
00:38:59
посмотрим на результат запускаем и
00:39:02
теперь мы что видим так контроллер sing
00:39:07
true
00:39:11
более он где-то меня под
00:39:14
обман и добавил ван ту фри сработали
00:39:25
почему мама ну так контрольную кисти дни
00:39:28
синхронный но то есть за бродкасты
00:39:32
скорее всего сейчас я попробую убрать
00:39:35
бродкаст посмотрим что будет если что
00:39:43
мне есть другой пример вот запущу а нет
00:39:53
интересны даже синхронный контроллер все
00:39:55
равно
00:40:03
по идеи он не должен был выводить в
00:40:06
консоль free
00:40:07
а ну блин это потому что вот тут ли сон
00:40:13
у меня асинхронный еще вот чуть не учел
00:40:16
выбираем асинхронный лесу да да да то
00:40:19
есть сам контроллер то был синхронный а
00:40:21
я блистере я еще руками синхронно
00:40:23
написал поэтому все работало все понял в
00:40:25
чем была проблема
00:40:26
теперь запускаем и блин все равно ван ту
00:40:30
фри
00:40:40
так так так здесь сделан не так
00:40:56
по идее он должен был до слушать их вот
00:40:59
прям прям сразу же должен был стрелять
00:41:01
потому что синхронные контроллеры именно
00:41:04
так и работают
00:41:06
он должен был
00:41:16
так ну-ка перемещу подписку повыше банки
00:41:22
уфы до подписку нужно было сразу сделать
00:41:25
дело еще подписки ведь у него еще
00:41:27
разницы от подписки работает все теперь
00:41:29
я точно разобрался возвращаю фолз он
00:41:33
очень скромный запускаем смотрим
00:41:36
результат ван ту фри потом наши
00:41:38
подписчики будут все как мы и ожидали то
00:41:41
есть вот это выполняется добавляем
00:41:43
добавляем выполняется это выполняется
00:41:45
это выполняется это и так далее потом и
00:41:49
синхронно начинают он он на синхронно
00:41:51
начинает обрабатывать вот эти штуки
00:41:53
через какое то время но если я ставлю
00:41:55
мужчин кто-то логика меняется
00:41:59
вам потом субскрайб выйдут потом ту
00:42:02
потом free потом вот эти почему так
00:42:05
происходит душит контроллер реально
00:42:06
начинает работать синхронно
00:42:08
то есть каждый раз когда мы в него
00:42:10
что-то добавляем это не откладывается на
00:42:12
потом выполняется ли сон прямо сейчас
00:42:15
вот прямо сразу же сейчас
00:42:17
и поэтому мы добавляем от 1 он выполняет
00:42:20
ли сон потом выполняется от 2 выполняет
00:42:23
весы потом выполняется 3 выполняет лесам
00:42:25
и так далее если же стоит фолз то он
00:42:28
работает по-другому сначала добавляется
00:42:30
от 1 потом два потом от три и так далее
00:42:32
вот они все добавляются после этого
00:42:34
начинают работать лесам то есть порядок
00:42:36
разные вот с этим нужно быть осторожным
00:42:39
там даже приписочкой есть в доке короче
00:42:42
во-первых зачем это нужно вот этот симка
00:42:44
фолз но он нужен блин там в документации
00:42:47
написано что это нужно чтобы работала
00:42:50
быстрее хотим а вот это синхронность она имеет
00:42:52
некие накладные расходы маленькие очень
00:42:55
но тем не менее имеет
00:42:56
и соответственно если вам нужно
00:42:59
чуть-чуть ускориться вы можете добавить
00:43:01
фолз на практике скорее всего это
00:43:03
экономиками экономия на спичках и
00:43:06
никакого ощутимого прироста вы не
00:43:08
получите и там же в документации есть
00:43:12
приписочкой что вот нужно быть крайне
00:43:14
аккуратным с этой штукой если уж вы
00:43:16
хотите ее включать в true потому что
00:43:19
меняется поведение стрима я вам показал
00:43:22
и кто-то может там не заметить
00:43:24
и соответственно получить не то
00:43:29
поведение о котором думал я вот показал
00:43:33
что здесь мы видим два поведения разных
00:43:35
даже не сразу подчинен непонятная надо
00:43:39
рте каждый день не пишу чем поле
00:43:42
синхронная контроллера поэтому
00:43:45
немножечко под застрял на этом месте вот
00:43:48
и в общем грубо говоря вам лучше никогда
00:43:52
сюда true не писать и все ну вот и если
00:43:57
будет по крайней мере пока вы там не
00:43:59
станете супер опытным дарт разработчикам
00:44:02
флотар и однажды вам не понадобится
00:44:05
сэкономить чуть-чуть времени
00:44:06
скорее всего вам не понадобится ни когда
00:44:09
это сделать потому что как я уже сказал
00:44:11
экономия на спичках и вы вряд ли что-то
00:44:15
от этого сильно вы играете ну просто
00:44:17
показал что такое есть флаг и вот зачем
00:44:21
он нужен и что его трогать нельзя на
00:44:25
этом все на самом деле смотрите у
00:44:28
стримов и ucontrol стримов еще очень
00:44:31
очень много различных возможностей это
00:44:33
очень популярная концепция языки она
00:44:36
постоянно используется используется
00:44:38
по-разному ustream а там куча куча куча
00:44:41
различных методов и так далее которые
00:44:43
вот как-то нужно научиться применять и
00:44:46
вы будете их обязательно применять но
00:44:48
чтобы сейчас пока не грузить всем этим
00:44:51
делом потому что сам по себе стрим это
00:44:53
сложная концепция я рассказал вот именно
00:44:56
этот минимум это минимум чтобы вообще
00:44:58
понимать как этот стрим работает чтобы
00:45:01
уже уметь с ним взаимодействовать и так
00:45:03
далее попозже
00:45:06
мы вернёмся к этому то есть где-то в
00:45:09
будущем мы вернемся и рассмотрим стримы
00:45:11
прям очень тщательным скорее всего даже
00:45:14
будут несколько уроков по различным
00:45:16
возможностям там сгруппирую какие-то
00:45:18
базовые возможности скармливать гель из
00:45:21
него уроки по полю так скажем не
00:45:28
экстраординарному способностью использую
00:45:30
такое слово и так далее но вот для того
00:45:32
чтобы начать работать с лотаром этих
00:45:36
знаний должно быть достаточно на этом
00:45:39
все подписывайтесь на канал ставьте
00:45:41
лайки и жмите колокольчик вступайте в
00:45:44
группу vk
00:45:45
я там создал чать туда тоже можно
00:45:47
вступать будете учиться ставать друг
00:45:50
другу вопросы это очень помогать кому
00:45:52
нибудь возможно это очень сильно
00:45:54
прокачивает понимание все пока

Описание:

Пожертвования — https://boosty.to/lazyloadflutter ______ Канал с анонсами в телеграм — https://t.me/lazyload_flutter ______ Группа в телеграм — https://t.me/learnDartFlutter ______ Группа в вк — https://vk.com/club203125105 ______

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "Урок 15: "Основы Dart - асинхронность часть третья (Stream)""?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "Урок 15: "Основы Dart - асинхронность часть третья (Stream)"" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "Урок 15: "Основы Dart - асинхронность часть третья (Stream)""?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "Урок 15: "Основы Dart - асинхронность часть третья (Stream)"" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "Урок 15: "Основы Dart - асинхронность часть третья (Stream)""?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "Урок 15: "Основы Dart - асинхронность часть третья (Stream)""?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.