Тёмный

Шаблон MVVM по-простому. LiveData. 

Petrov Yuri
Подписаться 13 тыс.
Просмотров 25 тыс.
50% 1

Приветствую 🖐 друзья, в данных видео уроках мы с вами изучим компонент LiveData
Ссылка на полный курс по MVVM
market-193881724?w=pro...
🤝 Поддержка канала:
✅ ВКонтакте: donate_app?mid=-193881724
✅ Donationalerts www.donationalerts.com/r/yura...
❗️ Важные ссылки ❗️
1️⃣ Презентацию можно скачать в группе ВКонтакте: mobile_developing
2️⃣ LiveData: developer.android.com/topic/l...
3️⃣ Корутины: github.com/kotlin/kotlinx.cor...
📚 Рекомендуемое бесплатное изучение языка Kotlin
1️⃣ Приложение для запоминания ключевых слов Kotlin: play.google.com/store/apps/de...
2️⃣ Мини курс по Kotlin в картинках: • #1. Kotlin в картинках...
√ Тэги для поиска:
#kotlin #mvvm #livedata #androidstudio #firebase #telegram #создатьприложение

Опубликовано:

 

18 июл 2020

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 129   
@mr.developer
@mr.developer 3 года назад
Можно поддержать автора и канал 🤝 купив полный курс по MVVM здесь: boosty.to/mr.developer/posts/fe32632b-1f7e-4c82-9a8e-d2a4e2cb2146?share=post_link Список уроков: 1. Создание проекта. 2. Заполнение activity_main.xml. 3. Заполнение fragment_main.xml. Добавление note_item.xml 4. Заполнение макетов. Добавление кнопок на тулбар 5. Инициализация объектов в MainActivity 6. Инициализация StartFragment.kt, создание модели AppNote.kt 7. Создание DatabaseRepository.kt, реализация репозитория Room 8. Создание базы данных AppRoomDatabase.kt 9. Переход с MainFragment.kt на AddNewNoteFragment.kt 10. Создание новой заметки 11. Заполнение RecyclerView. Отображение списка заметок 12. Переход в NoteFragment.kt, удаление заметки из БД 13. Настройка поведения навигационного графа 14. Создание с нуля проекта в Firebase 15. Подключение к Firebase 16. Макет для выбора базы данных 17. Быстрая авторизация в Firebase 18. Создание LiveData для работы с Firebase 19. Создание новой заметки в Firebase 20. Удаление заметки из Firebase 21. Реализация функции выхода из аккаунта Firebase 22. Добавление анимации в навигацию 23. Сохранение настроек в SharedPreference. Где применим стек технологий: -Android SDK; -Kotlin; -MVVM; -LiveData; -ViewModel; -Room (SQLite); -Navigation; -Kotlin Coroutines; -Firebase SDK; -RecyclerView.
@kuzd4niil
@kuzd4niil 2 года назад
Отличный видеоурок. Большое спасибо
@8Sapphire8
@8Sapphire8 3 года назад
Ты крут, подача бомба, я такого пока не встречал. Очень полезно.
@NevilPlay
@NevilPlay 3 года назад
Прекрасное объяснение работы LiveData, перечислены множество способов работать с БД. Пока новичок в AS Kotlin, немного сложно изучать данный паттерн, думаю, что со временем все пойму. Спасибо!
@annasakharova922
@annasakharova922 4 года назад
Один из лучших каналов по мобильной разработке на ютубе. Просто супер, все доступно.
@mr.developer
@mr.developer 4 года назад
Благодарю за отзыв)
@user-sq5cr5uq8i
@user-sq5cr5uq8i 3 года назад
Шикарные уроки! Ты лучшииииий
@user-cm6ke4ys7h
@user-cm6ke4ys7h 2 года назад
Спасибо большое! Отличное видео!
@mr.developer
@mr.developer 2 года назад
Благодарю за отзыв 🤝
@user-ky2zi4fp9r
@user-ky2zi4fp9r 2 года назад
Спасибо! Отличный ролик, после просмотра стало понятно, как работает LiveData.
@mr.developer
@mr.developer 2 года назад
Благодарю вас за отзыв 🤝
@ipvoodoo
@ipvoodoo 4 года назад
Спасибо, отлично объяснил!
@mr.developer
@mr.developer 4 года назад
Благодарю за отзыв
@quietplayer7733
@quietplayer7733 4 года назад
1 из немногих ютуберов кто внятно объясняет новичкам простыми словами и примерами кода-MVVM, спасибо за контент , надеюсь что это не последнее видео на эту тему и хотелось бы увидеть простенкое приложение на этом патерне, чтобы понять как создавать приложения без лишнего кода))
@mr.developer
@mr.developer 4 года назад
Благодарю за отзыв, приложение-пример будет
@user-tg1yr1dt4n
@user-tg1yr1dt4n 2 года назад
Большое спасибо всё оказывается просто
@mr.developer
@mr.developer 2 года назад
Благодарю за отзыв 🤝
@youandpsycho625
@youandpsycho625 Год назад
Спасибо!
@mr.developer
@mr.developer 8 месяцев назад
Благодарю вас за отзыв, очень приятно ☺️🤝
@elpirato5428
@elpirato5428 3 года назад
спасибо
@openfrom03
@openfrom03 3 года назад
Урок понравился, лайк поставил, подписался. Было бы здорово, если бы соблюдали стилистику кода - ставили отступы. Рефакторинг кода можно сделать сочетанием клавиш CTRL + ALT + L (Win) /OPTION + CMD + L (Mac)
@user-de6dd1dd8e
@user-de6dd1dd8e 3 года назад
Уроки супер ! Друг, сделай пожалуйста про корутины, коль ты их здесь упомянул
@user-vn9fk3mh3c
@user-vn9fk3mh3c 2 года назад
Спасибо тебе за твой труд. Самое понятное объяснение. Если б ты сделал видеокурс по андроид разработке в целом, купил бы даже за деньги.
@itcat8369
@itcat8369 4 года назад
Отличное объяснение, спасибо за ваш труд, надеюсь не остановитесь, так как очень интересно вас слушать. И не думали ли вы также затронуть такие темы, как: dagger/koin, rxJava/corutines
@mr.developer
@mr.developer 4 года назад
Спасибо за отзыв, я подумаю)
@annasakharova922
@annasakharova922 4 года назад
@@mr.developer как постоянным Вашим подписчикам, именно от Вас такие видео было бы просто чудесно изучить)
@abuiman5251
@abuiman5251 3 года назад
👍🏻👍🏻👍🏻
@elpirato5428
@elpirato5428 3 года назад
А покажете на простом примере как тесты проводить, как отдельно тестировать модель, вью, вьюмодель?
@user-hu8uw3fr6m
@user-hu8uw3fr6m Год назад
Всё отлично, ошибок нет: Hello world. ))))
@Nazaro4ka
@Nazaro4ka Год назад
Полюбил этот канал за клавиатурные титры
@mr.developer
@mr.developer 8 месяцев назад
Благодарю вас за отзыв, очень приятно ☺️🤝
@cryptoman7743
@cryptoman7743 3 года назад
В видео, когда прописали корутину значение hello world! не изменилось. И никто этого не заметил((
@alexeymurnikov1413
@alexeymurnikov1413 3 года назад
Тоже это смутило, как только это увидел. Но если посмотреть на код автора, то измениться ничего и не должно было, т.к. он изменял значения лайвдаты в фоновом потоке, а значение текствью не трогал и оно осталось по умолчанию. Если цель была в том, чтобы показать, что в фоновом потоке нужно использовать постВэлью, чтобы избежать ошибок, то все было сделано верно)
@shepelavka
@shepelavka 3 года назад
Тоже заметил. Потом обмотал по видео и увидел - он удалил строчку, где строковое значение из лайвдаты присваивал текстовой вьюхе на активити...))
@user-zi2sl7jh3t
@user-zi2sl7jh3t 3 года назад
я заметил вот хочу тоже написать про это
@user-ke3jt3uh3m
@user-ke3jt3uh3m 3 года назад
Как на 4:56 обратиться к test_text1.text из MainActivity? У меня тупо не видит такого id-шника :(
@user-ke3jt3uh3m
@user-ke3jt3uh3m 3 года назад
Если кому актуально, то в build.gradel module нужно было добавить несколько зависимостей (отдельно от основного всего. В самом начале программы) apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' И после этого станет доступен импорт в MainActivity.kt: import kotlinx.android.synthetic.main.activity_main.*
@user-ke3jt3uh3m
@user-ke3jt3uh3m 3 года назад
p.s. в самых новых версиях нужно просто добавить строчку "id 'kotlin-android-extensions'" в build.gradel module -> plugins
@sno-oze
@sno-oze 4 года назад
Годно, ну, ребята, годно же, а? Даже деда спросил: дед тоже сказал, мол "чётко". Ждём следующего видео, глядишь скоро и до Hilt дойдём.
@trunker2010
@trunker2010 3 года назад
Не очень понял как работает observer, на 24:30 устанавливается observer после изменения, в моем представлении он должен реагировать на изменения только после того, как был установлен
@abuiman5251
@abuiman5251 3 года назад
На 7:27 когда вы передали через postValue данные в LiveData, то как эту строку установить в test_text?? На экране Hello World
@-Alexey-
@-Alexey- 3 года назад
Обсервер повесить
@cinderellarouge
@cinderellarouge 2 года назад
Я тоже заметила
@serioussem6450
@serioussem6450 2 года назад
А какие плагины вы используете в студии? нравиться подсветка кода
@mr.developer
@mr.developer 2 года назад
Это своя тема
@tilt8215
@tilt8215 3 месяца назад
Как ты регистрируешь свой макет в мейн Активити ? Через что ? Нет бандинга и регистрации вьюшек, как ты это делаешь ?
@Valerii07
@Valerii07 3 года назад
Вопрос: правильно понимаю, что Лайвдата всегда автоматом срабатывает и выдает список в вью, если в Комнату вставить или обновить, удалить? А как быть если надо в фоновом режиме подкачивать пополнять те вставлять еще данные из Сервера например из Файербейс, то список в вью будет обновляться что не нужно, или вообще какие то фоновые работы выполняются?
@Valerii07
@Valerii07 3 года назад
Не пользоваться Лайвдата, а сделать мьютоблЛист + обсервер с очисткой его в онДестройВьюМодел и в онСтарт проверять пуст не пуст, если пуст запрос в Комнату далее срабатывает обсервер и список в Вью обновляется. Может так сделать, А ЛайвДате по идее должен быть выкл автооновлений?
@Nidvoraich
@Nidvoraich 3 года назад
Да
@user-xq5jk9dq6g
@user-xq5jk9dq6g 2 года назад
Немного не понял, а почему мы не можем создавать для каждой LiveData свой observe. Он же также отработает. В чем преимущество и тем более использование медиатора если у нас несколько LiveDat??
@mr.developer
@mr.developer 8 месяцев назад
Да наверно можно
@sergeykrivenkov6436
@sergeykrivenkov6436 3 года назад
Откуда столько восторженных отзывов, при том что в коде косяк на косяке?
@user-cp7yq4zd5e
@user-cp7yq4zd5e 3 года назад
7:26 "все отлично, ошибок нет". Но текст "Hello world", а должен быть "Hello live data", разве нет? В чем проблема?
@Nidvoraich
@Nidvoraich 3 года назад
Не должен. Посмотрите код
@halulkin
@halulkin 3 года назад
Он передал значение в liveDateString, но не присвоил его для test_text1. Поэтому текст в TextView остался старым.
@inex550
@inex550 3 года назад
Не понятно зачем мне MediatorLiveData, если я могу просто создать две MutableLiveData, установить им по Observer-у и затем дёргать нужную
@behtold
@behtold 3 года назад
Абсолютно согласен. Автор не объяснил... Полагаю, что данный метод вызывается при каждом обновлении любой из добавленных MutableLiveData и может взаимодействовать между ними.
@kairatkudaibergenov7255
@kairatkudaibergenov7255 3 года назад
пересмотри там всё понятно
@cinderellarouge
@cinderellarouge 2 года назад
Здравствуйте, на минуте 32:58, когда вы поменяли значение postavalue " "hello world " вышло , но должно было "hello there world".
@mr.developer
@mr.developer 2 года назад
🤷‍♂️ я уж не помню)
@iqmaxima
@iqmaxima 2 года назад
Каким образом без findById находить id test_text1 ?
@mr.developer
@mr.developer 2 года назад
Kotlin extension, но сейчас устарели. Используйте VBinding
@mikhaillazarev5378
@mikhaillazarev5378 6 месяцев назад
Про mediatorLiveData как-то с примером не дошло, правильно ли я понял, что по сути эти две LiveData можно спокойно было сделать и без этого mediatora. Лично я не понял его смысл.. Поправить если я не прав.. А так спасибо за видео 😊
@mr.developer
@mr.developer 6 месяцев назад
К сожалению уже не помню ), давно это было. Может поменялось апи
@asp424
@asp424 3 года назад
А если какие-то переменные не изменяются, например, состояние авторизации, то лучше использовать константы или LiveData?
@mr.developer
@mr.developer 3 года назад
Здравствуйте, переменные не бывают неизменяемые, на то они и переменные. Если есть свойства класса которые не изменяется то это константы.
@asp424
@asp424 3 года назад
@@mr.developer понятно, спасибо. Туплю ещё. Всё же, когда лучше константы, а когда LiveData?
@kovanodevelop
@kovanodevelop 3 года назад
Доброго дня! Весьма интересное видео. А как "провалиться"?
@user-pl1zw7cg8y
@user-pl1zw7cg8y 2 года назад
Ctrl + ЛКМ
@mr.developer
@mr.developer 8 месяцев назад
Благодарю за отзыв, очень приятно ☺️🤝
@GriNAME
@GriNAME 2 года назад
Получается медиатор лайвдаты делает так, чтобы обзёрвер был один на все лайвдаты? Если простым языком
@mr.developer
@mr.developer 2 года назад
Да
@user-jr8sz8cf3q
@user-jr8sz8cf3q 3 года назад
Добрый день! Я б купил курс по MVVM, но не через вк,есть варианты?
@mr.developer
@mr.developer 3 года назад
Здравствуйте, в Телеграм t.me/mobile_developing/71
@shantarampampam
@shantarampampam 3 года назад
18:30
@sanek_180st
@sanek_180st 3 года назад
Спасибо, объясняете доступно. LiveData всё понятно. но зачем нужен медиатор (MediatorLiveData) ? мы можем и лайвдате прописать observer ... что без медиатора два раза обсервер, что с медиатором два раза ... суть только в том что появится еще один общий обьединяющий observer ?
@mlazebny
@mlazebny 3 года назад
Более структуризированно и понятно.В программировании ценится код который структуризирован, понятен, сжат.
@sanek_180st
@sanek_180st 3 года назад
@@mlazebny первый код без медиатора: val mLiveData1 = MyLiveDate() val mLiveData2 = MyLiveDate() ... mLiveData1.observe(this, {...}) mLiveData2.observe(this, {...}) ------------------- второй код с медиатором: val mLiveData1 = MyLiveDate() val mLiveData2 = MyLiveDate() val mediatorLiveData = MediatorLiveData() ... mediatorLiveData.addSource(mLiveData1, {...}) mediatorLiveData.addSource(mLiveData2, {...}) --------------- чем он стал структурирован или сжат ?) я вижу разницу только в том что появится общий observer, в этом суть ? или я чтото упустил еще ?
@mlazebny
@mlazebny 3 года назад
@@sanek_180st когда испоользуется 2 разных источника данных лучше использовать mediator, легче взаимодействоваьть с элементами
@sanek_180st
@sanek_180st 3 года назад
@@mlazebny ну вот я в примере привел две лайв даты в чем разница, мы что так что так задаём два обсерва ... Единственное что в медиаторе можно сделать общий обсервер, вы это имеете ввиду ?
@mlazebny
@mlazebny 3 года назад
@@sanek_180st да
@aiwarkzn6728
@aiwarkzn6728 2 года назад
Здравствуйте, а как сделать так чтобы к view можно было обращаться без ссылки через R.id. как это сделано у вас? Это расширение какое то?
@mr.developer
@mr.developer 2 года назад
Да это котлин-расширения. Но сейчас они устарели, используйте ViewBindind
@aiwarkzn6728
@aiwarkzn6728 2 года назад
@@mr.developer Понял, спасибо за ответ 🤝
@KekLolChill
@KekLolChill 4 года назад
При каждом клике на кнопку вешать обсервер так себе идея)
@mr.developer
@mr.developer 4 года назад
Вы правы, но это лишь демонстрация возможностей а не руководство к действию.
@adventuretrip1440
@adventuretrip1440 Год назад
На 7:25 минуте не отображается "Hello live data" там "Hello World"
@mr.developer
@mr.developer 8 месяцев назад
👍
@user-hc8wi1vd1b
@user-hc8wi1vd1b 3 года назад
Самые годные уроки в русскоязычном сегменте. Хотя, когда автор пишет большие программы, то на мой взгляд, слишком много функционально стиля, и если посмотреть на диаграмму классов, то встречаются ошибки при построении архитектуры
@andrewdobosh2153
@andrewdobosh2153 3 года назад
А как вы в котлин коде обращаетесь к элементу UI без его инициализации методом findViewById? 14:50 здесь например вы ставите клик листенер на кнопку используя ее id? Для этого плагин какой-то нужен?
@mr.developer
@mr.developer 3 года назад
Это extension Kotlin. Но сейчас он deprecated. Используйте binding
@user-pq1ku2ut1m
@user-pq1ku2ut1m 4 месяца назад
@@mr.developer А как в этом случае избежать огромного количества слова "binging" в коде?)
@user-be2cy2fb9u
@user-be2cy2fb9u 3 года назад
18:40 не понял в чем прикол, весь каеф подписки лайф даты в том, что ну нежно задумываться о жизненном цикле, все это под капотом делается...
@AlekseyKleon
@AlekseyKleon 3 года назад
Сорян за ламерский вопрос: пытаюсь сделать то же самое в джаве, там нету корутин((( Через Thread не получается - при операции postValue исключения не возникает, но и визуальных изменений нет. Пожалуйста, не советуйте юзать котлин, мне нужно сделать на джаве.
@user-vr5qt8ys2y
@user-vr5qt8ys2y 2 года назад
Не понятно, зачем нужен Transformations.map. Можно ведь сделать просто: ldStrind.value = ldInt.value.toString().
@mr.developer
@mr.developer 2 года назад
Конечно можно, можно вообще ничего не использовать, а писать функциональный код)
@qonahx9743
@qonahx9743 4 года назад
Зачем в onStart() и onStop() подписываться и отписываться от данных, если класс в принципе был создан для того что бы делать это самостоятельно?
@mr.developer
@mr.developer 4 года назад
Здравствуйте, это не отписка а удаление наблюдателя. И это я просто показал, что бы явно было видно , что с объектом можно делать.
@sergeykrivenkov6436
@sergeykrivenkov6436 3 года назад
Автор просто не разобрался в теме которой пытается учить других. Это не может быть "бест практишь", потому что противоречит принципу LiveData - а именно автоматизация. Как раз для того что бы не заниматься подпиской/отпиской на каждый start/stop, в LiveData реализован механизм active/inactive. Тем самым вы не создаете лишних обьектов (observer, observer wrapper), не нагружаете GC, не делаете лишних вычислений. И удалится observer тоже автоматически при переходе Lifecycle в состояние DESTROYED.
@Nidvoraich
@Nidvoraich 3 года назад
Если кому станет намного скучно слушать - просто отвечайте "да" каждый раз, как автор спрашивает это ;)
@user-oi2hk9yt1o
@user-oi2hk9yt1o 3 года назад
А что это за прикол в 19 строке на 5:13 , когда обращение из кода к текст вью идет просто по айди, без findViewById, без viewBinding?
@mr.developer
@mr.developer 3 года назад
Kotlin extension
@user-ru2qq3de4x
@user-ru2qq3de4x 2 года назад
@@mr.developer А как подключить это?
@user-ru2qq3de4x
@user-ru2qq3de4x 2 года назад
@@mr.developer Сорян за беспокойство. Нашёл выше.
@mr.developer
@mr.developer 2 года назад
👍
@fiodar_vasilets
@fiodar_vasilets 2 года назад
так зачем нам медиатор не опнятно ведь и так можно observe подписать на сами LiveData, сделали пустой observe у медиатара, и оставить его пустым ? для чего?
@mr.developer
@mr.developer 8 месяцев назад
👍
@fiodar_vasilets
@fiodar_vasilets 8 месяцев назад
@@mr.developer И что это значит?)
@mr.developer
@mr.developer 8 месяцев назад
Можно по разному)
@fiodar_vasilets
@fiodar_vasilets 8 месяцев назад
Да это понятно) что может быть несколько решений у задачи, но они как бы должны предоставлять свою логику с + и - от других вариантов, а тут я просто хотел бы узнать для чего нам это тут вообще и не лишнее ли это)@@mr.developer
@mr.developer
@mr.developer 8 месяцев назад
@fiodar_vasilets ох, я к сожелению сейчас не вспомню нюансов. Давно это было 🤷‍♂️
@Nidvoraich
@Nidvoraich 3 года назад
Про медиатор. Прежде, чем объяснять, как оно работает - нужно сначала объяснить, зачем оно нужно. Ну отслеживает медиатор сразу две даты. А толку от этого? Насколько я понимаю - слово медиатор как бы подсказывает, что таким образом можно реализовать взаимообмен данными между лайв датами. Но это только предположение. Резюме: чтоб было проще объяснить - сначала ставьте перед учеником проблему. А потом рассказывайте, как её можно решить. А то знание об инструменте получено, а на какую полку этот инструмент положить - непонятно.
@cubuanic
@cubuanic 4 года назад
В описании линк на Котлин обрезан. Вот нормальный линк: ru-vid.com/group/PLY8G5DMG6TiNVIy6sZ0RHb14nKDFG7uQc
@mr.developer
@mr.developer 4 года назад
Спаисибо
@agp1444
@agp1444 3 года назад
помоему это не лайвдата подписывается на активити, а активити - на лайвдату
@mr.developer
@mr.developer 8 месяцев назад
👍
@user-zo7mz4lp9r
@user-zo7mz4lp9r 2 года назад
А что нормально то с корутинами, там же не тот текст был. Там был просто Hello Word пересмотри сам видео
@mr.developer
@mr.developer 8 месяцев назад
👍
@spornov91
@spornov91 Год назад
можно утонуть от такого колличества лишних слов.
@mr.developer
@mr.developer 8 месяцев назад
🙈
@azimjon0910
@azimjon0910 Год назад
А в чем разница между подходами liveData.observe(this, Observer) и mediatorLD.addSource(liveData, Observer)?
@mr.developer
@mr.developer 8 месяцев назад
🤷‍♂️
@NeSpor6
@NeSpor6 2 года назад
спасибо
@mr.developer
@mr.developer 2 года назад
Благодарю за отзыв 🤝
Далее
Шаблон MVVM по-простому. Navigation.
19:53
Шаблон MVVM по-простому. Lifecycle.
19:55
Миграция с LiveData на Coroutines Flow
25:02
MVVM в Android на практике
41:32
Просмотров 46 тыс.