en
Feedback
Flutter Friendly

Flutter Friendly

Open in Telegram

Канал Friflex о разработке на Flutter. Обновления, плагины, полезные материалы — превращаем знания в реальный опыт, доступный каждому разработчику. 🔗 Наш канал для разработчиков: @friflex_dev 🔗 Канал о продуктовой разработке: @friflex_product

Show more
1 015
Subscribers
-124 hours
-17 days
-430 days
Posts Archive
К нам едет ревизор, или как пройти проверку на защиту критических данных в приложении на Flutter Анна, Flutter Team Lead Friflex, в этой статье разобрала 7 основных вещей, которые больше всего волнуют аудиторов. 🔸Можно ли запустить приложение в небезопасной среде — на root/jailbreak устройствах и на эмуляторах? 🔸Какие библиотеки внедряются в проект? 🔸В каком виде и где хранятся критические данные? 🔸Какие разрешения запрашивает приложение? 🔸Доступно ли превью страницы с чувствительными данными в фоновом режиме? 🔸Доступен ли запуск приложения, установленного из недоверенного источника? 🔸Актуальна ли версия Flutter? Теперь вы на шаг ближе к прохождению аудита.

Привет, это Роза, 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 — делитесь ими в комментариях!

Привет! На связи Анна, Friflex Flutter Team Lead Совсем недавно всеми известная библиотека bloc обновилась до версии 9.0.0. В
Привет! На связи Анна, 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
Как организовать папки внутри фичи? С помощью нового плагина Flutter Friflex для VSCode от нашего Tech Lead Юрия Петрова. Что умеет плагин? 🔸создавать папки для отдельной фичи 🔸создавать StatefulWidget и StatelessWidget по названию файла 🔸создавать класс согласно названию файла Если вы захотите поменять структуру для генерации, то сделать это можно в папке .friflex_config, изменив шаблон. Плагин прошел проверку и опубликован. ➡️Исходный код — здесь.

Привет, это Катя, 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
Затем попробуйте запустить проект, чтобы проверить работоспособность. Теперь проект должен успешно запускаться 🥳 Если вы сталкивались с подобной проблемой и решили ее иным способом, поделитесь своим опытом в комментариях!

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-файлах применяются плейсхолдеры. О них я расскажу в следующем посте.

🕊️Знакомьтесь, Flutter Observe @FlutterObserver_bot Наш Tech Lead Юрий Петров создал Telegram-бота, который отслеживает репозитории Flutter и Dart и оперативно уведомляет о новых релизах и изменениях в ветке STABLE. ➡️Технические детали: Бот написан на Dart, база данных: SQLite + Drift. ➡️Что дальше? В планах — добавить дашборды активности репозиториев и возможность отслеживания пакетов на Pub.dev. @FlutterObserver_bot, запомнили?

«Он сказал мне, что жизнь, как в мечте, получу я без всяких преград»🐼 Но только если ваше приложение пройдет аудит. Виды, эт
+4
«Он сказал мне, что жизнь, как в мечте, получу я без всяких преград»🐼 Но только если ваше приложение пройдет аудит. Виды, этапы и как подготовиться — на карточках. 📎Полезные ссылки: Статья на Хабре OWASP Пример чек-листа на Стингрей

А вдруг вы прямо сейчас пишете сервис на Dart, задача которого — отправить миллион сообщений ровно в 12 дня? Юрий Петров, Tech Lead Friflex, написал статью, как это можно сделать: 🔸Установить и запустить контейнер с RabbitMQ 🔸Настроить RabbitMQ 🔸Создать Producer (отправителя) на Flutter 🔸Создать Consumer (потребителя) на Flutter Сохраняйте, чтобы не потерять🔖

