Привет!
Я — Сергей Кольцов, с 2020 года Flutter разработчик в команде мобильного приложения Яндекс Про.
Помимо своих прямых рабочих обязанностей, я помогаю всем желающим встать на путь Flutter-ниндзя: несу Flutter в массы студентов Школ Мобильной Разработки от Яндекса, Университета Иннополис, менторю в личных встречах, ну и с некоторой регулярностью участвую в конференциях и митапах.
В какой-то момент я понял, что многое из того, что я рассказываю про дарт и флаттер на лекциях, личных встречах и даже в рабочих обсуждениях — повторяется, потому что многие ищут ответы на схожие вопросы и обсуждают близкие по смыслу темы. Долго вынашивал мысль про канал с такими вот сохранёнками (материалами, статьями, мыслями и всяким таким), и наконец-то довынашивал.
Если вы оказались в этом канале, то очень вероятно, что мы очно или заочно пересекались: на занятиях, менторских встречах или конференциях.
Ещё раз привет и спасибо, что заглядываете!
Я — Сергей Кольцов, с 2020 года Flutter разработчик в команде мобильного приложения Яндекс Про.
Помимо своих прямых рабочих обязанностей, я помогаю всем желающим встать на путь Flutter-ниндзя: несу Flutter в массы студентов Школ Мобильной Разработки от Яндекса, Университета Иннополис, менторю в личных встречах, ну и с некоторой регулярностью участвую в конференциях и митапах.
В какой-то момент я понял, что многое из того, что я рассказываю про дарт и флаттер на лекциях, личных встречах и даже в рабочих обсуждениях — повторяется, потому что многие ищут ответы на схожие вопросы и обсуждают близкие по смыслу темы. Долго вынашивал мысль про канал с такими вот сохранёнками (материалами, статьями, мыслями и всяким таким), и наконец-то довынашивал.
Если вы оказались в этом канале, то очень вероятно, что мы очно или заочно пересекались: на занятиях, менторских встречах или конференциях.
Ещё раз привет и спасибо, что заглядываете!
❤4
Универсальный ответ на вопросы "С чего начать?" и "Как систематизировать знания?": плейлист с лекциями по Flutter от Яндекса.
Это сборник из лекций со Школ Мобильной Разработки 2021 и 2022 годов. Лекции сгруппированы по темам и по порядку усложнения. В части лекций материал повторяется, но большинство — органично дополняют друг друга.
Практики в этих лекциях не очень много, но они абсолютно точно дадут хорошую теоретическую базу практически по всем необходимым темам из флаттера.
#edu
Это сборник из лекций со Школ Мобильной Разработки 2021 и 2022 годов. Лекции сгруппированы по темам и по порядку усложнения. В части лекций материал повторяется, но большинство — органично дополняют друг друга.
Практики в этих лекциях не очень много, но они абсолютно точно дадут хорошую теоретическую базу практически по всем необходимым темам из флаттера.
#edu
🎉8
Вариантов организации структуры проекта куча, нет строго правильного, и часто зависит от конкретных задач. Но после разных экспериментов, мне понравилась вот такая feature-first структура. Это не истина в последней инстанции, но неплохо подойдет в качестве опорной точки, плюс хорошо структурирует понимание существующих частей и их взаимосвязей.
app
Объединяет приложение воедино. Роутинг, сборка зависимостей и обработка ошибок. Слой app потенциально знает обо всех слоях приложения, но при этом остальные слои не знают об app.
core
Общие возможности, которые могут быть использованы в разных частях приложения. Общие компоненты дизайн-системы, утилиты. Любой слой может знать о core, но core не должен знать о других слоях.
data
Обработка сырых данных, API-клиент. Прямая работа с сервером или локальной базой данных. Data-слой может зависеть только от core-слоя.
features
Содержит фичи любого рода. Можно выделить фичи двух видов:
1. Функциональные — фичи без продуктового смысла. Такие фичи не должны зависеть от продуктовых фичей.
2. Продуктовые — фичи, отвечающие за определённую бизнес-логику. Такие фичи могут зависеть от функциональных фичей.
Каждая фича может содержать как только бизнес-специфичные сущности, так и вложенное дробление по слоям data и ui, но обязательно непосредственно связанные с этой фичой.
Знает о существовании data-слоя, но не знает о существовании screens.
screens
Экраны приложения. Могут быть сгруппированы по пользовательским сценариям. Слой screens использует слой features. Допустимо, чтобы screens знал о слое app — через который предоставляется доступ к продуктовым фичам.
Хотя этой связи можно избежать, если использовать Provider/Riverpod или любой другой инструмент прокидывания зависимостей в виджеты.
#tips
app
Объединяет приложение воедино. Роутинг, сборка зависимостей и обработка ошибок. Слой app потенциально знает обо всех слоях приложения, но при этом остальные слои не знают об app.
core
Общие возможности, которые могут быть использованы в разных частях приложения. Общие компоненты дизайн-системы, утилиты. Любой слой может знать о core, но core не должен знать о других слоях.
data
Обработка сырых данных, API-клиент. Прямая работа с сервером или локальной базой данных. Data-слой может зависеть только от core-слоя.
features
Содержит фичи любого рода. Можно выделить фичи двух видов:
1. Функциональные — фичи без продуктового смысла. Такие фичи не должны зависеть от продуктовых фичей.
2. Продуктовые — фичи, отвечающие за определённую бизнес-логику. Такие фичи могут зависеть от функциональных фичей.
Каждая фича может содержать как только бизнес-специфичные сущности, так и вложенное дробление по слоям data и ui, но обязательно непосредственно связанные с этой фичой.
Знает о существовании data-слоя, но не знает о существовании screens.
screens
Экраны приложения. Могут быть сгруппированы по пользовательским сценариям. Слой screens использует слой features. Допустимо, чтобы screens знал о слое app — через который предоставляется доступ к продуктовым фичам.
Хотя этой связи можно избежать, если использовать Provider/Riverpod или любой другой инструмент прокидывания зависимостей в виджеты.
#tips
👍5🔥1
Если начинать Flutter-проект с расчетом, что это будущее полноценное качественное приложение, а не быстрый прототип, то помимо продуктовой продуманности, помните про ряд важных технических моментов, которые стоит учесть как можно раньше, чтобы обеспечить достойный технический уровень проекта прямо со старта. В общем, написал статью для Яндекс Академии с подробным чеклистом, а тут краткое содержание:
1. Настройте проверку качества кода статическим анализатором, aka линтер, aka
2. Подготовьте релизную сборку. Да-да, прямо на старте проекта!
3. Подготовьте окружение и удобные скрипты для автоматической настройки этого окружения. Например, если есть несколько проектов с разными версиями, то fvm — must have.
4. Настройте как минимум Continuous Integration, а хорошо бы и CD.
5. Воспользуйтесь централизованным логгером, благо вариантов на pub.dev достаточно.
6. В корне приложения пропишите централизованную обработку необработанных исключением.
7. Реализуйте интернационализацию. Про отличие от локализации тоже читайте в чеклисте.
8. Опишите централизованную дизайн-тему и UI-компоненты приложения.
#tips
1. Настройте проверку качества кода статическим анализатором, aka линтер, aka
dart analyze
. 2. Подготовьте релизную сборку. Да-да, прямо на старте проекта!
3. Подготовьте окружение и удобные скрипты для автоматической настройки этого окружения. Например, если есть несколько проектов с разными версиями, то fvm — must have.
4. Настройте как минимум Continuous Integration, а хорошо бы и CD.
5. Воспользуйтесь централизованным логгером, благо вариантов на pub.dev достаточно.
6. В корне приложения пропишите централизованную обработку необработанных исключением.
7. Реализуйте интернационализацию. Про отличие от локализации тоже читайте в чеклисте.
8. Опишите централизованную дизайн-тему и UI-компоненты приложения.
#tips
education.yandex.ru
Что учесть при разработке мобильного Flutter-приложения: чек-лист
Ваш проект — это не только код. На старте разработки приложения здорово обратить внимание и на другие, не менее важные аспекты, которые сделают проект качественнее и удобнее. Собрали чек-лист вместе с Сергеем Кольцовым, руководителем группы Flutter-разработки…
👌4🤔2
Flutter Bro pinned «Универсальный ответ на вопросы "С чего начать?" и "Как систематизировать знания?": плейлист с лекциями по Flutter от Яндекса. Это сборник из лекций со Школ Мобильной Разработки 2021 и 2022 годов. Лекции сгруппированы по темам и по порядку усложнения. В части…»
Вероятно вы где-нибудь уже слышали, но всё-таки напомню, что летом Яндекс снова запускает Школу Мобильной Разработки!
Подготовка уже кипит во всю, будет топчик, и ещё сегодня в 19:00 на ютубе будет день открытых дверей Школ, залетайте. Ну и регистрируйтесь в саму школу😁
#event
Подготовка уже кипит во всю, будет топчик, и ещё сегодня в 19:00 на ютубе будет день открытых дверей Школ, залетайте. Ну и регистрируйтесь в саму школу
#event
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Школа мобильной разработки 2023 — День открытых дверей
29 марта мы проведём День открытых дверей онлайн, чтобы вы смогли определиться с направлением и задать вопросы о поступлении и обучении. Руководители школ расскажут о программе и отборе, а выпускники прошлых лет поделятся своим опытом, дадут советы будущим…
👍4
Иногда так хочется какой-нибудь дичи, особенно в пятницу вечерком!
Поэтому воспользовался новомодным ChatGPT для самой высокоинтеллектуальной задачи — сгенерировать всратые факты о флаттер-разработчиках.
🧐 Если ты хочешь научиться создавать красивые приложения, следуй за флаттер-разработчиком, но не слишком близко, чтобы не запутаться в его коде.
🧐 Флаттер-разработчик всегда знает, что делать, если приложение начинает вести себя как единорог.
🧐 Флаттер-разработчик не знает, что такое 'отдых', он только знает, что такое 'hot reload'.
🧐 Если вы дадите флаттер-разработчику задание создать приложение за один день, то он напишет его за один час, но только если вы дадите ему две недели.
🧐 Когда флаттер-разработчик устраивает митап, там нет докладчиков, только виджеты, которые приглашены на сцену.
🧐 Флаттер-разработчик может создать приложение, которое будет выглядеть прекрасно, но будет работать как кошмар.
🧐 Если флаттер-разработчик говорит, что знает все о мобильной разработке, то он просто не знает, что не знает.
🧐 Флаттер-разработчик не нуждается в мозгах, у него есть Dart.
Поэтому воспользовался новомодным ChatGPT для самой высокоинтеллектуальной задачи — сгенерировать всратые факты о флаттер-разработчиках.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9🦄5
Блок и кубит — это сущности для управления состоянием, обе поставляются из пакета bloc. Фундаментально, блок и кубит — это одно и то же — они наследники BlocBase. Это сущность, хранящая в себе состояние и стрим с изменениями этого состояния. И единственный инструмент изменения этого состояния — метод emit. В аргумент методу мы передаём новое состояние, и метод синхронно изменяет его и отправляет в стрим. Отличие блока и кубита лишь в том, как мы будем вызывать метод emit.
Кубит — это, буквально, BlocBase. Следовательно, единственный способ вызывать метод emit — просто напрямую. Но, он protected — значит его можно вызывать только внутри класса или внутри дочерних классов. Поэтому в каждом конкретном кубите мы описываем наши собственные публичные методы с нужным набором аргументов, и уже внутри них вызываем метод emit, чтобы обновить состояние по результатам выполнения.
Блок — это BlocBase на стероидах. Ключевое отличие — в блоке появляется стрим событий. В блоке мы описываем события (базовый класс + дочерние) с набором аргументов и кидаем их в блок через единственный метод add. А логику обработки событий описываем в методах, которые регистрируем в конструкторе блока через метод on. Кайф в том, что этот метод принимает коллбек EventHandler, который может быть асинхронным. И все события, которые попадают в один и тот же обработчик, будут обрабатываться асинхронно, но последовательно, образуя очередь событий. Ну и чтобы обновить состояние блока из EventHandler'а, у него в аргументах есть Emitter, в который мы по готовности закидываем новое состояние.
Короче, что кубит, что блок — это просто класс с мутабельным полем (стейтом) и стримом. В кубите мы обновляем это поле через метод emit, а в блоке — через отправку событий в отдельный стрим, обработка которого происходит в обработчике EventHandler. В нём написана асинхронная логика обновления состояния.
Кубит — это, буквально, BlocBase. Следовательно, единственный способ вызывать метод emit — просто напрямую. Но, он protected — значит его можно вызывать только внутри класса или внутри дочерних классов. Поэтому в каждом конкретном кубите мы описываем наши собственные публичные методы с нужным набором аргументов, и уже внутри них вызываем метод emit, чтобы обновить состояние по результатам выполнения.
Блок — это BlocBase на стероидах. Ключевое отличие — в блоке появляется стрим событий. В блоке мы описываем события (базовый класс + дочерние) с набором аргументов и кидаем их в блок через единственный метод add. А логику обработки событий описываем в методах, которые регистрируем в конструкторе блока через метод on. Кайф в том, что этот метод принимает коллбек EventHandler, который может быть асинхронным. И все события, которые попадают в один и тот же обработчик, будут обрабатываться асинхронно, но последовательно, образуя очередь событий. Ну и чтобы обновить состояние блока из EventHandler'а, у него в аргументах есть Emitter, в который мы по готовности закидываем новое состояние.
Короче, что кубит, что блок — это просто класс с мутабельным полем (стейтом) и стримом. В кубите мы обновляем это поле через метод emit, а в блоке — через отправку событий в отдельный стрим, обработка которого происходит в обработчике EventHandler. В нём написана асинхронная логика обновления состояния.
👍6
Лысый чувак в левом нижнем углу фотографии — это Роман Назаров. Насколько я понял, здесь он впервые услышал про флаттер. Зато он — офигенный тренер по публичным выступлениям. На ютубе у него есть гигантский трехчасовой прямой эфир по подготовке к публичным выступлениям, ну или есть часовая лекция поменьше, если вы очень торопитесь.
А ещё на этой фотке есть я — рассказываю чистовой прогон своего доклада Роману. Потому что через 2 недели, 22 апреля, команда Яндекс Go и Яндекс Pro проведёт большую конференцию по мобильной разработке! И там целый трек будет посвящен Flutter-разработке. Ну и я тоже там докладываюсь.
Конференция будет оффлайн в Москве и без live-трансляции, поэтому если у вас есть возможность поприсутствовать физически — срочно регистрируйтесь вот прям щас! Потому что количество мест ограничено. А конфа будет космическая, уж поверьте😎
А когда придёте на конфу — ловите меня после доклада, поболтаем🙃
#event
А ещё на этой фотке есть я — рассказываю чистовой прогон своего доклада Роману. Потому что через 2 недели, 22 апреля, команда Яндекс Go и Яндекс Pro проведёт большую конференцию по мобильной разработке! И там целый трек будет посвящен Flutter-разработке. Ну и я тоже там докладываюсь.
Конференция будет оффлайн в Москве и без live-трансляции, поэтому если у вас есть возможность поприсутствовать физически — срочно регистрируйтесь вот прям щас! Потому что количество мест ограничено. А конфа будет космическая, уж поверьте
А когда придёте на конфу — ловите меня после доклада, поболтаем
#event
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2👍2🤩1💩1
Последние 2 недели были насыщены активностями, поэтому писать что-то сюда сил уже не хватало. Зато мы провели офигенный интенсив в Сириусе по флаттеру и iOS, а сразу после него — конфу по мобилке от Яндекс Go.
Поэтому, чтобы вы меня не совсем теряли, держите напоминание: уже ровно через 2 недели пройдет Google I/O, так что не забывайте регистрироваться. Будем надеяться, что генеративные нейросетки не займут весь эфир и флаттеру тоже достанется🫥
Поэтому, чтобы вы меня не совсем теряли, держите напоминание: уже ровно через 2 недели пройдет Google I/O, так что не забывайте регистрироваться. Будем надеяться, что генеративные нейросетки не займут весь эфир и флаттеру тоже достанется
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤6🔥3
В Dart очень изящно избавились от ключевого слова interface, а теперь снова его добавляют (и, на мой взгляд, не зря). Но независимо от его наличия/отсутствия мне всегда немножко грустно от избыточного использования сущности интерфейсов в любой непонятной ситуации. Потому что пользы это не добавляет, зато добавляет много бесполезного кода, который точно никогда не пригодится.
В дарте любой класс — это уже неявный интерфейс. Поэтому по умолчанию у класса уже есть интерфейс, его не нужно писать дополнительно! А выделять в отдельный класс-интерфейс его имеет смысл в трех случаях:
1. Когда есть несколько реализаций одного и того же публичного API класса.
2. Когда у реализации публичный интерфейс для “потребителя” шире, чем для внутреннего использования, и его нужно сузить.
3. Когда реализации в принципе не существует и её должен написать сам "потребитель".
И вот ещё статейка на эту тему (правда не про Dart).
В дарте любой класс — это уже неявный интерфейс. Поэтому по умолчанию у класса уже есть интерфейс, его не нужно писать дополнительно! А выделять в отдельный класс-интерфейс его имеет смысл в трех случаях:
1. Когда есть несколько реализаций одного и того же публичного API класса.
2. Когда у реализации публичный интерфейс для “потребителя” шире, чем для внутреннего использования, и его нужно сузить.
3. Когда реализации в принципе не существует и её должен написать сам "потребитель".
И вот ещё статейка на эту тему (правда не про Dart).
👍6🔥6⚡3
Пятничный серьезный пост про Google I/O
Google I/O состоялся, там объявили о релизах и рассказали про новые возможности в Dart 3 и в Flutter 3.10. Почитать про них вы можете и в приведенных статьях, а вот про секретные неанонсированные возможности вы нигде, кроме как тут, не узнаете! Итак, вот они:
Dart 3
👩💻 Добавлены ключевые слова
👩💻 Теперь в Dart есть ключевое слово
👩💻 Введен новый оператор
👩💻 Dart теперь позволяет использовать магические заклинания вместо ключевых слов, которые упрощают синтаксис и делают код более читабельным. Например, вместо
👩💻 Добавлена возможность создавать асинхронные функции, которые работают только по выходным дням.
👩💻 Введена функция
👩💻 Появился новый модификатор доступа
👩💻 Добавлен оператор
👩💻 Добавлен модификатор
👩💻 Dart 3.0 теперь позволяет программистам использовать печенье вместо переменных.
Flutter 3.10
👩💻 Теперь для создания кнопок в Flutter нужно использовать не
👩💻 Flutter 3.10 позволяет создавать анимации с помощью жестов тела, включая танцы.
👩💻 Теперь вы можете использовать
👩💻 Flutter 3.10 позволяет создавать пользовательский интерфейс, который изменяется в зависимости от фазы луны.
👩💻 В Flutter 3.10 появился новый виджет "Кричащий текст", который автоматически изменяет размер шрифта, чтобы привлечь внимание пользователя. Доступен только в ярко-розовом цвете.
👩💻 Добавлен новый виджет
👩💻 В Flutter появился виджет
👩💻 В Flutter 3.10 добавлена новая опция для виджетов "невидимое нажатие", которая позволяет пользователям нажимать на несуществующие элементы экрана.
👩💻 Flutter добавил новый виджет для создания духовных мантр под названием
👩💻 В Flutter 3.10 появилась новая функция
Да, это ChatGPT сгенерировал
Google I/O состоялся, там объявили о релизах и рассказали про новые возможности в Dart 3 и в Flutter 3.10. Почитать про них вы можете и в приведенных статьях, а вот про секретные неанонсированные возможности вы нигде, кроме как тут, не узнаете! Итак, вот они:
Dart 3
maybe
, probably
, и who-knows
для более точного описания неопределенных переменных. sarcasm
, которое позволяет писать саркастический код, который будет компилироваться только в случае, если в вашей команде есть программисты с достаточным уровнем чувства юмора. ??!
, который выбрасывает случайное исключение. if
можно написать abra cadabra
. magic()
, которая автоматически исправляет все ошибки в коде, используя магию. invisible
, который делает переменную невидимой для всех, кроме тебя. maybeNull
, который возвращает null с вероятностью 50%. awesome
, который делает функцию более крутой. Flutter 3.10
ElevatedButton
и не TextButton
, а EmojiButton
и GifButton
. FlutterTeleportation
для перемещения виджетов из одного места в другое без анимации! FlutterSocialDistancer
, который автоматически раздвигает элементы UI на безопасное расстояние друг от друга. MemeGenerator
, который автоматически создает мемы на основе данных, полученных от пользователя. PrayerWidget
, который позволяет пользователям создавать свои собственные мантры и повторять их в своих приложениях. shakePhone()
, которая вызывает случайные вибрации на устройстве пользователя.Please open Telegram to view this post
VIEW IN TELEGRAM
😁15🤣8🫡2💩1👻1