Привет!
Я — Сергей Кольцов, с 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
😁10🦄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
Вот вам любопытная задачка. Какой будет результат выполнения?
Насторожились из-за
Короче, две не самые очевидные вещи, которые можно взять из этого кода:
1. Асинхронная функция выполняется синхронно до первого встреченного await, т.е. весь синхронный код выполняется сразу же.
2. Если вам нужно осознанно обойти это поведение и заставить ваш синхронный код внутри асинхронной функции сразу уйти на следующую итерацию Event Loop'а — конструкция
Ну и ссылочка на почитать про async/await. Ну и ответ:
A - main - microA - B
void main() {
a();
b();
print('main');
}
Future<void> a() async {
print('A');
await Future.microtask(() => print('microA'));
}
Future<void> b() async {
await null;
print('B');
}
Насторожились из-за
await null? А первым у вас выводится "main" или "A"?Короче, две не самые очевидные вещи, которые можно взять из этого кода:
1. Асинхронная функция выполняется синхронно до первого встреченного await, т.е. весь синхронный код выполняется сразу же.
2. Если вам нужно осознанно обойти это поведение и заставить ваш синхронный код внутри асинхронной функции сразу уйти на следующую итерацию Event Loop'а — конструкция
await null внезапно считается вполне каноничным вариантом.Ну и ссылочка на почитать про async/await. Ну и ответ:
👍7🔥3✍2💩2🌭2👨💻2😱1