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

Поділитися
Вставка
  • Опубліковано 16 лис 2024

КОМЕНТАРІ • 136

  • @paulk3222
    @paulk3222 3 роки тому +23

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

  • @user-sankarsana
    @user-sankarsana 3 роки тому +78

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому +11

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

    • @ki16or
      @ki16or 3 роки тому +2

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

    • @ЕвгенийСокирко-д1в
      @ЕвгенийСокирко-д1в 3 роки тому

      Согласен

    • @nomugop8017
      @nomugop8017 2 роки тому

      +

    • @hashcat5721
      @hashcat5721 Місяць тому

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

  • @DmitryKatsubo
    @DmitryKatsubo 3 роки тому +28

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому +5

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

  • @luyt2
    @luyt2 Рік тому

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

  • @RomanTokarenko
    @RomanTokarenko 3 роки тому +5

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @kirillsushilnikov9614
    @kirillsushilnikov9614 2 роки тому +1

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

  • @kafychannel
    @kafychannel 2 роки тому

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

  • @yuriyg9650
    @yuriyg9650 3 роки тому +3

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @pixmaky7425
    @pixmaky7425 3 роки тому +1

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

    • @mr.z3813
      @mr.z3813 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @azamatik3
    @azamatik3 2 місяці тому

    Очень круто! Спасибо

  • @amgomg2323
    @amgomg2323 3 роки тому +2

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @СергейПанов-з3ц
    @СергейПанов-з3ц 3 роки тому +4

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @wtf_nick
      @wtf_nick 3 роки тому +1

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

  • @АнтонЩербаков-в9ч
    @АнтонЩербаков-в9ч 3 роки тому +2

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому +2

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

    • @АнтонЩербаков-в9ч
      @АнтонЩербаков-в9ч 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @ruvirta
    @ruvirta 3 роки тому +1

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @YuriiMelnyk-r3j
    @YuriiMelnyk-r3j 3 роки тому +6

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому +3

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

  • @antonaronov8124
    @antonaronov8124 3 роки тому

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

  • @МихаилАкулов-ю7ж
    @МихаилАкулов-ю7ж 2 роки тому

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

  • @yuriyg9650
    @yuriyg9650 3 роки тому

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

  • @immortal_lnight
    @immortal_lnight 2 роки тому

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

  • @ПолинаЛапшина-ф8й
    @ПолинаЛапшина-ф8й 2 роки тому

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

  • @ivanchepelkin6347
    @ivanchepelkin6347 3 роки тому

    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 роки тому +1

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

  • @yuriyg9650
    @yuriyg9650 3 роки тому +1

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

  • @alexandernifanin7366
    @alexandernifanin7366 3 роки тому

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

  • @voicetv9048
    @voicetv9048 Рік тому

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

  • @vaaskout7482
    @vaaskout7482 3 роки тому

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

  • @ByTheKema
    @ByTheKema 3 роки тому

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

  • @maxsimpleapps
    @maxsimpleapps 3 роки тому

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

  • @eugeneshtefan3623
    @eugeneshtefan3623 3 роки тому

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

  • @dabz777
    @dabz777 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @karvinok
    @karvinok 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @helloname1
    @helloname1 3 роки тому +1

    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 роки тому

      Окей спасибо

  • @ivanp3511
    @ivanp3511 3 роки тому

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

    • @VoroninSergey
      @VoroninSergey 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @ivanp3511
      @ivanp3511 3 роки тому

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

  • @mr.z3813
    @mr.z3813 3 роки тому

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

  • @mironoff2007
    @mironoff2007 2 роки тому

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

  • @arbonik2126
    @arbonik2126 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @acrrono
    @acrrono 3 роки тому

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

  • @ivanchepelkin6347
    @ivanchepelkin6347 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @arturmavlyuchenko7647
    @arturmavlyuchenko7647 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @arturmavlyuchenko7647
      @arturmavlyuchenko7647 3 роки тому

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

  • @user-sankarsana
    @user-sankarsana 3 роки тому +1

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

  • @user357aqq
    @user357aqq 3 роки тому +1

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

  • @СергейПанов-з3ц
    @СергейПанов-з3ц 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @momentslikethis8014
    @momentslikethis8014 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

  • @helloname1
    @helloname1 3 роки тому

    Может только у меня такая проблема
    Допустим мы вызвали 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 роки тому

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

  • @РожковАндрей-х8ш
    @РожковАндрей-х8ш 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @Yazon2006
      @Yazon2006 2 роки тому

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

  • @arsen1156
    @arsen1156 3 роки тому +1

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

  • @kobatrader7375
    @kobatrader7375 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @kobatrader7375
      @kobatrader7375 3 роки тому

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

  • @primestop3862
    @primestop3862 3 роки тому

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

  • @Dhu43bdudhsnqdjfi483
    @Dhu43bdudhsnqdjfi483 3 роки тому +3

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

  • @ЕгорТвердохлеб-й2р

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

  • @fghinty7623
    @fghinty7623 3 роки тому

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

  • @arturvorobyoff9913
    @arturvorobyoff9913 3 роки тому

    про 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_x2 3 роки тому

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

    • @MobileDeveloper
      @MobileDeveloper  3 роки тому

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

    • @podo_x2
      @podo_x2 3 роки тому

      @@MobileDeveloper я про флоу

  • @VladimirTokarevS
    @VladimirTokarevS 3 роки тому +1

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