Релиз приложения + чек-лист для запуска = 🏆 Собрали фичи, которые лучше добавить в приложение перед первым же релизом. ✔️Сбор реакций «нравится — не нравится» Настроить автоматический запрос можно в виде модального окна с просьбой оценить приложение. Например, изобразить два смайла — веселый и грустный. ✔️Hard/soft update Чтобы избежать проблем с недоступными или поломанными функциями, лучше использовать Feature Toggle, то есть переключатели. ✔️Аналитика (Appmetrica, GA и другие) Поможет оценить эффективность приложения и выявить направления для продвижения. Будут полезны такие данные, как количество ежедневной аудитории (DAU), частота использования функций приложения и метрики возврата аудитории. ✔️Push уведомления (Firebase, OneSignal и другие) Правильно настроенная отправка уведомлений вернет в приложение пользователей, которые давно не заходили. ✔️Форма обратной связи Это позволит лучше понять путь пользователя в приложении. Настройте пассивный фидбэк, добавив отдельную кнопку «связаться с нами» в меню приложения. ✔️Поддержка кэширования У этой фичи много плюсов, одна из которых — работа приложения без доступа интернету. Используйте такой вариант локального хранения данных, как хранение в оперативной памяти приложения или сохранение ответов сервера на диск в виде отдельных файлов. ✔️Поддержка SSL-pinning Привязка сертификата или публичного ключа сервера к клиенту особенно актуальна для приложений, требующих высокого уровня защиты данных. ✔️Трекеры ошибок (FireBase Crashlytics, Appmetrica и другие) Интеграция с FireBase Crashlytics происходит шаблонно, особенно на Flutter, и не требует дополнительных действий. ✔️Рекламные блоки Это один из наиболее эффективных инструментов монетизации мобильного приложения. Разместить рекламные блоки можно при запуске или более нативно в контенте приложения. ✔️Удаленная конфигурация приложения Файл различных конфигураций приложения лежит удаленно на сервере или сервисе. Это позволяет проводить различные эксперименты в приложении, не перевыкладывая его. Все из списка есть? Ваше приложение готово покорить заказчика и стать любимчиком пользователей.

Привет, Flutter-разработчики! Есть вопрос. Какие функции обязательно должны быть перед выпуском приложения в продакшн? Можно выбрать несколько вариантов или написать свой в комментариях.
Anonymous voting

С наступающим Новым годом, Flutter-герои! Пусть 2025 принесет вам стабильные билды, меньше багов и больше вдохновения. А мы п
С наступающим Новым годом, Flutter-герои! Пусть 2025 принесет вам стабильные билды, меньше багов и больше вдохновения. А мы подготовили для вас Flutter-елочку. Есть предложения, как еще ее можно нарядить?🎄

🎁 Вишлисты в студию! Чтобы близкие знали, что подарить вам, собрали несколько вариантов вишлистов: тут и для души, и для раб
+5
🎁 Вишлисты в студию! Чтобы близкие знали, что подарить вам, собрали несколько вариантов вишлистов: тут и для души, и для работы. Осталось только поделиться.

Итоги года: какой ты таск в бэклоге?
Anonymous voting

Юра, Tech Lead Flutter-команды Friflex, поделился новой подробной инструкцией, как установить все необходимое для написания п
Юра, Tech Lead Flutter-команды Friflex, поделился новой подробной инструкцией, как установить все необходимое для написания приложения для Aurora на Flutter Смотреть: 📎на YouTube 📎в VK

Как создать эффективный BDUI-фреймворк? Делимся ключевыми выводами из доклада Никиты Синявина из BetBoom. На CrossConf он под
+6
Как создать эффективный BDUI-фреймворк? Делимся ключевыми выводами из доклада Никиты Синявина из BetBoom. На CrossConf он поделился опытом использования DUIT. На карточках — ключевые требования к фреймворку, его преимущества и сравнение с DivKit от Яндекса🖱

Продолжение следует

🕊️ Смотрим Flutter in Production — и вот несколько красивых цифр. Голосуем, что впечатляет больше всего?
Anonymous voting

#пакет_недели — google_sign_in. Он помогает аутентифицировать пользователей через их аккаунт Google в приложениях на Flutter. Главное о google_sign_in 🔸Он использует OAuth 2.0 для аутентификации и управления сессиями. Это позволяет безопасно идентифицировать пользователей и получать доступ к их данным (с их разрешения). 🔸Он сохраняет состояние входа, и если пользователь уже авторизован, приложение может получать его данные автоматически. 🔸Он работает на iOS, Android и Web, но настройка для каждой платформы может отличаться. Например, для Web нужно отдельно настроить OAuth. Как использовать Погрузиться во все детали можно с примером на Github. ❗️Приложение будет зависеть от того, есть ли у пользователя учетная запись в Google, и это может стать проблемой. ❤️ Точно в цель 🤔 Без аккаунта Google — не полетит

Flutter обновился, но вы уже наверняка это знаете. Спросили Юру, нашего Tech Lead, про самые полезные улучшения, а он ответил: