Kotlin Flow. SharedFlow. StateFlow [Ru, Kotlin] / Мобильный разработчик

Всем привет!
В этом году будет много интересных разборов новых тем, потому что мобильная разработка, и в частности Котлин, не стоит на месте. Сегодня у нас на столе Flow и мы посмотрим как эта технология устроена, как ее применять и зачем ее применять 🙂
Надеюсь, вам будет интересно. Также если я вдруг не осветил какой-то момент, который вам кажется интересным, обязательно пишите в комментариях и, возможно, будет второе видео
Полезные ссылки
kotlinlang.org/api/latest/jvm... - описание как работает контекст
kotlinlang.org/docs/reference... - здесь можно посмотреть операторы комбинации флоу
habr.com/ru/post/529944/](habr.com/ru/post/529944/ - статья про эволюцию корутин
gist.github.com/AlexGladkov/0... - Ссылка на гист с файлом вью модели
teletype.in/@alexgladkov/kotl... - статья с разбором комментариев после видео
Напоминаю, что видео вначале выходят для моих патронов. Стать патроном можно по ссылке ниже
===========================================
Стать Патроном канала и получить доступ к уникальному материалу
/ mobiledeveloper
===========================================
Мобильный разработчик в других соц. сетях
=======================
Вконтакте - mdeveloper
Instagram - / nplau
Телеграм - t.me/mobiledevnews
=======================
Ставь лайк и расскажи друзьям, чтобы они тоже попробовали эту технологию

Пікірлер: 134

  • @paulk3222
    @paulk32223 жыл бұрын

    00:36 - Что такое Flow? 04:16 - Backpressure 08:26 - Dispatchers 14:09 - Combining 15:36 - SharedFlow. StateFlow 22:55 - Шутка 23:07 - Практическая часть 34:14 - Заключение

  • @user-qu6mb9il6w
    @user-qu6mb9il6w3 жыл бұрын

    Тема хорошая, спасибо. Но подача, просто жесть! Постоянно маячит дурацкая надпись и сетка. Зачем? Код появляется на мгновение и исчезает. Автор говорит грамотно, но из-за выше сказанного, очень трудно воспринимать.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Учтём, сделаем получше )

  • @ki16or

    @ki16or

    3 жыл бұрын

    Хотел такой же коммент написать.

  • @user-bh3ul2yk3q

    @user-bh3ul2yk3q

    3 жыл бұрын

    Согласен

  • @nomugop8017

    @nomugop8017

    2 жыл бұрын

    +

  • @DmitryKatsubo
    @DmitryKatsubo3 жыл бұрын

    Предлагаю картинки с кодом вставлять "25 кадром", сразу так сказать в подкорку зрителю записывать ))

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Это пока самая зачетная шутка )

  • @kirillsushilnikov9614
    @kirillsushilnikov96142 жыл бұрын

    7:00 , "раз у нас коллектор запущен в отдельной корутине, и эмиттер запущен в отдельной корутине, то им нужно между собой где-то общаться...". Самое логичное - назвать эту корутину базой (спасибо дедушке-транзистору)

  • @kafychannel
    @kafychannel Жыл бұрын

    спасибо за видео, Алексей). Недавно рх учил, теперь смотрю про flow

  • @yuriyg9650
    @yuriyg96503 жыл бұрын

    Алексей Вы прекрасно доносите информацию. И Перфоменс будет интересен многим. Спасибо

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо большое, подумаю как лучше сделать видео про performance

  • @vaaskout7482
    @vaaskout74823 жыл бұрын

    Спасибо за видео! Очень классный разбор

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо! ))

  • @antonaronov8124
    @antonaronov81243 жыл бұрын

    Спасибо! Очень понравилось! Вы круто объясняете! Теперь буду разбираться с операторами комбинации))

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Здорово, что помогло )

  • @maxsimpleapps
    @maxsimpleapps3 жыл бұрын

    Всё отлично, спасибо за разбор!

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Супер, спасибо )

  • @RomanTokarenko
    @RomanTokarenko3 жыл бұрын

    Для холодных/горячих цепочек flow можно использовать аналогию проигрывания музыкального альбома с компакт-диска (cold) и подключения к эфиру радиостанции (hot).

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Да, можно много аналогий придумать )

  • @pixmaky7425
    @pixmaky74253 жыл бұрын

    Как-то под конец 2020 оставил комментарий "что, было бы неплохо запилить видос про Flow). Ждали - держите. Спасибо тебе Алексей.

  • @mr.z3813

    @mr.z3813

    3 жыл бұрын

    @Artem Zanin лично я сам разобрался с flow. Просто мне интересно мнение Алексея.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Я думаю здесь в другом смысл, что человек не особо торопился и хотел посмотреть видео ) Мне приятно, спасибо )

  • @eugeneshtefan3623
    @eugeneshtefan36233 жыл бұрын

    Все здорово, спасибо за обзор.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Пожалуйста )

  • @ByTheKema
    @ByTheKema3 жыл бұрын

    Спасибо! Отличное видео

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо)

  • @amgomg2323
    @amgomg23233 жыл бұрын

    Крайне полезная информация, но, как уже ранее было замечено, не стоит так быстро убирать код. А в целом - спасибо большое, ждем новый материал 🙂👍

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо, сорри, что так вышло в след видео постараюсь сделать лучше)

  • @user-zz8sd6ro2c
    @user-zz8sd6ro2c2 жыл бұрын

    Большое спасибо автору,классное видео)

  • @MobileDeveloper

    @MobileDeveloper

    2 жыл бұрын

    Пожалуйста! )

  • @ivanchepelkin6347
    @ivanchepelkin63473 жыл бұрын

    То чувство, когда ты сделал такую ж архитектуру ещё до выхода видео...Было бы классно ещё и тесты на все это дело написать! )

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Про тесты будет, но позже )

  • @alexandernifanin7366
    @alexandernifanin73663 жыл бұрын

    „Холодный клиент“ - это пять! 😃

  • @yuriyg9650
    @yuriyg96503 жыл бұрын

    Спасибо большое. Про Каналы тоже интересно будет услышать. Спасибо

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо )

  • @user-xu5wm6fw2b
    @user-xu5wm6fw2b3 жыл бұрын

    Все понравилось, Но незачем прятать код так быстро Надо паузу ставить и смотреть Пока подпишусь, но надеюсь в будущем такого не будет, а то больно И не надо торопится

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Это был первый пробный камень с таким прям полным разбором, уже думаем над более удачной подачей информации, но след видео все еще выйдет в похожем формате

  • @luyt2
    @luyt29 ай бұрын

    Про картошку, супер объяснение. Утащил в блокнотик.

  • @user-fm2jm2yd5n
    @user-fm2jm2yd5n3 жыл бұрын

    Алексей, у вас всегда хорошие видео, но не в этот раз :( Чтоб увидеть слайды, приходилось стопить видео, Во-вторых речь очень быстрая, и мне человеку который не работал с флоу, очень тяжело успевать за контекстом, так что приходилось несколько раз отматывать назад. В третьих сетка с логотипом это жесть :) мне приходилось закрывать глаза, чтоб в слушиваться в текст, она реально меня сбивала и у меня в голове была каша

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Да понял уже, что неудачный формат. В будущем думаю переделаю это видео, а пока думаю над более удачным форматом

  • @user-fm2jm2yd5n

    @user-fm2jm2yd5n

    3 жыл бұрын

    @@MobileDeveloper лучше пусть будет или кусок кода, или слайд с краткой выжимкой о чем речь

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Примерно в этом направлении и думаю )

  • @dabz777
    @dabz7773 жыл бұрын

    Тема очень актуальная, но ослабо раскрыта. Нужно отдельное подробное видео по использованию корутин и флоу, со всеми операторами и отличиями от RX. За труды большое спасибо)

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Скоро будет видео, посвящённое операторам ) отдельное

  • @immortal_lnight
    @immortal_lnight2 жыл бұрын

    Спасибо за видео, и сделай всё же как с rx-сом, там по понятнее было

  • @MobileDeveloper

    @MobileDeveloper

    2 жыл бұрын

    Возможно сделаю да )

  • @immortal_lnight

    @immortal_lnight

    2 жыл бұрын

    @@MobileDeveloper жду)

  • @user-hu8uw3fr6m
    @user-hu8uw3fr6m2 жыл бұрын

    Очень классная надпись, намного лучше, чем какой-то код. Видео похоже на рекламу чего-то, можно было бы еще ускорить немного и самое то. Наверное есть те, кому без этого объяснения никак, мне их очень жаль.

  • @karvinok
    @karvinok3 жыл бұрын

    Есть пример шины на SharedFlow? (которая работает между экранами) если я использую DI, нужно прокидывать ссылку на шину и хранить в ней разные ивенты (так я делал с rxSubject) потом доставал и подписывался на каждый ивент по его типу publisherSubject.ofType(eventClass) каким образом лучше вытаскивать ивенты, смотря на их тип из flow? Например если я из Service хочу отправить будущему Activity (который когда-то откроется) ивент, мол покажи "какой-то текст" когда он откроется, подпишется на ивент и выполнит его

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Пока примера нет, но планирую сделать такое видео - много запросов

  • @user-oc7py1vy6s
    @user-oc7py1vy6s3 жыл бұрын

    28:39 Менять SingleEvent на StateFlow не лучшее решение - при каждом пересоздании экрана будут повторяться event'ы. Более подходящее решение SharedFlow.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    StateFlow как раз выдает последнее состояние, а SharedFlow имеет replayCache

  • @wtf_nick

    @wtf_nick

    3 жыл бұрын

    @@MobileDeveloper до переворота в фрагменте будет один подпищик и он к примеру отобразит тост по такому последнему ивенту из StateFlow, после переворота будет уже новый подпищик, который тоже получит последнее состояние и поверх старого тоста отобразится еще один, SingleLiveEvent не просто так делался. proandroiddev.com/singleliveevent-to-help-you-work-with-livedata-and-events-5ac519989c70

  • @user-oc7py1vy6s
    @user-oc7py1vy6s3 жыл бұрын

    12:30 Я писал про устаревание билдера. "Оператор flowOn является обычным цепочечным оператором билдера..." flowOn это extension функция, о каком операторе билдера идёт речь?

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    То, что оно сделано через extension fun не значит, что оно не сделано по принципу Builder. Просто здесь вместо build() используется collect()

  • @yuriyg9650
    @yuriyg96503 жыл бұрын

    Двумя руками за Женитьбу Флоу :)

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Да будет свадьба!

  • @mr.z3813
    @mr.z38133 жыл бұрын

    Предлагаю объединить второе видео про flow и второе видео про Retrofit)

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Интересная мысль )

  • @arturmavlyuchenko7647
    @arturmavlyuchenko76473 жыл бұрын

    27:45 зачем делать value внутри MutableStateFlow Nullable? Это горячий флоу и не припомнится мне состояния View “null”. Как это отображается?

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Нужно какое-то дефолтное значение прокидывать ) если знаете способ лучше буду благодарен

  • @arturmavlyuchenko7647

    @arturmavlyuchenko7647

    3 жыл бұрын

    @@MobileDeveloper ну я у себя делаю так: начинаю с Loading. Далее пока получаю запрос от сервера у меня все еще стейтфлоу.валуе = лоадинг, после я соответственно меняю на фейлуре либо контент. Что тут необычного?) Что значит вью не имеет представления? Белый экран?) Это плохой UX.

  • @ruvirta
    @ruvirta3 жыл бұрын

    Как раз на этих штуках построил свое MVI и везде юзаю flow.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Лучшая архитектура на данный момент имхо)

  • @acrrono
    @acrrono3 жыл бұрын

    Наливаю чай в кофе. Всегда так делаю)

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Тоже вариант )

  • @ivanp3511
    @ivanp35113 жыл бұрын

    Спасибо за разбор! Только одно уточнение, или я не внимателен, или может чего-то не понял. В общем, на сколько я понимаю stateflow в отличие от livedata нужно уничтожать же, т е отменять collect? Просто у вас не увидел этот момент

  • @VoroninSergey

    @VoroninSergey

    3 жыл бұрын

    Нет. Просто цепляешь к корутин контексту вьюхи и он сам отменяется.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Да, все правильно Сергей написал оно само отпишется

  • @ivanp3511

    @ivanp3511

    3 жыл бұрын

    @@MobileDeveloper а в данном случае это потому что корутина запущена как launchWhnStarted? если просто launch, то пришлось тогда отменять?

  • @primestop3862
    @primestop38623 жыл бұрын

    Привет, жду выпуска с channels. Спасибо!

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Хорошо, подумаю ))

  • @voicetv9048
    @voicetv9048 Жыл бұрын

    Все логично, если не логично то ссылка на видео ЛОГИЧНО в описание, здесь мы это разбирать не будем, там я более подробно расскажу вам про фильм Терминатора. )) это всё что я понял👍

  • @mironoff2007
    @mironoff20072 жыл бұрын

    Про перформанс интересно

  • @kobatrader7375
    @kobatrader73753 жыл бұрын

    можете написать карту изучения Ваших уроков, в каком порядке лучшего всего их проходить?

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    У них нет какой-то связанной логики. Я просто разбираю отдельные темы. Для более-менее связанности есть приложение TransportApp

  • @kobatrader7375

    @kobatrader7375

    3 жыл бұрын

    @@MobileDeveloper можете выделить уроки, которые более простые, которые лучше изучить в первую очередь?

  • @user-jg4pk6bq2g
    @user-jg4pk6bq2g3 жыл бұрын

    Алексей, можно в двух словах отличие flow от StateFlow&SharedFlow?

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Ну flow работает при подписке только (то есть холодный вызов), shared для горячих вызовов, state для последнего доступного изменения

  • @Yazon2006

    @Yazon2006

    2 жыл бұрын

    Flow - это интерфейс, а остальное - это варианты его реализации.

  • @arbonik2126
    @arbonik21262 жыл бұрын

    Почему два collect работают в одной корутине? или кажется?

  • @MobileDeveloper

    @MobileDeveloper

    2 жыл бұрын

    Я там несколько неточностей допустил, подробнее тут - zen.yandex.ru/media/id/5e4aa0a9f2b93d016c114af8/kotlin-flow-shared-flow-state-flow-60215df5b73c460f6c5fcb83?comment-request=1#comment_808883311

  • @user357aqq
    @user357aqq3 жыл бұрын

    хотелось бы оч видео про performance

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Видимо придется пилить )

  • @arsen1156
    @arsen11563 жыл бұрын

    Про перфоманс было бы интересно

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Спасибо запомню)

  • @ivanchepelkin6347
    @ivanchepelkin63473 жыл бұрын

    Stateflow - хорош, мне нравится его юзать для отображения своих состояний. Единственные его минус - нельзя более одного раза отправить и получить те же самые данные -логика внутри StateFlow не пропустит. Например - у меня есть экран и EditText с кнопкой очистки поля ввода. На все это есть начальный State(text =" "). Он и отобразится при первом пуске. Так вот, если я что то введу в EditText и нажму кнопку - то данные не затрутся - ибо состояние будет такое же. А LiveData отработает) И тут остается лишь после изменения каждого знака в editText - записывать эти данные в State.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

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

  • @ivanchepelkin6347

    @ivanchepelkin6347

    3 жыл бұрын

    @@MobileDeveloper , как правильно сбрасываете значения?

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Да тупо null кидаю и потом нужное значение, но сдаётся мне что это очень кривое решение ) но у меня речь про viewstate

  • @ivanchepelkin6347

    @ivanchepelkin6347

    3 жыл бұрын

    @@MobileDeveloper а поменять StateFlow на SharedFlow ? Шерил флоу может одно и тоже кидать)

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Мы вообще пока от флоу немного отошли ))

  • @helloname1
    @helloname13 жыл бұрын

    Может только у меня такая проблема Допустим мы вызвали viewState (с фрагмента А), нам пришел Error Потом ушли на следующий экран, возвращаемся на экран А и получается при подписке на viewStates, из-за того что flow не пустой, то есть у нас там Error, то у нас срабатывает collect и выполняется Error Или допустим в viewState кинули Loading, а потом кинули какой-нибудь action, тогда при таком же сценарии с выхода с экрана и обратного входа, сработает и viewActions, и viewStates Либо я с viewModel косячу, хотя по идеи фрагмент должен оставаться в backStack, либо в ViewState, Action и Event нужно добавлять пустые стейты при которых ничего не происходит

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Попробуйте тоже самое с LiveData проделать вместо flow. Если ошибка уйдёт значит где-то у меня ошибка, если нет, то у вас

  • @helloname1

    @helloname1

    3 жыл бұрын

    @@MobileDeveloper Похоже у меня косяк из-за navComponents

  • @helloname1

    @helloname1

    3 жыл бұрын

    У кого будет такая же проблема переместите lifecycleScope.launchWhenStarted в onCreate

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Хорошее замечание

  • @momentslikethis8014
    @momentslikethis80143 жыл бұрын

    Запиши курс платный по повышению квалификации) Я на пример работаю в продуктовой компании мидлом и уже почти год сижу на одном проекте) очень хочется учить что то новое но себя заставить на ровном месте тяжело(

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Уже узнавал. Народ не готов платить деньги.

  • @helloname1
    @helloname13 жыл бұрын

    32:30 Попробовал этот код и он подписывается только на 1 lifecycleScope.launchWhenStarted { //1 viewModel.viewStates().collect { state -> state?.let { bindViewState(it) } } //2 viewModel.viewActions().collect { action -> action?.let { bindViewAction(it) } } } Если их разделить и отдельно каждый запустить в launchWhenStarted, то работает 1 и 2 lifecycleScope.launchWhenStarted { //1 viewModel.viewStates().collect { state -> state?.let { bindViewState(it) } } } lifecycleScope.launchWhenStarted { //2 viewModel.viewActions().collect { action -> action?.let { bindViewAction(it) } } } Не понимаю в чем фишка Автор, проверь у себя, может такая же проблема

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    teletype.in/@alexgladkov/kotlin-flow-aftermath Я вот тут статейку написал как раз про это )

  • @helloname1

    @helloname1

    3 жыл бұрын

    @@MobileDeveloper Спасибо Добавь в описании к ролику

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Окей спасибо

  • @user-qu6mb9il6w
    @user-qu6mb9il6w3 жыл бұрын

    Плюс за картошку!

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Картошка жжет! )

  • @fghinty7623
    @fghinty76233 жыл бұрын

    17:21 оператор buffer вместо replayCache

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Косяк (

  • @user-ks8zk9dn3s
    @user-ks8zk9dn3s Жыл бұрын

    Я один не вижу на экране код?))

  • @alyxeinside3930
    @alyxeinside39303 жыл бұрын

    В целом интересная тема Но код на белом фоне, смотреть больно И может не спешить особо И наверное какие-нибудь картинки бы А то тяжко

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Хорошо, спасибо )

  • @arturvorobyoff9913
    @arturvorobyoff99133 жыл бұрын

    про launchWhenStarted ты не прав, он отвалится только в случае destroyed medium.com/swlh/deep-dive-into-lifecycle-coroutines-e7192312faf

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

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

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Нет на сайте андроида четко написано, что нужно использовать launchWhenStarted

  • @VoroninSergey

    @VoroninSergey

    3 жыл бұрын

    @@MobileDeveloper это только для Активити.

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Почему? Пример для активити да и, кстати, сейчас заглянул туда еще раз и там довольно четко написано, что // This coroutine will run the given block when the lifecycle // is at least in the Started state and will suspend when // the view moves to the Stopped state Что оно заморозится при переходе в Stopped state

  • @VoroninSergey

    @VoroninSergey

    3 жыл бұрын

    @@MobileDeveloper Да, точно. Просто я завёз через viewLifecycleOwner.lifecycleScope.launch вот и запутался.

  • @podo_x2
    @podo_x23 жыл бұрын

    Как для первого видео по теме, как-то слишком сложно кмк

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Оно не первое - там же внутри куча ссылок на другие видео

  • @podo_x2

    @podo_x2

    3 жыл бұрын

    @@MobileDeveloper я про флоу

  • @VladimirTokarevS
    @VladimirTokarevS3 жыл бұрын

    Тяжело смотреть на этот плавающий дуда-сюда фон. Стошнило :)))

  • @MobileDeveloper

    @MobileDeveloper

    3 жыл бұрын

    Уберем в будущем

Келесі