Flutter & Dart | Мобильный трудоголик
описание
Пишу простым языком про разработку на Flutter & Dart (iOS, Android, macOS, Windows) и мобильную разработку в целом. Обо мне: https://t.me/hardworkerFlutter/2 Чат: @flutterDevChat Другие мои каналы: @hardworkerIT и @itDenisov
342
подписчиков
Охват к подписчикам
234,5%
ERR
Реакции к просмотрам
0,87%
145 на 21 постов
Пересылки к просмотрам
0,98%
163
Постов в день
0,3
всего 21
Где отзываются чаще
доля реакций к просмотрам- 18 июл.👨💻 Когда вакансий меньше, а требований больше: стратегия выживания в ИТ. Разговоры о кризисе в ИТ уже не панические слухи, а констатация факта. Вакансий меньше, зарплаты замерли, конкуренция выросла в разы. Но важно понимать: рынок не умирает, он болезненно меняется. Эпоха, когда достаточно было знать модный фреймворк и получать несколько офферов в неделю, закончилась. Начинается фаза, где выживут не просто технически сильные, а адаптивные и стратегически мыслящие специалисты. Что на самом деле происходит: Проблема не в том, что ИТ стал ненужным. Проблема в том, что изменился тип спроса. Раньше компании массово нанимали «на рост», создавая команды с запасом. Сегодня каждый найм - это точечное закрытие конкретной болевой точки. Отсюда парадоксальные, на первый взгляд, тренды: 🔹 Спрос на узких экспертов, а не специалистов широкого профиля: раньше ценился разработчик, который умеет немного в backend, немного во frontend. Сейчас ценность смещается в сторону глубокой экспертизы в одной, но критически важной для бизнеса области. 🔹 ИИ не забирает работу: он меняет ее порог входа. Автоматизация рутинного кодинга и первичного скрининга резюме не означает конец профессии. Это означает, что ценность базового навыка написания кода падает. Ценность навыка решения сложных, нестандартных проблем - взлетает. Если ваша работа сводилась к переводу ТЗ в код, вы в зоне риска. 🔹 Кризис менеджмента, а не разработки: сильнее всего сокращения ударили по слоям управления, которые не приносят прямого технического или продуктового результата. Растет спрос на две противоположные роли: 🔹Сильный техлид/архитектор, который может привести команду к результату. 🔹Автономный senior-разработчик, который сам ведет фичу от идеи до продакшена. Новая система координат - что оценивают теперь: Раньше чек-лист был прост: стек и опыт. Сегодня на первый план выходят метрики, которые сложнее измерить, но которые определяют реальную ценность: 🔹 Эффективность, а не занятость. Не «я работал в компании X 3 года», а «я спроектировал и внедрил систему кэширования, которая снизила p95-латентность API с 2с до 200мс и сэкономила X на инфраструктуре». 🔹 Влияние на бизнес-метрики. Разработчику все чаще нужно понимать, как его код влияет на LTV, конверсию или удержание пользователей. Вы перестаете быть исполнителем задач и становитесь соучастником бизнеса. 🔹 Скорость обучения и адаптации. Технологический стек устаревает быстрее. Ценится не знание конкретного фреймворка, а способность за 2-3 недели глубоко погрузиться в новую для себя технологию или домен и начать приносить пользу. Тактика выживания и роста в новых условиях: Стратегия «просто продолжать хорошо делать свою работу» больше не работает. Нужна активная позиция. 🔹 Инвестируйте в экспертизу. Глубокое погружение в одну ключевую область плюс широкое понимание смежных процессов. 🔹 Создавайте публичное портфолио. GitHub с пет-проектами - это хорошо, но недостаточно. Документируйте и публично делитесь (в блоге, на митапах) решением сложных инженерных проблем. Это формирует вашу репутацию эксперта, которая становится самым сильным активом на сжавшемся рынке. 🔹 Сдвигайтесь в сторону продуктового мышления. Перестаньте быть просто «исполнителем задач». Начинайте задавать вопросы: «Какую пользовательскую проблему мы решаем?», «Как мы измерим успех этой фичи?». Разработчики, которые мыслят как мини-продакт-менеджеры, становятся незаменимыми. 🔹 Стройте сеть, а не просто рассылайте резюме. В условиях, когда на одну вакансию приходят сотни откликов, решающую роль часто играет рекомендация изнутри. Активно общайтесь с коммьюнити, выступайте, вносите вклад в open-source. Ваша сеть контактов - это ваш запасной парашют. 🔗 Ссылка на подробную статью 💡 Вывод: Текущий кризис в ИТ - это не апокалипсис, а болезненный, но необходимый переход от рынка перегретого спроса к рынку взвешенного, осмысленного спроса. Он отсеивает тех, кто пришёл в индустрию за «легкими деньгами», и укрепляет позиции тех, кто относится к разработке как к ремеслу и стратегической функции бизнеса. ➡️ Кот Денисова2,15%
- 14 авг.👣 Релиз Flutter 3.47: главные изменения для разработчиков Вышла новая версия Flutter 3.47. Обновление заметное. Material и Cupertino наконец-то выехали из SDK в отдельные пакеты. Impeller стал рендерером по умолчанию на десктопе. Плюс подготовка к осенним обновлениям Apple и другие улучшения. Давайте разберем все основные изменения. Material и Cupertino теперь отдельные пакеты: Главное изменение. Material и Cupertino больше не встроены в SDK. Теперь это отдельные пакеты на pub.dev: material_ui и cupertino_ui. Это значит, что обновления виджетов теперь могут выходить независимо от релизов Flutter. Пока это опционально. Старые импорты из package:flutter/material.dart все еще работают, но они объявлены устаревшими и будут удалены в ноябре. Для миграции достаточно выполнить команду: dart fix --apply --code=migrate_design_widgets После этого импорты обновятся автоматически. Если что-то пошло не так, можно добавить пакеты вручную: flutter pub add material_ui flutter pub add cupertino_ui Важный момент для пакетов с зависимостями: если вы еще не обновились, а ваши зависимости уже используют новый подход, поможет MaterialUiCompatibilityBridge. Также вместе с UI-пакетами разобрали flutter_localizations. Теперь делегаты локализации живут внутри material_ui и cupertino_ui, а не в отдельном пакете. Подготовка к iOS 27 и macOS 27: Apple осенью выпустит Xcode 27 с новыми требованиями. Минимальная версия iOS поднята до 15, macOS до 12. iOS 27 SDK требует жизненного цикла UIScene. Приложения без него не запустятся на новых устройствах. Для большинства проектов CLI мигрирует автоматически. Но если в проекте есть кастомный AppDelegate, придется править руками. Лучше проверить сейчас. Также Flutter постепенно сворачивает поддержку Intel Mac. В этой версии только предупреждения, но в будущем сборка на Intel перестанет работать. Можно уже сейчас переключиться на ARM64-only: flutter config --enable-macos-arm64-only По Swift Package Manager прогресс: 92 из топ-100 плагинов уже перешли на SPM. Если вы еще не включили SPM, можно попробовать: flutter config --enable-swift-package-manager Impeller теперь на десктопе по умолчанию: Impeller стал рендерером по умолчанию на macOS, Windows и Linux. Если вы не знаете, что это - новый рендеринг-движок, который компилирует шейдеры на этапе сборки, а не в рантайме. Это решает проблему шейдерных джанков. Первая анимация работает так же плавно, как и все последующие. На macOS также включили Wide Gamut Color - более насыщенные и точные цвета. Отключить Impeller можно, но в будущих версиях опция будет удалена. Flavors для десктопа: Flavors, которые работали на мобилках, теперь доступны и на Windows и Linux. Можно использовать разные ассеты и настройки для разных окружений. flutter build windows --flavor production flutter build linux --flavor staging Экспериментальный многооконный режим тоже доработали. На Windows и Linux появились popup-окна. Можно делать контекстные меню и палитры. 🔗 Читать подробнее 💡 Вывод: Flutter 3.47 - важное обновление. Главное - Material и Cupertino выехали из SDK. Это упростит обновления виджетов и снизит зависимость от релизов Flutter. Impeller на десктопе - большой шаг для производительности. Flavors и многооконный режим делают десктоп-разработку более гибкой. А подготовка к осеннему релизу Apple заставляет проверить проекты на совместимость. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик1,81%
- 11 авг.👣 Плагин Flutter для VS Code обновился до версии 3.140.0 Вышло обновление плагина Flutter для VS Code. Изменения в основном точечные, но есть несколько полезных вещей: приоритет выбора пути до Flutter SDK изменился, появилась команда для TODOs и рефакторинги теперь запрашивают ввод от пользователя. Flutter SDK - изменился приоритет: Раньше плагин мог использовать SDK, найденный через .dart_tool/package_config.json, даже если в PATH был другой. Теперь SDK из PATH имеют приоритет. Если нужно задать явный путь, есть настройка dart.flutterSdkPath. Новая команда - Toggle Show TODOs: Появилась команда Dart: Toggle Show TODOs. Она включает или отключает отображение TODO-комментариев в редакторе. Раньше для этого нужно было лезть в настройки. Теперь можно сделать через панель команд. Рефакторинг с вводом пользователя: В рефакторингах появился новый механизм сбора пользовательского ввода. Раньше плагин генерировал имя автоматически. Теперь для «Add a name to the constructor» и «Add a prefix to the import» будет появляться диалог для ввода имени. Синтаксис и подсветка: Обновили TextMate-грамматику для начальной подсветки синтаксиса, пока сервер не передаст Semantic Tokens. Исправили случай, когда незакрытые блоки кода в dartdoc-комментариях ломали подсветку. Также код-блоки в dartdoc больше не теряют цвета при замене грамматики. Тестирование: Для package:test_reflective_loader исправили отображение setUp/tearDown в тестовом эксплорере. Теперь они навигируют на конкретные методы, а не на defineReflectiveSuite. Также методы больше не отображаются на всех классах, где их нет. Команды создания проекта: Команды Dart: New Project и Flutter: New Project переименовали в Dart: Create New Project и Flutter: Create New Project. Теперь они появляются в результатах поиска по словам dart create и flutter create. Firebase Studio: Поддержка Firebase Studio объявлена устаревшей и будет удалена. Это связано с закрытием самого сервиса. 🔗 Читать подробнее 💡 Вывод: Обновление плагина - это смесь мелких улучшений и подготовки к будущим изменениям в SDK. Из полезного: новый приоритет выбора SDK, команда для TODOs и рефакторинг с вводом от пользователя. Остальное - исправления и подготовка к будущим релизам. Изменений не много, но они делают работу немного удобнее. Особенно для тех, кто активно использует TODOs и рефакторинги. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик1,72%
- 4 авг.👣 Как работает сборщик мусора в Dart. Память, указатели и smi Сборщик мусора в Dart - тема, которая часто всплывает на собеседованиях, но найти внятное объяснение непросто. Статьи либо слишком сложные, либо уходят в дебри реализации VM. Давайте разберем основы: как Dart управляет памятью, что такое указатели и почему числа не влияют на производительность. Биты, байты и указатели: Память компьютера - это длинный ряд ячеек, каждая из которых содержит бит (0 или 1). Процессоры работают с группами битов. В 64-битных процессорах это группы по 64 бита (8 байт). Это машинное слово. Указатель в Dart занимает ровно одно машинное слово - 8 байт. Указатель - это не сам адрес, а место, где этот адрес записан. Если представить адрес дома, то листок бумаги - это указатель, а то, что на нем написано - сам адрес. Как Dart отличает число от объекта: Dart числа и объекты хранятся по-разному. Если переменная содержит число, оно хранится прямо в указателе - никакого перехода по адресу не требуется. Если переменная содержит объект, в указателе хранится адрес этого объекта, и чтобы получить доступ к объекту, нужно перейти по этому адресу. Как Dart понимает, что именно лежит в указателе? Все решает последний бит. Адреса объектов в памяти кратны 16. Это сделано специально. Если адрес кратен 16, его последние биты всегда нули. Вот это пустующее место Dart использует как флажок. Последний бит говорит, чем является значение в указателе: 🔹1 - ссылка на объект 🔹0 - число, искать объект по адресу не нужно Пример: объект лежит по адресу 0x00A03F50. Этот адрес кратен 16. В двоичном виде последний байт: 0101 0000. Dart ставит единицу в конце: 0101 0001 → 0x00A03F51. Теперь это помеченный адрес объекта. Чтобы дойти до реального объекта, нужно убрать эту единицу и получить исходный адрес. Smi: числа, которые живут в указателе: Если число умещается в указателе, оно называется smi (small integer). Smi не занимает места в куче. Оно живет прямо в указателе. Сборщик мусора за ним не следит. Пример: число 7 = 111 в битах. Когда Dart упаковывает его в smi, он сдвигает биты влево на 1 позицию. Получается 1110. Ноль на конце означает, что это число, а не ссылка. При распаковке число делится на 2, возвращая исходное значение. Handles - почему C++ не теряет объекты: Сборщик мусора периодически двигает объекты в памяти, чтобы бороться с фрагментацией. Объект переезжает на новый адрес. Для Dart-кода это не проблема - сборщик знает все ссылки и обновляет их. Но есть код на C++ (движок, нативные библиотеки). Сборщик не знает, где у C++ лежат ссылки. Если объект переедет, C++ останется со старым адресом - программа упадет. Решение: handles. Это ссылка на ссылку. C++ держит не объект, а handle с адресом объекта. Когда объект переезжает, сборщик обновляет адрес внутри handle. C++ всегда смотрит на актуальный адрес через handle. 🔗 Читать подробнее 💡 Вывод: Dart управляет памятью хитро, но логично. Указатели хранят либо числа (smi), либо ссылки на объекты. Различие определяется последним битом. Сборщик следит за объектами в куче, но не трогает числа. Handles решают проблему с C++ ссылками при перемещении объектов. На практике это значит: числа не влияют на производительность, объекты - да. Создание лишних объектов напрямую влияет на нагрузку сборщика. Понимание этих основ помогает писать более эффективный код. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик1,71%
- 5 июн.👣 Оптимизация работы анимаций во Flutter Во Flutter анимации - это красиво, но если ими не управлять, они могут съедать ресурсы даже тогда, когда их никто не видит. Сегодня разберем два инструмента, которые помогут анимациям не тормозить интерфейс и не работать впустую. AnimatedBuilder - перерисовываем только то, что нужно: По умолчанию при каждом кадре анимации перестраивается весь виджет, который содержит AnimationController. Если внутри есть тяжелые элементы, это бьет по производительности. AnimatedBuilder решает эту проблему. Он разделяет анимируемую часть и статический контент. Статический контент передается через параметр child и не пересоздается при каждом кадре. Перерисовывается только то, что реально меняется. AnimatedBuilder( animation: _animationController, child: Container( width: 300, height: 300, color: Colors.blue, child: const Center(child: Text('Привет!')), ), builder: (context, child) { return Transform.rotate( angle: _controller.value * 2 * pi, child: child, ); }, ) TickerMode - останавливаем анимацию, когда ее не видно: Если пользователь свернул приложение или переключился на другой экран, а анимация продолжает работать, это пустая трата ресурсов процессора и батареи. TickerMode позволяет отключать все анимации в определенной части дерева виджетов. Достаточно обернуть нужный участок и передать enabled: false. Все AnimationController, связанные с TickerProviderStateMixin, автоматически приостановятся. TickerMode( enabled: _isActive, child: MyWidget(), ) 🔗 Читать подробнее 💡 Вывод: AnimatedBuilder помогает не перерисовывать статику при каждом кадре, а TickerMode - не тратить ресурсы на анимацию, которую никто не видит. Вместе они делают приложение плавнее и экономичнее. Если вы используете анимации в своих проектах, эти два виджета должны быть в вашем арсенале. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO1,36%
- 9 июн.👣 Expansible - новый виджет для плавно раскрывающегося списка Во Flutter 3.32 появился новый виджет - Expansible. Он пришел на смену старому ExpansionTile и его контроллеру, который больше не поддерживается. Давайте разберем на простом примере, как он работает. Что такое Expansible: Expansible - это StatefulWidget, который умеет плавно раскрываться и сворачиваться. У него есть две части: 🔵header - заголовок, который всегда на виду. 🔵body - содержимое, которое появляется при раскрытии. Анимацией управляет AnimationController, поэтому все работает плавно и без дерганий, в отличие от старого ExpansionTile. Простой пример: Самый частый сценарий - когда по тапу на заголовок раскрывается дополнительный контент. Вот как это выглядит: class ExpansibleExample extends StatefulWidget { @override State<ExpansibleExample> createState() => _ExpansibleExampleState(); } class _ExpansibleExampleState extends State<ExpansibleExample> { final _controller = ExpansibleController(); @override Widget build(BuildContext context) { return Expansible( controller: _controller, headerBuilder: (context, animation) => ListTile( title: Text('Нажми, чтобы раскрыть'), onTap: () { if (_controller.isExpanded) { _controller.collapse(); } else { _controller.expand(); } }, trailing: RotationTransition( turns: Tween<double>(begin: 0.0, end: 0.5).animate(animation), child: Icon(Icons.arrow_drop_down), ), ), bodyBuilder: (context, animation) => SizeTransition( sizeFactor: animation, child: Text('А вот и скрытый контент!'), ), ); } @override void dispose() { _controller.dispose(); super.dispose(); } } Обратите внимание на несколько важных моментов. Во-первых, ExpansibleController нужно создавать и не забывать вызывать dispose(). Во-вторых, для плавного поворота стрелочки используется animation, которая приходит в headerBuilder - она уже содержит нужное значение от 0 до 0.5 оборота. В-третьих, SizeTransition с animation анимирует высоту body. Все вместе дает аккуратный эффект без лишних телодвижений. Важный нюанс про ListView: Если вы используете Expansible внутри ListView или SingleChildScrollView, обязательно передавайте PageStorageKey. Иначе при скролле виджет будет терять свое состояние (раскрыт или свернут) и пользователь удивится. Expansible( key: PageStorageKey('unique_key_1'), // каждому Expansible свой ключ controller: _controller, headerBuilder: ... bodyBuilder: ... ) 🔗 Читать подробнее 💡 Вывод: Expansible - это не просто замена устаревшему виджету. Это инструмент, который решает давнюю боль Flutter-разработчиков: плавная анимация высоты, сохранение состояния при скролле и чистый API через контроллер. Пример выше можно скопировать и вставить в любой проект - он работает из коробки. А если нужно больше гибкости, подключайте expansibleBuilder и настраивайте под свои задачи. Если вы обновились до Flutter 3.32, присмотритесь к этому виджету - он реально удобнее. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO1,32%
- 30 июн.👣 Знаете Flutter? Значит, можете писать бэкенд на Dart Если вы работаете с Flutter, вы знаете Dart. Вы понимаете async/await, работаете с моделями и репозиториями, привыкли к чистой архитектуре. Вы запускали приложения на реальных устройствах. Между этим и умением написать и запустить рабочий бэкенд - пропасть меньше, чем кажется. Не нужно учить новый язык. Нужно понять, как Dart работает, когда нет виджетов, нет BuildContext, нет Flutter. Есть только процесс, который принимает HTTP-запросы, ходит в базу данных и отправляет ответы. Автор статьи показывает этот путь на примере API для управления пользователями и профилями. Все на знакомом Dart и фреймворке Shelf. Проект поднимается в Docker с PostgreSQL, проверяет пользователей через JWT-токены и деплоится на Fly.io. Как Dart работает на сервере: В Flutter-приложении ваш код работает поверх огромного количества логики: дерево виджетов, пайплайн рендеринга, управление состоянием, обработка событий платформы. На сервере ничего этого нет. Есть процесс, который слушает порт, получает HTTP-запросы, делает работу и отправляет ответы. В стандартной библиотеке Dart есть все необходимое для этого на самом низком уровне. import 'dart:io'; void main() async { final server = await HttpServer.bind('0.0.0.0', 8080); print('Сервер запущен на порту 8080'); await for (final request in server) { request.response ..statusCode = 200 ..write('Привет из Dart') ..close(); } } Это рабочий HTTP-сервер. Никаких пакетов, никаких фреймворков. Каждый запрос приходит через HttpServer, и вы пишете ответ напрямую. Но как только появляются маршруты, middleware, аутентификация и обработка ошибок, работать с dart:io становится неудобно. Здесь в игру вступает Shelf. Что такое Shelf: Shelf - это библиотека для создания веб-серверов. Она не пытается быть полноценным фреймворком. Вместо этого она дает базовые кирпичики, из которых вы собираете именно то, что нужно. В Shelf есть четыре ключевых понятия: 🔵Handler - функция, которая принимает Request и возвращает Response. Все в Shelf в итоге сводится к хендлеру. 🔵Middleware - функция, которая оборачивает хендлер, добавляя поведение до или после его выполнения. Логирование, аутентификация и обработка ошибок - это middleware. 🔵Pipeline - цепочка middleware с хендлером в конце. Запрос проходит через все middleware, прежде чем добраться до хендлера. 🔵Router - сопоставляет URL-паттерны и HTTP-методы с конкретными хендлерами. Если вы использовали навигацию в Flutter или что-то похожее на провайдеры, модель композиции будет понятна. Маленькие, независимые части собираются в работающее целое. База данных и миграции: В проекте используется PostgreSQL. Все поднимается через Docker Compose. Миграции применяются автоматически при старте приложения. Структура базы данных простая: таблица users и таблица profiles, связанная один к одному. Код написан так, что разработчику не нужно писать сырые SQL-запросы в хендлерах - вся работа с базой инкапсулирована в репозиториях. 🔗 Читать подробнее 💡 Вывод: Эта статья - хороший пример того, что знание Dart не заканчивается на Flutter. Те же модели, репозитории, асинхронность и архитектурные подходы работают и на сервере. Нужно только сменить контекст: вместо виджетов - обработка запросов, вместо State - база данных. Shelf не делает за вас выборов. Он дает кирпичики, а архитектуру вы собираете сами. Это философски близко к Flutter, где вы тоже строите UI из базовых компонентов. Если вы знаете Dart, бэкенд уже не выглядит чем-то недоступным. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO1,27%
- 29 июл.👨💻 Конец золотой лихорадки: как изменились правила игры в ИТ-индустрии. Каждый, кто следит за ИТ, регулярно сталкивается с мрачными прогнозами: «рынок умер», «вакансий нет», «ИИ всех заменит». Подобные заявления рождают тревогу и сомнения, особенно у тех, кто только начинает свой путь в разработке. Однако, если отвлечься от эмоций и посмотреть на ситуацию структурно, становится понятно: мы стали свидетелями не конца индустрии, а ее болезненного, но неизбежного взросления. Просто закончилась эпоха легких денег и гарантированного трудоустройства для всех подряд. Эпоха золотой лихорадки и ее завершение: Последнее десятилетие было аномальным периодом стремительного роста для ИТ. Спрос на разработчиков значительно превышал предложение. Компании готовы были нанимать специалистов с минимальным опытом или даже после непродолжительных курсов, предлагая при этом конкурентоспособные по местным меркам зарплаты. Это создало иллюзию, что попасть в ИТ и быстро вырасти - это простая и быстрая дорога к финансовому успеху. Критерии изменились - как оценивают разработчиков в эпоху выбора: Ситуация сегодня - это естественная нормализация. Индустрия перестает быть изолированной аномалией и начинает жить по общим для развитых экономик законам, где ценят не просто наличие специалиста, а его реальную экспертизу. 🔹Работодатель теперь выбирает. Если раньше компаниям часто приходилось брать первого, кто откликнулся, то сейчас на одну позицию сотни кандидатов. Это позволяет выбирать не просто того, кто знает синтаксис языка, а того, кто обладает наиболее подходящим набором hard и soft скиллов, понимает бизнес-контекст и умеет решать комплексные задачи. 🔹Профессионализм выходит на первый план. Эпоха, когда годы опыта в резюме автоматически гарантировали высокий оффер, уходит. Ценность представляет не стаж сам по себе, а конкретные навыки, качество кода, архитектурные решения, умение работать в команде и брать на себя ответственность. Почему это в итоге хорошо для индустрии и для настоящих специалистов: 🔹Для бизнеса: снижается доля балласта - сотрудников, которые не приносят значимой ценности. Это повышает общую эффективность команд, снижает издержки и позволяет создавать более качественные продукты. 🔹Для разработчиков: из отрасли уходят те, для кого программирование было лишь способом хорошо заработать без особой страсти к делу. В результате в командах остаются мотивированные специалисты, которые действительно любят свою работу и стремятся развиваться. Это повышает уровень коллаборации и делает работу более осмысленной. 🔹Для новичков: исчезает иллюзия быстрого и легкого успеха. Это заставляет более осознанно подходить к выбору карьеры, фундаментальнее учиться и сразу формировать правильные профессиональные привычки. Те, кто приходит в индустрию из интереса и готов вкладываться в развитие, в итоге оказываются в выигрыше. Стратегия выживания и успеха в новых условиях: Адаптация к новым правилам требует действий: 🔹Глубокое освоение стека и смежных областей. Перестать быть просто кодером. Изучать архитектуру, принципы DevOps, базовое понимание бизнес-процессов в своей предметной-области. 🔹Инвестиции в софт-скиллы. Умение ясно излагать мысли, презентовать свои решения, работать в команде и конструктивно решать конфликты стало критически важным. 🔹Умение продавать себя. Качественное резюме, ухоженный LinkedIn/GitHub и другие соц. сети, способность четко рассказать о своих достижениях и проектах на собеседовании - это обязательная часть работы современного разработчика. 🔹Непрерывное обучение. Технологии развиваются стремительно. Постоянное изучение нового (будь то новый фреймворк, язык или парадигма) - это не опция, а необходимость. 💡 Вывод: Тезис «ИТ-индустрия умерла» - это эмоциональная реакция на окончание эпохи аномально высокого и не всегда заслуженного спроса. Реальность такова, что индустрия не умерла, она повзрослела и стала более здоровой, селективной и требовательной. Это сложный, но правильный переход от рынка, где ценилась масса, к рынку, где в цене - качество и экспертиза. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик1,23%
- 2 июн.👣 Deeplinks во Flutter: настройка для Android и iOS Диплинки позволяют открывать приложение по ссылке - перешел по URL и сразу попал на нужный экран. Смена пароля по ссылке из письма, открытие конкретного видео или поста, переход на карточку товара по ссылке - все это работает через deeplinks. Во Flutter нет единого решения, потому что механизм завязан на платформу. Придется настраивать Android и iOS отдельно, но это не так страшно, как кажется. Для обработки ссылок внутри Flutter удобнее всего использовать пакет app_links. Он официально поддерживается, работает на всех платформах. Добавляем пакет в проект: Для добавления пакета в проект можно выполнить команду в терминале: flutter pub add app_links Либо добавить следующую строку в блок dependencies в файле pubspec.yaml: app_links: ^7.1.1 Настройка для Android: В файле android/app/src/main/AndroidManifest.xml внутри <activity> нужно добавить intent-filter. Это правило, которое говорит системе что нужно обрабатывать ссылки такого вида. <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="your-domain.com" /> </intent-filter> Если используете кастомную схему (не http/https), укажите ее вместо https. App Links (https): Для автоматического открытия ссылок в приложении нужно: 🔵Указать android:autoVerify="true" в intent-filter. 🔵Разместить файл assetlinks.json на сервере в папке .well-known (домен должен совпадать с указанным в intent-filter). Пример файла assetlinks.json: [ { "relation": [ "delegate_permission/common.handle_all_urls" ], "target": { "namespace": "android_app", "package_name": "com.example.yourapp", "sha256_cert_fingerprints": [ "ваш SHA256 отпечаток" ] } } ] SHA256 можно получить из Google Play Console или сгенерировать через keytool. Настройка для iOS: Custom scheme: Добавьте схему в Xcode: откройте Info.plist как исходный код и добавьте: <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLSchemes</key> <array> <string>myapp</string> </array> </dict> </array> Universal Links (https): Нужно: 🔵Включить Associated Domains в Capabilities проекта Xcode. 🔵Добавить applinks:your-domain.com. 🔵Разместить файл apple-app-site-association на сервере в папке .well-known. Пример файла apple-app-site-association: { "applinks": { "apps": [], "details": [ { "appID": "TEAMID.com.example.yourapp", "paths": ["*"] } ] } } TEAMID можно найти в Apple Developer Account. 🔗 Читать подробнее 💡 Вывод: Диплинки во Flutter настраиваются в несколько этапов: правим манифест на Android, добавляем entitlements на iOS, кладем файлы на сервер, а в коде используем app_links для получения ссылок и Navigator для переходов. app_links берет на себя всю сложность получения deeplink на обеих платформах. Вам остается только подписаться на поток и написать логику переходов. После правильной настройки приложение будет корректно открываться по ссылкам из писем, мессенджеров или браузера. Главное не забыть протестировать все сценарии и убедиться, что файлы assetlinks.json и apple-app-site-association доступны по правильным адресам. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO1,15%
- 14 июл.👣 Создаем виджеты для Android и iOS во Flutter-приложении Виджеты на домашнем экране - это быстрый способ показать пользователю актуальную информацию без необходимости открывать приложение. Погода, задачи, уведомления, статистика - все это можно вынести на главный экран. Во Flutter нет встроенных средств для работы с виджетами, но есть нативные инструменты и библиотека home_widget, которая помогает их интегрировать. Что такое виджеты: Виджеты - это компонент интерфейса на главном экране устройства. Он показывает информацию или предоставляет доступ к действиям без запуска приложения. Виджеты бывают разных типов: 🔵Информационные виджеты показывают актуальные данные - погоду, курс валют, количество шагов. Они обновляются по расписанию или при изменении данных. 🔵Виджеты коллекций отображают несколько элементов одного типа - например, последние статьи из новостного приложения или фотографии из галереи. 🔵Виджеты управления предоставляют быстрый доступ к часто используемым действиям - запуск поиска, создание заметки, управление плеером. 🔵Гибридные виджеты комбинируют функции разных типов. Например, музыкальный виджет одновременно показывает текущий трек (информационная часть) и предоставляет кнопки управления (управляющая часть). Нативные инструменты: Для каждой платформы используется свой набор инструментов. На Android виджеты можно создавать двумя способами: через XML или с помощью Jetpack Glance. Glance - более современное решение на основе Compose. Оно позволяет писать декларативный код, не заморачиваясь с XML-макетами и управлением состояниями. Glance поддерживает большинство компонентов Compose: текст, кнопки, контейнеры. На iOS виджеты реализуются через WidgetKit, доступный с iOS 14. Они создаются на SwiftUI и хорошо интегрируются в экосистему Apple. WidgetKit работает с TimelineProvider, который отвечает за данные и расписание обновлений и Entry - моделью данных для виджета. Библиотека home_widget: Для связи Flutter-приложения с нативными виджетами используется библиотека home_widget. Она предоставляет удобные методы для сохранения данных и обновления виджетов. Основные методы: 🔵saveWidgetData - сохраняет данные в хранилище виджета. 🔵updateWidget - обновляет виджет на экране. 🔵getWidgetData - читает данные из виджета обратно в Flutter. Пример использования: Future<void> _sendAndUpdate(int? value) async { await HomeWidget.saveWidgetData(_countKey, value); await HomeWidget.updateWidget( androidName: 'CounterGlanceWidgetReceiver', iOSName: 'CounterWidget' ); } Сначала данные сохраняются через saveWidgetData, затем вызывается updateWidget с указанием имени виджета для каждой платформы. 🔗 Читать подробнее 💡 Вывод: Виджеты - это полезный способ повысить вовлеченность пользователей. Во Flutter нет встроенной поддержки виджетов, но есть надежный путь через нативные инструменты. На Android - Glance (или классические XML-виджеты). На iOS - WidgetKit. Библиотека home_widget связывает Flutter-код с нативной реализацией, позволяя сохранять данные и обновлять виджеты из Dart. Это не самый простой путь, но он рабочий и хорошо документированный. Если вы хотите добавить виджеты в свое Flutter-приложение, начните с изучения Glance для Android и WidgetKit для iOS. А библиотека home_widget поможет соединить все воедино. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик1,14%
- 25 мая👣 Релиз Dart 3.12: ИИ-экосистема и синтаксические улучшения Вместе с новой версией Flutter 3.44 команда также выпустила Dart 3.12. Обновление не самое революционное, но несколько приятных изменений в языке и экосистеме все же есть. Приватные именованные параметры: Раньше нельзя было написать конструктор с параметром, начинающимся на underscore. Если поле приватное, приходилось городить список инициализации: class Bird { final String _name; Bird({required String name}) : _name = name; } Теперь можно короче: class Bird { final String _name; Bird({required this._name}); } Снаружи параметр остается публичным - underscore автоматически отбрасывается. Мелочь, но приятная. Первичные конструкторы (эксперимент): Одна из самых ожидаемых фич. Позволяет объявлять класс одной строкой: class Point(final int x, final int y); Вместо: class Point { final int x; final int y; Point(this.x, this.y); } Пока это экспериментальная функция, доступная с флагом --enable-experiment=primary-constructors. Если фича приживется, классы в Dart станут заметно лаконичнее. Genkit Dart в превью: Open-source фреймворк для создания ИИ-приложений на Dart и Flutter. С единым API для Google Gemini, Anthropic Claude и OpenAI. Можно писать логику один раз и запускать где угодно - на сервере или прямо в приложении. Плюс локальный UI для отладки промптов и трассировок. Agentic Hot Reload: Еще одно нововведение - горячая перезагрузка для ИИ-агентов. Через Dart MCP сервер агент сам подключается к запущенному приложению, вносит изменения и перезагружает UI. Без ручного копирования URI и настройки DTD. 🔗 Читать подробнее 💡 Вывод: Dart 3.12 - не про революцию, а про эволюцию. Язык становится удобнее, экосистема обрастает ИИ-инструментами, а горячая перезагрузка для агентов упрощает работу с нейросетями в коде. Основные конструкторы пока экспериментальны, но их появление говорит о том, что команда думает в правильном направлении. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO1,12%
- 12 июн.📱 Что делает команда git cherry-pick? Команда git cherry-pick позволяет перенести отдельный коммит из одной ветки в другую, не сливая ветки целиком. Это полезно, когда нужно взять только конкретные изменения из другой ветки. Как это работает: 🔵Находит коммит (по хешу) в истории Git. 🔵Применяет его изменения к текущей ветке, создавая новый коммит (с другим хешем). Пример использования: # Переключимся в ветку, куда нужно перенести коммит git checkout feature # Перенесем коммит с хешем a1b2c3 git cherry-pick a1b2c3 Вывод: git cherry-pick – это точечный инструмент для переноса отдельных изменений. Используйте его аккуратно, чтобы не запутать историю коммитов. Подписаться на канал: ➡️ Flutter & Dart | Мобильный трудоголик Закрытый канал: 🚀 Мобильный трудоголик PRO0,93%