Урок 48: "Основы Flutter - инхерит (InheritedWidget, InheritedModel, InheritedNotifier)

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

КОМЕНТАРІ • 103

  • @dan.gorbunov
    @dan.gorbunov 2 роки тому +5

    Ты был прав. Это видео за один раз не пересмотреть и за два тоже))

  • @dan.gorbunov
    @dan.gorbunov 2 роки тому +7

    Женя, привет. Это круто. Не могу не написать тебе свой восторг! Я на 25 минуте попал в ступор с вопросом Зачем!??? И ты тут же на него ответил!!! Это уровень бога в понимании! Спасибо. Я знаю о чем говорю, у меня такое есть когда я хапкидо преподаю. Ты словно маг и мы смотрим на тебя и ты знаешь наперед все наши мысли...

  • @k700pp
    @k700pp 3 місяці тому

    Начал понимать этот урок только с 4-ого просмотра и после того как пытался сам потыкать. Сложная и важная тема. Спасибо за такое подробное разъяснение.

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

    ВСЁ ПО ПОЛОЧКАМ. Уроки просто топ. Полуторачасовой видео на одном дыхании.

  • @AkniyetBegimkulov
    @AkniyetBegimkulov Рік тому +2

    Спасибо за курс, посмотрел все ваши видео, самое тяжелое видео для моего понимания было это видео.

  • @Ivan_leschev
    @Ivan_leschev 2 роки тому +8

    Спасибо большое, без ваших уроков не представляю изучение Flutter, просто не могу выразить словами как ваши уроки мне помогают, спасибо вам за Все !

  • @ArtemFun
    @ArtemFun 3 роки тому +6

    Прикольно! Я этого не знал вообще, несмотря на то, что уже написал пару приложух. Но по первым двум минутам, стало ясно, что это как-раз про то, что делает мой любимый Provider )

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

      провайдер это просто немного заготовок для инхерита и знать это нужно)

    • @ArtemFun
      @ArtemFun 3 роки тому +9

      @@LearnDartFlutter Ну провайдер облегчает работу с этим, про провайдер написано "A wrapper around InheritedWidget to make them easier to use and more reusable." А еще это топовый пакадж на паб.дев (вообще именно первый в топе), поэтому разобраться и запилить видос по такому важному пакету обязательно нужно )
      ну всё-равно же придется, что-то юзать для управления состоянием, раньше вот был bloc, олдфаги флаттера за него топят, но он сложней чем провайдер для новичков. В провайдере нужно просто правильно архитектуру прописывать и всё будет ок, а так, он позволяет легко забыдлокодиться на уровне 9-го класса и всё будет тоже работать, до какой-то степени ))
      Ты просто, судя по моим ощущениям, самые профессиональные видео снимаешь на тему Флаттера спасибо, что взялся за это. Было бы очень круто, если бы ты показал, как правильно Провайдер юзать, с твоей профессиональной точки зрения. Это было-бы бесценное видео и просмотров будет много, судя по тому, что это важный топовый пакедж.

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

    Благодаря вам я нашел работу, спасибо!

  • @kantulaev
    @kantulaev 2 роки тому +6

    Пока самое сложное из того что прошел) Но так даже интереснее!

  • @dmitry9088
    @dmitry9088 3 роки тому +8

    Спасибо за видео!👍 Смотрел несколько часов, тяжело далось)

  • @stanlygetz9616
    @stanlygetz9616 3 роки тому +8

    Спасибо большое за подробное объяснение Flutter! У Вас лучшие уроки по Flutter!

  • @pavlobaraniuk8197
    @pavlobaraniuk8197 3 роки тому +4

    Только читал про них и тут опа, видосик. Спасибо большое за ваш труд!!!

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

    спасибо! понял теперь для чего const нужен ))

  • @burbon___7118
    @burbon___7118 Рік тому +2

    уроки - бомба. С первого урока смотрю. Но вот сейчас я встрял конкретно. 3 дня пересматриваю. На 3 день понял хоть что-то, но для меня пока это ооочень сложно(

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

      тоже самое... как у тебя сейчас обстоят дела с этим?

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

      @@VladimirOnokhov В следующих уроках постоянно задействуют инхериты. Поэтому постепенно стало понятнее. Главное, духом не падать и всё получится. Удачи в изучении!

    • @VladimirOnokhov
      @VladimirOnokhov Рік тому +1

      @@burbon___7118 спасибо, что ответил. и тебе тоже удчаи!

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

    Харе Кришна 🙏😌 со второго просмотра что-то стало доходить)

  • @mrexpipo4372
    @mrexpipo4372 11 місяців тому +1

    сложно, очень сложно если бы мы знали что это такое мы не знаем что это такое. Мы конечно при своей необразованности можем даже предположить что это диверсия какая то .
    ❤ спасибо за видео

  • @biobojlk8833
    @biobojlk8833 2 роки тому +4

    Спасибо большое! было полезно и познавательно.

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

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

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

    Спасибо, супер полезная инфа!

  • @КостяСмит-з3ь
    @КостяСмит-з3ь 3 роки тому +6

    В примере с InheritedNotifier, метод build вызывается также и у TextField'ов и у ElevatedButton, потому что везде подписывались на изменения инхерита этой строкой:
    SimpleCalcWidgetProvider.of(context), которая содержит в себе -> context.dependOnInheritedWidgetOfExactType();
    Как мы знаем dependOnInheritedWidgetOfExactType получает и подписывается на инхерит.
    Я решил данную проблему с помощью getElementForInheritedWidgetOfExactType, который позволяет только получить инхерит.
    1) Создал статический метод getProvider со следующим кодом:
    static SimpleCalcWidgetProvider? getProvider(BuildContext context) {
    final element = context
    .getElementForInheritedWidgetOfExactType();
    final provider = element?.widget as SimpleCalcWidgetProvider;
    return provider;
    }
    2) Заменил у TextField'ов и у ElevatedButton вызов .of на .getProvider
    P.s. Может быть я что-то пропустил, просматривая видео, и моя надстройка бессмысленна, но я новичок, мне простительно :3. Если это неправильно, поправьте пожалуйста.

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

    Мощно! Спасибо за видео! 🤝

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

    Спасибо вам за большой урок
    you are number one blogger

  • @УлицкийАлександр
    @УлицкийАлександр 29 днів тому

    Хороший урок. Бомба

  • @PavelGlazachev-b4n
    @PavelGlazachev-b4n Рік тому +1

    Спасибо Евгений, как всегда ТОП

  • @andrewkozin7326
    @andrewkozin7326 2 роки тому +2

    Спасибо за видео! Я попробовал: корневой SimpleCalcWidget тоже может быть StatelessWidget (в варианте с InheritedNotifier).

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

    Прочитал на хабре не до конца догнал , но тут прям всё четко )

  • @lifewear.reseller
    @lifewear.reseller 2 роки тому +2

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

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

      Есть расширение для vscode. Awesome flutter snippets

    • @lifewear.reseller
      @lifewear.reseller 2 роки тому

      @@LearnDartFlutter Понял спасибо, только я android studio пользуюсь. Вы бы посоветовали перейти на VS code ? Есть какая нибудь существиная разница?

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

      @@lifewear.reseller для студии тоже есть какой то плагин кажется

  • @ВладГончар-э7ц
    @ВладГончар-э7ц 4 місяці тому

    третий раз возвращаюсь к видосу

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

    Спасибо!! !

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

    Good lesson 👍🏻

  • @tkachis
    @tkachis 2 роки тому +2

    Привет, отличный контент, большое спасибо за проделанную работу!!! Подскажи, почему глобальные данные с архитектурной точки зрения - это плохо? (может есть хорошая статья на эту тему). Относится ли к глобальным данным глобальный стейт (например, flux подход)?
    Я пришел во флаттер с веб разработки и мне кажется неудобным то, что используя провайдер или блок для управления стейтом, стейт получается намертво "встроенным" в дерево. Вместо того, чтобы он был как бы над всем приложением. Как в том же redux mobx. Может я просто не до конца разобрался еще...

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

      Это очень долгий разговор для комментария, но редакс нормально использовать

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

    Проще было бы использовать Equitable для модели. Тогда можно было бы убрать наследование модели от ChangeNotifier и момент с didchangedependencies, что сильно бы всё упростило. Ну и полезно было бы показать связку стейтфул+инхеритед, чтобы и жизненный цикл был и O(1) поиска.

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

      Ютюб большой, можно записать свой туториал, велком)

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

      @@LearnDartFlutter у меня нет твоего таланта учителя, а уж как велика моя лень...

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

    Женя вопрос, как сделать шаблоны, для создания виджетов как у тебя?

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

      Поддерживаю вопрос

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

      надо снипеты настраивать, в телегу напишите, я файл скину.

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

    инхериты мощь!!!

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

    Приветствую! А почему бы не унаследовать провайдер от генерика ?

  • @Игорь-м3т6ч
    @Игорь-м3т6ч 4 місяці тому

    Видос клевый но есть вопрос. didChangeDependencies - собственно искал как этот метод работает. и подозреваю что вызывается может не 1 раз, в отличие от initState

  • @СтаниславЛагун-х4й
    @СтаниславЛагун-х4й 2 роки тому +1

    Все понятно, но нужно все опробовать ручками.

  • @ПавелШистеров
    @ПавелШистеров 2 роки тому

    Вопрос по InheritedNotifier. В корневом виджете мы создаем объект _model. Потом как параметр передаем _model в InheritedNotifier, где тоже ее запоминаем как переменную уже этого объекта.
    Получается мы в 2-х местах храним _model, и еще как параметр супер-классу передаем.
    Это нормально, не будет тут никаких коллизий?

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

      А какие коллизии там могут появится?

    • @ПавелШистеров
      @ПавелШистеров 2 роки тому

      @@LearnDartFlutter честно не знаю. Возможно плохая идея хранить экземпляры в разных объектах со своими жизненными циклами.
      Собственно и хотел узнать ответ на свой вопрос.
      Нет тут опасностей?

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

    Посмотрел видос понял чего там дженерик не вписался Из за static им же изолируешь от среды класса метод не может определить тип в методе статик у Т конструкция получается следующая чтобы работала нужно дать компилятору больше данных о типе модели с которым работает провайдер, код такой вот получается
    class ChangeNotifierProvaider
    extends InheritedNotifier {
    final Model model;
    const ChangeNotifierProvaider(
    {super.key,
    required super.child,
    required super.notifier,
    required this.model});
    static M? of(
    BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType()?.model as M;
    }
    }

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

    реально понять такие штуки сложно. не знаю сколько раз смотрел

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

    26:13 "по поводу многословности " строки 80--84 и .... 29:33 строки 80-92 , и в чем фишка? , в том что дженерик можем потом еще использовать в другом месте?? или чтото другое?
    суть понял как сделать, а каков выхлоп от этого не уловил. Сорян.

  • @ПавелШистеров
    @ПавелШистеров 2 роки тому +1

    В конце в статичной функции of нет return. Есть return null, но нет return provider.model as T;

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

      ничего не понял

    • @ПавелШистеров
      @ПавелШистеров 2 роки тому

      @@LearnDartFlutter 1:35:00 Код функции не возвращает значение: if (provider != null) { provider.model as T;} else {return null;} Получается, что при срабатывании условия функция ничего не возвращает.

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

      @@ПавелШистеров и правда, я это пропустил, но позже в видео я таки напишу этот дженерик)

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

    Спасибо за контент, сравни пожалуйста swift и flutter в плане сложности освоения и написания приложений. То что UIKit намного сложнее чем flutter а SwiftUI менее сложен я понимаю, но возможно ты что то более конкретное можешь рассказать.

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

      Там нет никакой принципиальной разницы в освоении)

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

      @@LearnDartFlutter
      Посмотрел видос понял чего там дженерик не вписался Из за static им же изолируешь от среды класса метод не может определить тип в методе статик у Т конструкция получается следующая чтобы работала нужно дать компилятору больше данных о типе модели с которым работает провайдер, код такой вот получается
      class ChangeNotifierProvaider
      extends InheritedNotifier {
      final Model model;
      const ChangeNotifierProvaider(
      {super.key,
      required super.child,
      required super.notifier,
      required this.model});
      static M? of(
      BuildContext context) {
      return context.dependOnInheritedWidgetOfExactType()?.model as M;
      }
      }

  • @DarDarbl4
    @DarDarbl4 3 роки тому +4

    Чет перемудрил с примером по моему. Не совсем понятно почему в didChangeDependency почему не в init? didChangeDep тоже вызывается потенциально более одного раза? В общем не понятно с didChange.. когда конкретно он срабатывает)

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

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

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

      Кстати, хороший вопрос, у меня тоже возник

    • @Антон-ы3д7ъ
      @Антон-ы3д7ъ 3 роки тому +1

      Главное отличие didChangeDependency от onInit, в том, что didChangeDependency вызывается так же один раз, но чуть позже onInit, и в нем уже есть context. А в onInit его еще нет.

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

    Why to use getElementForInheritedWidgetOfExactType in order just to observe the value(get the inherited Widget, cast to myInherited one, then apply to the value, when you can just envoke getInheritedWidgetOfExactType and at once obtain value. Who can explain me this ?

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

    А если просто написать компаратор для SimpleCalcWidgetModel то ведь функция updateShouldNotify у InheritedWidget должна сработать? Тогда и не надо было бы переобразовывать ResultWidget в stateful. Разве не так? Или я что-то недопонимаю 🤷🏻‍♂

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

      Я уже не очень помню о чем там урок, можно больше информации?)

  • @mytiktokaccount4739
    @mytiktokaccount4739 4 місяці тому

    Пожалуйста ответьте кто разбирается, разве в примере где автор разбирал InheritedNotifier он не обновлял все виджеты которые подписаны на инхерит? Тогда какой смысл от этого инхерита если он обновил и текст филды и кнопку и результат

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

      I wanted to talk about it. It seems that all childrens' build methods is called, I also check them using debug tool. So, if the initial problem was the fact that it updates not necessarily widgets, it still do the same

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

    Хотите сэкономить время? Начинайте смотреть с 1:20:00

  • @ЕгорАльтшулер
    @ЕгорАльтшулер 3 роки тому +3

    Народ, слушайте 1,25x, будет сразу хорошо усваиваться.

  • @Макс523
    @Макс523 2 роки тому

    OK!

  • @r.kucherenko
    @r.kucherenko 2 роки тому +1

    начиная с нотифаера я поплыл

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

    T должен экстендить Listeneble, а не ChangeNotifier(Fox)

  • @poteryal_trusy
    @poteryal_trusy 3 роки тому +4

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

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

      вышло разобраться? можете поделиться опытом как совладать с информацией которую дали в видосе?))

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

      @@morrigan_ghostа как у вас? вышло?

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

    1:37:17 Евгений пошутил на счёт блокировки ютуба, тогда это казалось невероятным, но сейчас уже не смешно.

  • @servolskiy2281
    @servolskiy2281 2 роки тому +2

    это ад

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

    "большая табличка" 18:29 это какой урок?

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

      Ты о чем?

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

      @@LearnDartFlutter вы в это время показываете таблицу.... оно с какого вашего урока???

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

      @@faizulla5838 так наверное с этого раз тут показываю, но вообще я не помню, видео пол года назад если не больше записывал)

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

    37:48

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

    У меня не грузит карту на бусти, бесконечная загрузка и все

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

      наверное можно попробовать ещё раз

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

      @@LearnDartFlutter не один раз пробовал, просто не грузит и все

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

    cakchanhamay

  • @АлександрПортной-щ9щ

    Flutter ето вообще дь|мящая куча ненужного кода

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

      ты просто не понял всю мощь флатера

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

    Спасибо!