Тема хорошая, спасибо. Но подача, просто жесть! Постоянно маячит дурацкая надпись и сетка. Зачем? Код появляется на мгновение и исчезает. Автор говорит грамотно, но из-за выше сказанного, очень трудно воспринимать.
Для холодных/горячих цепочек flow можно использовать аналогию проигрывания музыкального альбома с компакт-диска (cold) и подключения к эфиру радиостанции (hot).
7:00 , "раз у нас коллектор запущен в отдельной корутине, и эмиттер запущен в отдельной корутине, то им нужно между собой где-то общаться...". Самое логичное - назвать эту корутину базой (спасибо дедушке-транзистору)
28:39 Менять SingleEvent на StateFlow не лучшее решение - при каждом пересоздании экрана будут повторяться event'ы. Более подходящее решение SharedFlow.
@@MobileDeveloper до переворота в фрагменте будет один подпищик и он к примеру отобразит тост по такому последнему ивенту из StateFlow, после переворота будет уже новый подпищик, который тоже получит последнее состояние и поверх старого тоста отобразится еще один, SingleLiveEvent не просто так делался. proandroiddev.com/singleliveevent-to-help-you-work-with-livedata-and-events-5ac519989c70
Алексей, у вас всегда хорошие видео, но не в этот раз :( Чтоб увидеть слайды, приходилось стопить видео, Во-вторых речь очень быстрая, и мне человеку который не работал с флоу, очень тяжело успевать за контекстом, так что приходилось несколько раз отматывать назад. В третьих сетка с логотипом это жесть :) мне приходилось закрывать глаза, чтоб в слушиваться в текст, она реально меня сбивала и у меня в голове была каша
Все понравилось, Но незачем прятать код так быстро Надо паузу ставить и смотреть Пока подпишусь, но надеюсь в будущем такого не будет, а то больно И не надо торопится
Это был первый пробный камень с таким прям полным разбором, уже думаем над более удачной подачей информации, но след видео все еще выйдет в похожем формате
Очень классная надпись, намного лучше, чем какой-то код. Видео похоже на рекламу чего-то, можно было бы еще ускорить немного и самое то. Наверное есть те, кому без этого объяснения никак, мне их очень жаль.
Stateflow - хорош, мне нравится его юзать для отображения своих состояний. Единственные его минус - нельзя более одного раза отправить и получить те же самые данные -логика внутри StateFlow не пропустит. Например - у меня есть экран и EditText с кнопкой очистки поля ввода. На все это есть начальный State(text =" "). Он и отобразится при первом пуске. Так вот, если я что то введу в EditText и нажму кнопку - то данные не затрутся - ибо состояние будет такое же. А LiveData отработает) И тут остается лишь после изменения каждого знака в editText - записывать эти данные в State.
Все логично, если не логично то ссылка на видео ЛОГИЧНО в описание, здесь мы это разбирать не будем, там я более подробно расскажу вам про фильм Терминатора. )) это всё что я понял👍
Тема очень актуальная, но ослабо раскрыта. Нужно отдельное подробное видео по использованию корутин и флоу, со всеми операторами и отличиями от RX. За труды большое спасибо)
Есть пример шины на SharedFlow? (которая работает между экранами) если я использую DI, нужно прокидывать ссылку на шину и хранить в ней разные ивенты (так я делал с rxSubject) потом доставал и подписывался на каждый ивент по его типу publisherSubject.ofType(eventClass) каким образом лучше вытаскивать ивенты, смотря на их тип из flow? Например если я из Service хочу отправить будущему Activity (который когда-то откроется) ивент, мол покажи "какой-то текст" когда он откроется, подпишется на ивент и выполнит его
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) } } } Не понимаю в чем фишка Автор, проверь у себя, может такая же проблема
Спасибо за разбор! Только одно уточнение, или я не внимателен, или может чего-то не понял. В общем, на сколько я понимаю stateflow в отличие от livedata нужно уничтожать же, т е отменять collect? Просто у вас не увидел этот момент
Я там несколько неточностей допустил, подробнее тут - zen.yandex.ru/media/id/5e4aa0a9f2b93d016c114af8/kotlin-flow-shared-flow-state-flow-60215df5b73c460f6c5fcb83?comment-request=1#comment_808883311
@@MobileDeveloper ну я у себя делаю так: начинаю с Loading. Далее пока получаю запрос от сервера у меня все еще стейтфлоу.валуе = лоадинг, после я соответственно меняю на фейлуре либо контент. Что тут необычного?) Что значит вью не имеет представления? Белый экран?) Это плохой UX.
12:30 Я писал про устаревание билдера. "Оператор flowOn является обычным цепочечным оператором билдера..." flowOn это extension функция, о каком операторе билдера идёт речь?
Запиши курс платный по повышению квалификации) Я на пример работаю в продуктовой компании мидлом и уже почти год сижу на одном проекте) очень хочется учить что то новое но себя заставить на ровном месте тяжело(
Может только у меня такая проблема Допустим мы вызвали viewState (с фрагмента А), нам пришел Error Потом ушли на следующий экран, возвращаемся на экран А и получается при подписке на viewStates, из-за того что flow не пустой, то есть у нас там Error, то у нас срабатывает collect и выполняется Error Или допустим в viewState кинули Loading, а потом кинули какой-нибудь action, тогда при таком же сценарии с выхода с экрана и обратного входа, сработает и viewActions, и viewStates Либо я с viewModel косячу, хотя по идеи фрагмент должен оставаться в backStack, либо в ViewState, Action и Event нужно добавлять пустые стейты при которых ничего не происходит
Почему? Пример для активити да и, кстати, сейчас заглянул туда еще раз и там довольно четко написано, что // 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
00:36 - Что такое Flow?
04:16 - Backpressure
08:26 - Dispatchers
14:09 - Combining
15:36 - SharedFlow. StateFlow
22:55 - Шутка
23:07 - Практическая часть
34:14 - Заключение
Тема хорошая, спасибо.
Но подача, просто жесть!
Постоянно маячит дурацкая надпись и сетка. Зачем? Код появляется на мгновение и исчезает.
Автор говорит грамотно, но из-за выше сказанного, очень трудно воспринимать.
Учтём, сделаем получше )
Хотел такой же коммент написать.
Согласен
+
Да могли бы сделать 4 кнопки на экране и на каждую повесить action что бы показать как будет менятся контент и тд.
Предлагаю картинки с кодом вставлять "25 кадром", сразу так сказать в подкорку зрителю записывать ))
Это пока самая зачетная шутка )
Про картошку, супер объяснение. Утащил в блокнотик.
Для холодных/горячих цепочек flow можно использовать аналогию проигрывания музыкального альбома с компакт-диска (cold) и подключения к эфиру радиостанции (hot).
Да, можно много аналогий придумать )
7:00 , "раз у нас коллектор запущен в отдельной корутине, и эмиттер запущен в отдельной корутине, то им нужно между собой где-то общаться...". Самое логичное - назвать эту корутину базой (спасибо дедушке-транзистору)
спасибо за видео, Алексей). Недавно рх учил, теперь смотрю про flow
Алексей Вы прекрасно доносите информацию. И Перфоменс будет интересен многим. Спасибо
Спасибо большое, подумаю как лучше сделать видео про performance
Как-то под конец 2020 оставил комментарий "что, было бы неплохо запилить видос про Flow). Ждали - держите. Спасибо тебе Алексей.
@Artem Zanin лично я сам разобрался с flow. Просто мне интересно мнение Алексея.
Я думаю здесь в другом смысл, что человек не особо торопился и хотел посмотреть видео ) Мне приятно, спасибо )
Очень круто! Спасибо
Крайне полезная информация, но, как уже ранее было замечено, не стоит так быстро убирать код. А в целом - спасибо большое, ждем новый материал 🙂👍
Спасибо, сорри, что так вышло в след видео постараюсь сделать лучше)
28:39
Менять SingleEvent на StateFlow не лучшее решение - при каждом пересоздании экрана будут повторяться event'ы. Более подходящее решение SharedFlow.
StateFlow как раз выдает последнее состояние, а SharedFlow имеет replayCache
@@MobileDeveloper до переворота в фрагменте будет один подпищик и он к примеру отобразит тост по такому последнему ивенту из StateFlow, после переворота будет уже новый подпищик, который тоже получит последнее состояние и поверх старого тоста отобразится еще один, SingleLiveEvent не просто так делался. proandroiddev.com/singleliveevent-to-help-you-work-with-livedata-and-events-5ac519989c70
Алексей, у вас всегда хорошие видео, но не в этот раз :(
Чтоб увидеть слайды, приходилось стопить видео,
Во-вторых речь очень быстрая, и мне человеку который не работал с флоу, очень тяжело успевать за контекстом, так что приходилось несколько раз отматывать назад.
В третьих сетка с логотипом это жесть :) мне приходилось закрывать глаза, чтоб в слушиваться в текст, она реально меня сбивала и у меня в голове была каша
Да понял уже, что неудачный формат. В будущем думаю переделаю это видео, а пока думаю над более удачным форматом
@@MobileDeveloper лучше пусть будет или кусок кода, или слайд с краткой выжимкой о чем речь
Примерно в этом направлении и думаю )
Как раз на этих штуках построил свое MVI и везде юзаю flow.
Лучшая архитектура на данный момент имхо)
Все понравилось,
Но незачем прятать код так быстро
Надо паузу ставить и смотреть
Пока подпишусь, но надеюсь в будущем такого не будет, а то больно
И не надо торопится
Это был первый пробный камень с таким прям полным разбором, уже думаем над более удачной подачей информации, но след видео все еще выйдет в похожем формате
Спасибо! Очень понравилось! Вы круто объясняете! Теперь буду разбираться с операторами комбинации))
Здорово, что помогло )
Очень классная надпись, намного лучше, чем какой-то код. Видео похоже на рекламу чего-то, можно было бы еще ускорить немного и самое то. Наверное есть те, кому без этого объяснения никак, мне их очень жаль.
Спасибо большое. Про Каналы тоже интересно будет услышать. Спасибо
Спасибо )
Спасибо за видео, и сделай всё же как с rx-сом, там по понятнее было
Возможно сделаю да )
@@MobileDeveloper жду)
Большое спасибо автору,классное видео)
Пожалуйста! )
Stateflow - хорош, мне нравится его юзать для отображения своих состояний. Единственные его минус - нельзя более одного раза отправить и получить те же самые данные -логика внутри StateFlow не пропустит. Например - у меня есть экран и EditText с кнопкой очистки поля ввода. На все это есть начальный State(text =" "). Он и отобразится при первом пуске. Так вот, если я что то введу в EditText и нажму кнопку - то данные не затрутся - ибо состояние будет такое же. А LiveData отработает) И тут остается лишь после изменения каждого знака в editText - записывать эти данные в State.
Да, есть такая проблема, приходится сбрасывать значения. И это дико неудобно.
@@MobileDeveloper , как правильно сбрасываете значения?
Да тупо null кидаю и потом нужное значение, но сдаётся мне что это очень кривое решение ) но у меня речь про viewstate
@@MobileDeveloper а поменять StateFlow на SharedFlow ? Шерил флоу может одно и тоже кидать)
Мы вообще пока от флоу немного отошли ))
Двумя руками за Женитьбу Флоу :)
Да будет свадьба!
„Холодный клиент“ - это пять! 😃
Все логично, если не логично то ссылка на видео ЛОГИЧНО в описание, здесь мы это разбирать не будем, там я более подробно расскажу вам про фильм Терминатора. )) это всё что я понял👍
Спасибо за видео! Очень классный разбор
Спасибо! ))
Спасибо! Отличное видео
Спасибо)
Всё отлично, спасибо за разбор!
Супер, спасибо )
Все здорово, спасибо за обзор.
Пожалуйста )
Тема очень актуальная, но ослабо раскрыта. Нужно отдельное подробное видео по использованию корутин и флоу, со всеми операторами и отличиями от RX. За труды большое спасибо)
Скоро будет видео, посвящённое операторам ) отдельное
Есть пример шины на SharedFlow? (которая работает между экранами)
если я использую DI, нужно прокидывать ссылку на шину и хранить в ней разные ивенты (так я делал с rxSubject)
потом доставал и подписывался на каждый ивент по его типу publisherSubject.ofType(eventClass)
каким образом лучше вытаскивать ивенты, смотря на их тип из flow?
Например если я из Service хочу отправить будущему Activity (который когда-то откроется) ивент, мол покажи "какой-то текст"
когда он откроется, подпишется на ивент и выполнит его
Пока примера нет, но планирую сделать такое видео - много запросов
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) }
}
}
Не понимаю в чем фишка
Автор, проверь у себя, может такая же проблема
teletype.in/@alexgladkov/kotlin-flow-aftermath
Я вот тут статейку написал как раз про это )
@@MobileDeveloper Спасибо
Добавь в описании к ролику
Окей спасибо
Спасибо за разбор! Только одно уточнение, или я не внимателен, или может чего-то не понял. В общем, на сколько я понимаю stateflow в отличие от livedata нужно уничтожать же, т е отменять collect? Просто у вас не увидел этот момент
Нет. Просто цепляешь к корутин контексту вьюхи и он сам отменяется.
Да, все правильно Сергей написал оно само отпишется
@@MobileDeveloper а в данном случае это потому что корутина запущена как launchWhnStarted? если просто launch, то пришлось тогда отменять?
Предлагаю объединить второе видео про flow и второе видео про Retrofit)
Интересная мысль )
Про перформанс интересно
Почему два collect работают в одной корутине? или кажется?
Я там несколько неточностей допустил, подробнее тут - zen.yandex.ru/media/id/5e4aa0a9f2b93d016c114af8/kotlin-flow-shared-flow-state-flow-60215df5b73c460f6c5fcb83?comment-request=1#comment_808883311
Наливаю чай в кофе. Всегда так делаю)
Тоже вариант )
То чувство, когда ты сделал такую ж архитектуру ещё до выхода видео...Было бы классно ещё и тесты на все это дело написать! )
Про тесты будет, но позже )
27:45 зачем делать value внутри MutableStateFlow Nullable? Это горячий флоу и не припомнится мне состояния View “null”. Как это отображается?
Нужно какое-то дефолтное значение прокидывать ) если знаете способ лучше буду благодарен
@@MobileDeveloper ну я у себя делаю так: начинаю с Loading. Далее пока получаю запрос от сервера у меня все еще стейтфлоу.валуе = лоадинг, после я соответственно меняю на фейлуре либо контент. Что тут необычного?) Что значит вью не имеет представления? Белый экран?) Это плохой UX.
Плюс за картошку!
Картошка жжет! )
хотелось бы оч видео про performance
Видимо придется пилить )
12:30
Я писал про устаревание билдера.
"Оператор flowOn является обычным цепочечным оператором билдера..."
flowOn это extension функция, о каком операторе билдера идёт речь?
То, что оно сделано через extension fun не значит, что оно не сделано по принципу Builder. Просто здесь вместо build() используется collect()
Запиши курс платный по повышению квалификации)
Я на пример работаю в продуктовой компании мидлом и уже почти год сижу на одном проекте) очень хочется учить что то новое но себя заставить на ровном месте тяжело(
Уже узнавал. Народ не готов платить деньги.
Может только у меня такая проблема
Допустим мы вызвали viewState (с фрагмента А), нам пришел Error
Потом ушли на следующий экран, возвращаемся на экран А и получается при подписке на viewStates, из-за того что flow не пустой, то есть у нас там Error, то у нас срабатывает collect и выполняется Error
Или допустим в viewState кинули Loading, а потом кинули какой-нибудь action, тогда при таком же сценарии с выхода с экрана и обратного входа, сработает и viewActions, и viewStates
Либо я с viewModel косячу, хотя по идеи фрагмент должен оставаться в backStack, либо в ViewState, Action и Event нужно добавлять пустые стейты при которых ничего не происходит
Попробуйте тоже самое с LiveData проделать вместо flow. Если ошибка уйдёт значит где-то у меня ошибка, если нет, то у вас
@@MobileDeveloper Похоже у меня косяк из-за navComponents
У кого будет такая же проблема переместите lifecycleScope.launchWhenStarted в onCreate
Хорошее замечание
Алексей, можно в двух словах отличие flow от StateFlow&SharedFlow?
Ну flow работает при подписке только (то есть холодный вызов), shared для горячих вызовов, state для последнего доступного изменения
Flow - это интерфейс, а остальное - это варианты его реализации.
Про перфоманс было бы интересно
Спасибо запомню)
можете написать карту изучения Ваших уроков, в каком порядке лучшего всего их проходить?
У них нет какой-то связанной логики. Я просто разбираю отдельные темы. Для более-менее связанности есть приложение TransportApp
@@MobileDeveloper можете выделить уроки, которые более простые, которые лучше изучить в первую очередь?
Привет, жду выпуска с channels.
Спасибо!
Хорошо, подумаю ))
В целом интересная тема
Но код на белом фоне, смотреть больно
И может не спешить особо
И наверное какие-нибудь картинки бы
А то тяжко
Хорошо, спасибо )
Я один не вижу на экране код?))
17:21 оператор buffer вместо replayCache
Косяк (
про launchWhenStarted ты не прав, он отвалится только в случае destroyed
medium.com/swlh/deep-dive-into-lifecycle-coroutines-e7192312faf
Да, был неправ, смутили названия. Они все уничтожаются вместе с lifecycle только, вы правы
Нет на сайте андроида четко написано, что нужно использовать launchWhenStarted
@@MobileDeveloper это только для Активити.
Почему? Пример для активити да и, кстати, сейчас заглянул туда еще раз и там довольно четко написано, что
// 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
@@MobileDeveloper Да, точно. Просто я завёз через viewLifecycleOwner.lifecycleScope.launch вот и запутался.
Как для первого видео по теме, как-то слишком сложно кмк
Оно не первое - там же внутри куча ссылок на другие видео
@@MobileDeveloper я про флоу
Тяжело смотреть на этот плавающий дуда-сюда фон. Стошнило :)))
Уберем в будущем