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

Sdílet
Vložit
  • čas přidán 18. 07. 2020
  • Приветствую 🖐 друзья, в данных видео уроках мы с вами изучим компонент 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 #создатьприложение

Komentáře • 129

  • @mr.developer
    @mr.developer  Před 3 lety +2

    Можно поддержать автора и канал 🤝 купив полный курс по 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.

  • @8Sapphire8
    @8Sapphire8 Před 3 lety +1

    Ты крут, подача бомба, я такого пока не встречал. Очень полезно.

  • @NevilPlay
    @NevilPlay Před 3 lety +2

    Прекрасное объяснение работы LiveData, перечислены множество способов работать с БД. Пока новичок в AS Kotlin, немного сложно изучать данный паттерн, думаю, что со временем все пойму. Спасибо!

  • @kuzd4niil
    @kuzd4niil Před 2 lety

    Отличный видеоурок. Большое спасибо

  • @user-ky2zi4fp9r
    @user-ky2zi4fp9r Před 2 lety

    Спасибо! Отличный ролик, после просмотра стало понятно, как работает LiveData.

    • @mr.developer
      @mr.developer  Před 2 lety

      Благодарю вас за отзыв 🤝

  • @annasakharova922
    @annasakharova922 Před 4 lety +9

    Один из лучших каналов по мобильной разработке на ютубе. Просто супер, все доступно.

  • @user-sq5cr5uq8i
    @user-sq5cr5uq8i Před 3 lety

    Шикарные уроки! Ты лучшииииий

  • @user-cm6ke4ys7h
    @user-cm6ke4ys7h Před 2 lety +1

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

  • @quietplayer7733
    @quietplayer7733 Před 4 lety +2

    1 из немногих ютуберов кто внятно объясняет новичкам простыми словами и примерами кода-MVVM, спасибо за контент , надеюсь что это не последнее видео на эту тему и хотелось бы увидеть простенкое приложение на этом патерне, чтобы понять как создавать приложения без лишнего кода))

    • @mr.developer
      @mr.developer  Před 4 lety +1

      Благодарю за отзыв, приложение-пример будет

  • @openfrom03
    @openfrom03 Před 3 lety

    Урок понравился, лайк поставил, подписался.
    Было бы здорово, если бы соблюдали стилистику кода - ставили отступы.
    Рефакторинг кода можно сделать сочетанием клавиш CTRL + ALT + L (Win) /OPTION + CMD + L (Mac)

  • @user-de6dd1dd8e
    @user-de6dd1dd8e Před 3 lety +9

    Уроки супер ! Друг, сделай пожалуйста про корутины, коль ты их здесь упомянул

  • @ipvoodoo
    @ipvoodoo Před 4 lety

    Спасибо, отлично объяснил!

  • @Arman_127
    @Arman_127 Před 2 lety +1

    Большое спасибо всё оказывается просто

  • @youandpsycho625
    @youandpsycho625 Před rokem +1

    Спасибо!

    • @mr.developer
      @mr.developer  Před 8 měsíci

      Благодарю вас за отзыв, очень приятно ☺️🤝

  • @itcat8369
    @itcat8369 Před 4 lety +13

    Отличное объяснение, спасибо за ваш труд, надеюсь не остановитесь, так как очень интересно вас слушать. И не думали ли вы также затронуть такие темы, как: dagger/koin, rxJava/corutines

    • @mr.developer
      @mr.developer  Před 4 lety +7

      Спасибо за отзыв, я подумаю)

    • @annasakharova922
      @annasakharova922 Před 4 lety +3

      @@mr.developer как постоянным Вашим подписчикам, именно от Вас такие видео было бы просто чудесно изучить)

  • @elpirato5428
    @elpirato5428 Před 3 lety +2

    спасибо

  • @elpirato5428
    @elpirato5428 Před 3 lety +6

    А покажете на простом примере как тесты проводить, как отдельно тестировать модель, вью, вьюмодель?

  • @user-vn9fk3mh3c
    @user-vn9fk3mh3c Před 2 lety +5

    Спасибо тебе за твой труд. Самое понятное объяснение. Если б ты сделал видеокурс по андроид разработке в целом, купил бы даже за деньги.

  • @user-hu8uw3fr6m
    @user-hu8uw3fr6m Před rokem +1

    Всё отлично, ошибок нет: Hello world. ))))

  • @abuiman5251
    @abuiman5251 Před 3 lety

    👍🏻👍🏻👍🏻

  • @sno-oze
    @sno-oze Před 4 lety +6

    Годно, ну, ребята, годно же, а? Даже деда спросил: дед тоже сказал, мол "чётко". Ждём следующего видео, глядишь скоро и до Hilt дойдём.

  • @cryptoman7743
    @cryptoman7743 Před 3 lety +7

    В видео, когда прописали корутину значение hello world! не изменилось. И никто этого не заметил((

    • @alexeymurnikov1413
      @alexeymurnikov1413 Před 3 lety +2

      Тоже это смутило, как только это увидел. Но если посмотреть на код автора, то измениться ничего и не должно было, т.к. он изменял значения лайвдаты в фоновом потоке, а значение текствью не трогал и оно осталось по умолчанию. Если цель была в том, чтобы показать, что в фоновом потоке нужно использовать постВэлью, чтобы избежать ошибок, то все было сделано верно)

    • @shepelavka
      @shepelavka Před 3 lety

      Тоже заметил. Потом обмотал по видео и увидел - он удалил строчку, где строковое значение из лайвдаты присваивал текстовой вьюхе на активити...))

    • @user-zi2sl7jh3t
      @user-zi2sl7jh3t Před 3 lety +1

      я заметил вот хочу тоже написать про это

  • @trunker2010
    @trunker2010 Před 3 lety +1

    Не очень понял как работает observer, на 24:30 устанавливается observer после изменения, в моем представлении он должен реагировать на изменения только после того, как был установлен

  • @Nazaro4ka
    @Nazaro4ka Před rokem +1

    Полюбил этот канал за клавиатурные титры

    • @mr.developer
      @mr.developer  Před 8 měsíci

      Благодарю вас за отзыв, очень приятно ☺️🤝

  • @tilt8215
    @tilt8215 Před 3 měsíci

    Как ты регистрируешь свой макет в мейн Активити ? Через что ? Нет бандинга и регистрации вьюшек, как ты это делаешь ?

  • @user-ke3jt3uh3m
    @user-ke3jt3uh3m Před 3 lety +4

    Как на 4:56 обратиться к test_text1.text из MainActivity? У меня тупо не видит такого id-шника :(

    • @user-ke3jt3uh3m
      @user-ke3jt3uh3m Před 3 lety +2

      Если кому актуально, то в 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 Před 3 lety +7

      p.s. в самых новых версиях нужно просто добавить строчку "id 'kotlin-android-extensions'" в build.gradel module -> plugins

  • @abuiman5251
    @abuiman5251 Před 3 lety +2

    На 7:27 когда вы передали через postValue данные в LiveData, то как эту строку установить в test_text?? На экране Hello World

  • @Valerii07
    @Valerii07 Před 3 lety +1

    Вопрос: правильно понимаю, что Лайвдата всегда автоматом срабатывает и выдает список в вью, если в Комнату вставить или обновить, удалить? А как быть если надо в фоновом режиме подкачивать пополнять те вставлять еще данные из Сервера например из Файербейс, то список в вью будет обновляться что не нужно, или вообще какие то фоновые работы выполняются?

    • @Valerii07
      @Valerii07 Před 3 lety

      Не пользоваться Лайвдата, а сделать мьютоблЛист + обсервер с очисткой его в онДестройВьюМодел и в онСтарт проверять пуст не пуст, если пуст запрос в Комнату далее срабатывает обсервер и список в Вью обновляется. Может так сделать, А ЛайвДате по идее должен быть выкл автооновлений?

  • @serioussem6450
    @serioussem6450 Před 2 lety

    А какие плагины вы используете в студии? нравиться подсветка кода

  • @user-xq5jk9dq6g
    @user-xq5jk9dq6g Před 2 lety +1

    Немного не понял, а почему мы не можем создавать для каждой LiveData свой observe. Он же также отработает. В чем преимущество и тем более использование медиатора если у нас несколько LiveDat??

  • @user-cp7yq4zd5e
    @user-cp7yq4zd5e Před 3 lety +12

    7:26 "все отлично, ошибок нет". Но текст "Hello world", а должен быть "Hello live data", разве нет? В чем проблема?

    • @Nidvoraich
      @Nidvoraich Před 3 lety +2

      Не должен. Посмотрите код

    • @halulkin
      @halulkin Před 3 lety +1

      Он передал значение в liveDateString, но не присвоил его для test_text1. Поэтому текст в TextView остался старым.

  • @asp424
    @asp424 Před 3 lety

    А если какие-то переменные не изменяются, например, состояние авторизации, то лучше использовать константы или LiveData?

    • @mr.developer
      @mr.developer  Před 3 lety

      Здравствуйте, переменные не бывают неизменяемые, на то они и переменные. Если есть свойства класса которые не изменяется то это константы.

    • @asp424
      @asp424 Před 3 lety

      @@mr.developer понятно, спасибо. Туплю ещё. Всё же, когда лучше константы, а когда LiveData?

  • @kovanodevelop
    @kovanodevelop Před 3 lety +2

    Доброго дня! Весьма интересное видео. А как "провалиться"?

    • @user-pl1zw7cg8y
      @user-pl1zw7cg8y Před 2 lety +1

      Ctrl + ЛКМ

    • @mr.developer
      @mr.developer  Před 8 měsíci

      Благодарю за отзыв, очень приятно ☺️🤝

  • @Nidvoraich
    @Nidvoraich Před 3 lety

    Да

  • @sergeykrivenkov6436
    @sergeykrivenkov6436 Před 3 lety +1

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

  • @cinderellarouge
    @cinderellarouge Před 2 lety

    Здравствуйте, на минуте 32:58, когда вы поменяли значение postavalue " "hello world " вышло , но должно было "hello there world".

  • @mikhaillazarev5378
    @mikhaillazarev5378 Před 6 měsíci +1

    Про mediatorLiveData как-то с примером не дошло, правильно ли я понял, что по сути эти две LiveData можно спокойно было сделать и без этого mediatora. Лично я не понял его смысл.. Поправить если я не прав..
    А так спасибо за видео 😊

    • @mr.developer
      @mr.developer  Před 6 měsíci +1

      К сожалению уже не помню ), давно это было. Может поменялось апи

  • @user-hc8wi1vd1b
    @user-hc8wi1vd1b Před 3 lety

    Самые годные уроки в русскоязычном сегменте. Хотя, когда автор пишет большие программы, то на мой взгляд, слишком много функционально стиля, и если посмотреть на диаграмму классов, то встречаются ошибки при построении архитектуры

  • @user-jr8sz8cf3q
    @user-jr8sz8cf3q Před 3 lety

    Добрый день! Я б купил курс по MVVM, но не через вк,есть варианты?

    • @mr.developer
      @mr.developer  Před 3 lety +1

      Здравствуйте, в Телеграм
      t.me/mobile_developing/71

  • @sanek_180st
    @sanek_180st Před 3 lety +3

    Спасибо, объясняете доступно. LiveData всё понятно. но зачем нужен медиатор (MediatorLiveData) ? мы можем и лайвдате прописать observer ... что без медиатора два раза обсервер, что с медиатором два раза ... суть только в том что появится еще один общий обьединяющий observer ?

    • @mlazebny
      @mlazebny Před 3 lety

      Более структуризированно и понятно.В программировании ценится код который структуризирован, понятен, сжат.

    • @sanek_180st
      @sanek_180st Před 3 lety +2

      @@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 Před 3 lety

      @@sanek_180st когда испоользуется 2 разных источника данных лучше использовать mediator, легче взаимодействоваьть с элементами

    • @sanek_180st
      @sanek_180st Před 3 lety +3

      @@mlazebny ну вот я в примере привел две лайв даты в чем разница, мы что так что так задаём два обсерва ... Единственное что в медиаторе можно сделать общий обсервер, вы это имеете ввиду ?

    • @mlazebny
      @mlazebny Před 3 lety

      @@sanek_180st да

  • @GriNAME
    @GriNAME Před 2 lety

    Получается медиатор лайвдаты делает так, чтобы обзёрвер был один на все лайвдаты? Если простым языком

  • @aiwarkzn6728
    @aiwarkzn6728 Před 2 lety

    Здравствуйте, а как сделать так чтобы к view можно было обращаться без ссылки через R.id. как это сделано у вас? Это расширение какое то?

    • @mr.developer
      @mr.developer  Před 2 lety +1

      Да это котлин-расширения. Но сейчас они устарели, используйте ViewBindind

    • @aiwarkzn6728
      @aiwarkzn6728 Před 2 lety

      @@mr.developer Понял, спасибо за ответ 🤝

  • @iqmaxima
    @iqmaxima Před 2 lety +1

    Каким образом без findById находить id test_text1 ?

    • @mr.developer
      @mr.developer  Před 2 lety +1

      Kotlin extension, но сейчас устарели. Используйте VBinding

  • @shantarampampam
    @shantarampampam Před 3 lety

    18:30

  • @inex550
    @inex550 Před 3 lety +15

    Не понятно зачем мне MediatorLiveData, если я могу просто создать две MutableLiveData, установить им по Observer-у и затем дёргать нужную

    • @behtold
      @behtold Před 3 lety +1

      Абсолютно согласен. Автор не объяснил... Полагаю, что данный метод вызывается при каждом обновлении любой из добавленных MutableLiveData и может взаимодействовать между ними.

    • @kairatkudaibergenov7255
      @kairatkudaibergenov7255 Před 3 lety

      пересмотри там всё понятно

  • @andrewdobosh2153
    @andrewdobosh2153 Před 3 lety

    А как вы в котлин коде обращаетесь к элементу UI без его инициализации методом findViewById? 14:50 здесь например вы ставите клик листенер на кнопку используя ее id? Для этого плагин какой-то нужен?

    • @mr.developer
      @mr.developer  Před 3 lety +2

      Это extension Kotlin. Но сейчас он deprecated. Используйте binding

    • @user-pq1ku2ut1m
      @user-pq1ku2ut1m Před 4 měsíci

      @@mr.developer А как в этом случае избежать огромного количества слова "binging" в коде?)

  • @KekLolChill
    @KekLolChill Před 4 lety +3

    При каждом клике на кнопку вешать обсервер так себе идея)

    • @mr.developer
      @mr.developer  Před 4 lety

      Вы правы, но это лишь демонстрация возможностей а не руководство к действию.

  • @adventuretrip1440
    @adventuretrip1440 Před rokem +1

    На 7:25 минуте не отображается "Hello live data" там "Hello World"

  • @user-be2cy2fb9u
    @user-be2cy2fb9u Před 3 lety +2

    18:40 не понял в чем прикол, весь каеф подписки лайф даты в том, что ну нежно задумываться о жизненном цикле, все это под капотом делается...

  • @AlekseyKleon
    @AlekseyKleon Před 3 lety +1

    Сорян за ламерский вопрос: пытаюсь сделать то же самое в джаве, там нету корутин((( Через Thread не получается - при операции postValue исключения не возникает, но и визуальных изменений нет. Пожалуйста, не советуйте юзать котлин, мне нужно сделать на джаве.

  • @qonahx9743
    @qonahx9743 Před 4 lety +1

    Зачем в onStart() и onStop() подписываться и отписываться от данных, если класс в принципе был создан для того что бы делать это самостоятельно?

    • @mr.developer
      @mr.developer  Před 4 lety +1

      Здравствуйте, это не отписка а удаление наблюдателя. И это я просто показал, что бы явно было видно , что с объектом можно делать.

    • @sergeykrivenkov6436
      @sergeykrivenkov6436 Před 3 lety +6

      Автор просто не разобрался в теме которой пытается учить других. Это не может быть "бест практишь", потому что противоречит принципу LiveData - а именно автоматизация. Как раз для того что бы не заниматься подпиской/отпиской на каждый start/stop, в LiveData реализован механизм active/inactive. Тем самым вы не создаете лишних обьектов (observer, observer wrapper), не нагружаете GC, не делаете лишних вычислений. И удалится observer тоже автоматически при переходе Lifecycle в состояние DESTROYED.

  • @cubuanic
    @cubuanic Před 4 lety

    В описании линк на Котлин обрезан.
    Вот нормальный линк: czcams.com/play/PLY8G5DMG6TiNVIy6sZ0RHb14nKDFG7uQc.html

  • @user-vr5qt8ys2y
    @user-vr5qt8ys2y Před 3 lety

    Не понятно, зачем нужен Transformations.map. Можно ведь сделать просто: ldStrind.value = ldInt.value.toString().

    • @mr.developer
      @mr.developer  Před 2 lety

      Конечно можно, можно вообще ничего не использовать, а писать функциональный код)

  • @Nidvoraich
    @Nidvoraich Před 3 lety

    Если кому станет намного скучно слушать - просто отвечайте "да" каждый раз, как автор спрашивает это ;)

  • @user-oi2hk9yt1o
    @user-oi2hk9yt1o Před 3 lety

    А что это за прикол в 19 строке на 5:13 , когда обращение из кода к текст вью идет просто по айди, без findViewById, без viewBinding?

  • @Nidvoraich
    @Nidvoraich Před 3 lety +4

    Про медиатор. Прежде, чем объяснять, как оно работает - нужно сначала объяснить, зачем оно нужно.
    Ну отслеживает медиатор сразу две даты. А толку от этого?
    Насколько я понимаю - слово медиатор как бы подсказывает, что таким образом можно реализовать взаимообмен данными между лайв датами. Но это только предположение.
    Резюме: чтоб было проще объяснить - сначала ставьте перед учеником проблему. А потом рассказывайте, как её можно решить.
    А то знание об инструменте получено, а на какую полку этот инструмент положить - непонятно.

  • @fiodar_vasilets
    @fiodar_vasilets Před 2 lety +1

    так зачем нам медиатор не опнятно ведь и так можно observe подписать на сами LiveData, сделали пустой observe у медиатара, и оставить его пустым ? для чего?

    • @mr.developer
      @mr.developer  Před 8 měsíci

      👍

    • @fiodar_vasilets
      @fiodar_vasilets Před 8 měsíci

      @@mr.developer И что это значит?)

    • @mr.developer
      @mr.developer  Před 8 měsíci

      Можно по разному)

    • @fiodar_vasilets
      @fiodar_vasilets Před 8 měsíci

      Да это понятно) что может быть несколько решений у задачи, но они как бы должны предоставлять свою логику с + и - от других вариантов, а тут я просто хотел бы узнать для чего нам это тут вообще и не лишнее ли это)@@mr.developer

    • @mr.developer
      @mr.developer  Před 8 měsíci

      @fiodar_vasilets ох, я к сожелению сейчас не вспомню нюансов. Давно это было 🤷‍♂️

  • @user-zo7mz4lp9r
    @user-zo7mz4lp9r Před 2 lety

    А что нормально то с корутинами, там же не тот текст был. Там был просто Hello Word пересмотри сам видео

  • @agp1444
    @agp1444 Před 3 lety +1

    помоему это не лайвдата подписывается на активити, а активити - на лайвдату

  • @spornov91
    @spornov91 Před rokem +1

    можно утонуть от такого колличества лишних слов.

  • @azimjon0910
    @azimjon0910 Před rokem +1

    А в чем разница между подходами
    liveData.observe(this, Observer) и mediatorLD.addSource(liveData, Observer)?

  • @NeSpor6
    @NeSpor6 Před 2 lety +1

    спасибо