Flutter Friendly
الذهاب إلى القناة على Telegram
Канал Friflex о разработке на Flutter. Обновления, плагины, полезные материалы — превращаем знания в реальный опыт, доступный каждому разработчику. 🔗 Наш канал для разработчиков: @friflex_dev 🔗 Канал о продуктовой разработке: @friflex_product
إظهار المزيد1 015
المشتركون
-124 ساعات
-17 أيام
-430 أيام
أرشيف المشاركات
1 015
К нам едет ревизор, или как пройти проверку на защиту критических данных в приложении на Flutter
Анна, Flutter Team Lead Friflex, в этой статье разобрала 7 основных вещей, которые больше всего волнуют аудиторов.
🔸Можно ли запустить приложение в небезопасной среде — на root/jailbreak устройствах и на эмуляторах?
🔸Какие библиотеки внедряются в проект?
🔸В каком виде и где хранятся критические данные?
🔸Какие разрешения запрашивает приложение?
🔸Доступно ли превью страницы с чувствительными данными в фоновом режиме?
🔸Доступен ли запуск приложения, установленного из недоверенного источника?
🔸Актуальна ли версия Flutter?
Теперь вы на шаг ближе к прохождению аудита.
1 015
Привет, это Роза, Flutter Dev Friflex. Сегодня расскажу, как использовать ARB-файл для локализации на максимум. Что это такое и как работает, писала в этом посте.
Если вы занимаетесь локализацией приложений, то наверняка сталкивались с ситуациями, что в текстах встречаются динамические значения. Например, имя пользователя, дату или сумма денег. Чтобы не писать все это жестко в коде, в ARB-файле есть плейсхолдеры.
Что это такое
Плейсхолдеры — это метки, которые заменяются на реальные значения в runtime.
Что они содержат
🔴 description — описание, которое помогает разработчикам понять контекст строки и ее назначение
🔴 example — пример использования строки
🔴 type — тип данных: String, Object, int, double, num, DateTime
Некоторые типы позволяют настроить поведение еще точнее:
🔴Для чисел (num, int, double): параметры форматирования, такие как валюта, количество знаков после запятой
🔴Для дат (DateTime): поддержка форматов и кастомных шаблонов для отображения дат
Например:
"pageHomeBalance" : "Your balance is {amount} on {date}",
"@pageHomeBalance" : {
"placeholders": {
"amount": {
"type": "double",
"format": "currency",
"example": "$1000.00",
"description": "Account balance",
"optionalParameters": {
"decimalDigits": 2,
"name": "USD",
"symbol": "$",
"customPattern": "¤#0.00"
}
},
"date": {
"type": "DateTime",
"format": "yMd",
"example": "11/10/2021",
"description": "Balance date"
}
}
}
Здесь {amount} и {date} — плейсхолдеры, которые заменяются на реальные значения при отображении. Основные параметры плейсхолдеров — в таблице.
Виды плейсхолдеров
Виды плейсхолдеров:
1. Standard Placeholder (`{}`): для подстановок динамических значений.
2. Plural: изменяет текст в зависимости от количества объектов.
3. Select: выбирает строку в зависимости от кастомного параметра. Например, от времени суток.
4. Gender: изменяет текст в зависимости от пола
💬 Примечания
Указывайте other на случай неожиданных значений.
Plural, Select, Gender используют синтаксис ICU.
Если у вас есть свои лайфхаки или рекомендации по работе с ARB — делитесь ими в комментариях!1 015
Привет! На связи Анна, Friflex Flutter Team Lead
Совсем недавно всеми известная библиотека bloc обновилась до версии 9.0.0. Вместе с ней критические изменения в мажорном обновлении получили:
🔴flutter_bloc (v9.0.0)
🔴hydrated_bloc (v10.0.0)
🔴bloc_test (v10.0.0)
Что эти обновления нам принесли и стоит ли обновляться в ближайшее время? Разберем по пунктам!
1️⃣ Минимальная версия Dart SDK поднята до 2.14.
2️⃣ Удален класс BlocOverrides. Этот объект был внедрен в библиотеку bloc в версии 8.0.0 и успешно работал на чистых Dart программах, но в приложениях на Flutter он вызывал много критичных ошибок.
Из-за этого создатели уже в версии bloc 8.1.0 пометили его как Deprecated и рекомендовали к замене на
Bloc.observer и Bloc.transformer. Сейчас в версии 9.0.0 класс был удален полностью — самое время обновиться и избавиться от проблемного API 🙂
3️⃣ Представлен EmittableStateStreamableSoure. Новый интерфейс позволяет библиотеке bloc_test отвязаться от прямого использования реализаций BlocBase. Как результат — метод тестирования блоков blocTest больше не зависит от BlocBase.
4️⃣ Добавлена поддержка WASM. Отличная новость для тех, кто использует библиотеку hydrated_bloc и кому необходимо компилировать Flutter-приложения в WASM — обновление до версии 10.0.0 позволит это сделать!
5️⃣ Изменено поведение HydratedStorage.build(). В предыдущей версии библиотеки повторный вызов метода HydratedStorage.build() возвращал кэшированный экземпляр хранилища. Теперь проблема решена — каждый новый вызов будет создавать новый объект.
Принимать решение о том, поднимать ли версии в своих проектах или нет, конечно, стоит индивидуально, учитывать специфику приложения и остальных зависимостей. Но эти изменения однозначно стоят внимания!
Подробнее ознакомиться с документацией по миграции можно здесь.1 015
Как организовать папки внутри фичи? С помощью нового плагина Flutter Friflex для VSCode от нашего Tech Lead Юрия Петрова.
Что умеет плагин?
🔸создавать папки для отдельной фичи
🔸создавать StatefulWidget и StatelessWidget по названию файла
🔸создавать класс согласно названию файла
Если вы захотите поменять структуру для генерации, то сделать это можно в папке .friflex_config, изменив шаблон.
Плагин прошел проверку и опубликован.
➡️Исходный код — здесь.
1 015
Привет, это Катя, Flutter Dev Friflex. Недавнее обновление Android Studio вызвало проблему на целый день. Сегодня расскажу, как сделать так, чтобы ваше рабочее окружение снова заработало без ошибок.
Проблема
После обновления с AS 2023.2.1 на AS 2024.2.1 начала появляться ошибка:
ERROR: JAVA_HOME is set to an invalid directory
Причина
Эта ошибка возникает из-за того, что при установке новой версии Android Studio автоматически обновляется версия Java, что может нарушить совместимость.
Шаги решения
1. Установка OpenJDK 17 через brew. Установите нужную версию Java с помощью команды
brew install openjdk@17.
Подробнее о пакете можно узнать на странице установки OpenJDK через brew.
2. Переопределение JAVA_HOME в ~/.zshrc. Обратите внимание, что этот подход может не сработать, так как параметр JAVA_HOME устанавливается, но не применяется в системе. Добавьте следующую строку в ваш ~/.:
export JAVA_HOME=/opt/homebrew/opt/openjdk@17
3. Проверка текущих настроек Flutter. Выполните команду:
flutter config --list
Обратите внимание на параметр jdk-dir. Он указывает текущий путь до Java Development Kit (JDK).
4. Обновление пути до JDK. Замените текущий путь на установленную версию OpenJDK.
Например:
flutter config --jdk-dir /opt/homebrew/opt/openjdk@17
Если вы уже устанавливали JDK другим способом, укажите соответствующий путь.
5. Проверка конфигурации Flutter. Убедитесь, что изменения применились, выполнив:
flutter config --list
Затем попробуйте запустить проект, чтобы проверить работоспособность.
Теперь проект должен успешно запускаться 🥳
Если вы сталкивались с подобной проблемой и решили ее иным способом, поделитесь своим опытом в комментариях!1 015
ARB-формат во всей красе
Привет, это Роза, Flutter Dev Friflex. В последнее время я много работаю с локализацией и заметила интересную вещь: ARB-файл часто недооценен. Сейчас расскажу, что это и как работает.
Что это
ARB (Application Resource Bundle) — это, по сути, файл JSON, улучшенный для локализации, с расширением
.arb. Проще говоря, там хранятся переводы текста, которые вы видите в приложении. Помимо ключей и строк, ARB поддерживает:
🔴описания контекста
🔴примеры использования
🔴типы данных
🔴форматирование
Например:
{
"@@locale": "ru",
"topicTitle": "Arb-формат во всей красе",
"@topicTitle": {
"description": "Заголовок для статьи про Arb-формат"
}
}
Здесь ключ topicTitle хранит строку, а под @topicTitle — метаданные. При помощи метадаты вы можете указывать для ключей локализации:
🔸context: пояснения для переводчиков и разработчиков
🔸type: указание типа строки или ее назначения
🔸comment: подсказки к строкам
Например:
{
"welcome": "Добро пожаловать, {name}!",
"@welcome": {
"description": "Сообщение для приветствия",
"context": "Для нового пользователя",
"type": "Information",
"comment": "Имя {name} нельзя переводить."
}
}
Где используется
Во Flutter ARB-файлы тесно интегрированы с библиотекой intl, которая отвечает за локализацию.
Как это работает
1️⃣ Создаете отдельные ARB-файлы для всех языков, которые хотите поддерживать.
2️⃣ С помощью команды flutter gen-l10n генерируете Dart-код, который автоматически подтягивает правильные переводы для языка пользователя.
3️⃣ В коде просто обращаетесь к строкам по их ключам, а перевод подставляется автоматически.
❗️В реальных приложениях часто требуется использовать динамические значения внутри строк.
Например, вместо «Привет, Роза!» в строке может быть «Привет, {name}!»
Для этого в ARB-файлах применяются плейсхолдеры. О них я расскажу в следующем посте.1 015
🕊️Знакомьтесь, Flutter Observe @FlutterObserver_bot
Наш Tech Lead Юрий Петров создал Telegram-бота, который отслеживает репозитории Flutter и Dart и оперативно уведомляет о новых релизах и изменениях в ветке STABLE.
➡️Технические детали:
Бот написан на Dart, база данных: SQLite + Drift.
➡️Что дальше?
В планах — добавить дашборды активности репозиториев и возможность отслеживания пакетов на Pub.dev.
@FlutterObserver_bot, запомнили?
1 015
+4
«Он сказал мне, что жизнь, как в мечте, получу я без всяких преград»🐼
Но только если ваше приложение пройдет аудит. Виды, этапы и как подготовиться — на карточках.
📎Полезные ссылки:
Статья на Хабре
OWASP
Пример чек-листа на Стингрей
1 015
А вдруг вы прямо сейчас пишете сервис на Dart, задача которого — отправить миллион сообщений ровно в 12 дня? Юрий Петров, Tech Lead Friflex, написал статью, как это можно сделать:
🔸Установить и запустить контейнер с RabbitMQ
🔸Настроить RabbitMQ
🔸Создать Producer (отправителя) на Flutter
🔸Создать Consumer (потребителя) на Flutter
Сохраняйте, чтобы не потерять🔖
1 015
Релиз приложения + чек-лист для запуска = 🏆
Собрали фичи, которые лучше добавить в приложение перед первым же релизом.
✔️Сбор реакций «нравится — не нравится»
Настроить автоматический запрос можно в виде модального окна с просьбой оценить приложение. Например, изобразить два смайла — веселый и грустный.
✔️Hard/soft update
Чтобы избежать проблем с недоступными или поломанными функциями, лучше использовать Feature Toggle, то есть переключатели.
✔️Аналитика (Appmetrica, GA и другие)
Поможет оценить эффективность приложения и выявить направления для продвижения. Будут полезны такие данные, как количество ежедневной аудитории (DAU), частота использования функций приложения и метрики возврата аудитории.
✔️Push уведомления (Firebase, OneSignal и другие)
Правильно настроенная отправка уведомлений вернет в приложение пользователей, которые давно не заходили.
✔️Форма обратной связи
Это позволит лучше понять путь пользователя в приложении. Настройте пассивный фидбэк, добавив отдельную кнопку «связаться с нами» в меню приложения.
✔️Поддержка кэширования
У этой фичи много плюсов, одна из которых — работа приложения без доступа интернету. Используйте такой вариант локального хранения данных, как хранение в оперативной памяти приложения или сохранение ответов сервера на диск в виде отдельных файлов.
✔️Поддержка SSL-pinning
Привязка сертификата или публичного ключа сервера к клиенту особенно актуальна для приложений, требующих высокого уровня защиты данных.
✔️Трекеры ошибок (FireBase Crashlytics, Appmetrica и другие)
Интеграция с FireBase Crashlytics происходит шаблонно, особенно на Flutter, и не требует дополнительных действий.
✔️Рекламные блоки
Это один из наиболее эффективных инструментов монетизации мобильного приложения. Разместить рекламные блоки можно при запуске или более нативно в контенте приложения.
✔️Удаленная конфигурация приложения
Файл различных конфигураций приложения лежит удаленно на сервере или сервисе. Это позволяет проводить различные эксперименты в приложении, не перевыкладывая его.
Все из списка есть? Ваше приложение готово покорить заказчика и стать любимчиком пользователей.
1 015
Привет, Flutter-разработчики! Есть вопрос. Какие функции обязательно должны быть перед выпуском приложения в продакшн? Можно выбрать несколько вариантов или написать свой в комментариях.
1 015
С наступающим Новым годом, Flutter-герои!
Пусть 2025 принесет вам стабильные билды, меньше багов и больше вдохновения.
А мы подготовили для вас Flutter-елочку. Есть предложения, как еще ее можно нарядить?🎄
1 015
+5
🎁 Вишлисты в студию!
Чтобы близкие знали, что подарить вам, собрали несколько вариантов вишлистов: тут и для души, и для работы. Осталось только поделиться.
1 015
Юра, Tech Lead Flutter-команды Friflex, поделился новой подробной инструкцией, как установить все необходимое для написания приложения для Aurora на Flutter
Смотреть:
📎на YouTube
📎в VK
1 015
+6
Как создать эффективный BDUI-фреймворк?
Делимся ключевыми выводами из доклада Никиты Синявина из BetBoom. На CrossConf он поделился опытом использования DUIT. На карточках — ключевые требования к фреймворку, его преимущества и сравнение с DivKit от Яндекса🖱
1 015
🕊️ Смотрим Flutter in Production — и вот несколько красивых цифр. Голосуем, что впечатляет больше всего?
1 015
#пакет_недели — google_sign_in. Он помогает аутентифицировать пользователей через их аккаунт Google в приложениях на Flutter.
Главное о google_sign_in
🔸Он использует OAuth 2.0 для аутентификации и управления сессиями. Это позволяет безопасно идентифицировать пользователей и получать доступ к их данным (с их разрешения).
🔸Он сохраняет состояние входа, и если пользователь уже авторизован, приложение может получать его данные автоматически.
🔸Он работает на iOS, Android и Web, но настройка для каждой платформы может отличаться. Например, для Web нужно отдельно настроить OAuth.
Как использовать
Погрузиться во все детали можно с примером на Github.
❗️Приложение будет зависеть от того, есть ли у пользователя учетная запись в Google, и это может стать проблемой.
❤️ Точно в цель
🤔 Без аккаунта Google — не полетит
1 015
Flutter обновился, но вы уже наверняка это знаете. Спросили Юру, нашего Tech Lead, про самые полезные улучшения, а он ответил:
متاح الآن! بحث تيليغرام 2025 — أهم رؤى العام 
