Flutter Friendly
749 subscribers
111 photos
52 videos
1 file
101 links
Канал Friflex о разработке на Flutter. Обновления, плагины, полезные материалы — превращаем знания в реальный опыт, доступный каждому разработчику.

🔗 Наш канал для разработчиков: @friflex_dev
🔗 Канал о продуктовой разработке: @friflex_product
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Привет! Это Анна, Friflex Flutter Team Lead.

Уже знаете про новость, которая потрясла мировое Flutter-сообщество? Разработка макросов, которых все так долго ждали, прекращается.

Предполагалось, что макросы в Dart смогут в режиме реального времени менять и дополнять существующий в проекте код с помощью некоторых вводных параметров от разработчика. Здесь сообщество видело значительное преимущество перед кодогенерацией — макросы не требовали бы постоянного ручного запуска генерации и тем самым снижали бы вероятность ошибок при компиляции из-за неактуальных сгенерированных файлов.

Но команда Dart заявила, что текущая реализация макросов слишком увеличивает время компиляции проекта. Это оказало негативное влияние на процесс hot reload и на удобство разработки в целом.

Что дальше?
Команда Dart выделила три основных направления развития:
- улучшения процесса сериализации и десериализации данных
- развитие augmentations
- улучшения работы build_runner

Подробнее ознакомиться с деталями можно в статье, а поделиться своими эмоциями — в комментариях.
👌— я так и знал(а)
🔥— я ждал(а)
🔥11👍53👌3🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥53
Forwarded from Friflex Dev
🎧Пятница, можно расслабиться, чтобы послушать плейлист для кодинга. Каждый трек тщательно отобран и проверен на себе нашим фронтенд-разработчиком Романом.

Плейлист будем дополнять, Делитесь в комментариях, под какие мелодии вам работается лучше всего.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84💩3👍2
Привет, это Роза, Flutter Dev Friflex👋

Сегодня расскажу о пакете meta, который помогает сделать Dart-код более понятным, поддерживаемым и безопасным.

Что такое пакет meta

Пакет meta — это библиотека от команды Dart, которая предоставляет аннотации для добавления метаданных в ваш код. Эти аннотации:

🖱 Документируют код: помогают понять, как правильно использовать функции, классы или переменные
🖱 Подсвечивают ошибки: инструменты анализа, такие как dart analyze, используют аннотации для поиска проблем в коде
🖱 Улучшают читаемость: делают код понятнее для команды и проще в сопровождении

Основные аннотации пакета meta

🔴@immutable — указывает, что класс неизменяемый и все его поля должны быть final
🔴@protected — говорит, что метод или поле предназначено только для использования внутри класса или его подклассов
🔴@visibleForTesting — Помечает метод или поле как доступное только для тестов.
🔴@sealed — отмечает, что класс нельзя наследовать за пределами этого файла
🔴@mustCallSuper — обязывает вызывать метод суперкласса при переопределении

Расширенные аннотации пакета meta

🔴@experimental — помечает элемент как экспериментальный и подверженный изменениям
🔴@UseResult — указывает, что результат функции или метода должен быть использован
🔴@alwaysThrows — заставляет метод всегда выбрасывать исключение
🔴@doNotStore — значение не должно сохраняться или кэшироваться
🔴@internal — говорит, что элемент предназначен для внутреннего использования и не является частью публичного API

Как использовать аннотации


import 'package:meta/meta.dart';

@immutable
class User {
final String name;
final int age;

const User(this.name, this.age);
}


Достаточно добавить аннотацию перед объявлением класса, метода или поля, чтобы она начала работать.

Если хотите узнать больше, загляните в документацию пакета.

Используйте аннотации из meta, чтобы писать качественный и профессиональный код. А если есть вопросы или предложения, пишите в комментариях. Обсудим 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
14🔥10👍3
Привет, снова с вами Катя, Flutter Dev Friflex. Сегодня расскажу про бета-версию Android 16.

Контекст такой: Google запустила публичное тестирование Android 16, и теперь пользователи могут установить бета-версию через OTA-обновление.

Что нового в Android 16 Beta 1

🔴Live Updates. Новый тип уведомлений, созданный для отображения статуса текущих событий. Это аналог Live Activities в iOS. С помощью Live Updates можно в реальном времени отслеживать процесс доставки заказа или следующий поворот, не открывая приложение ресторана или навигатора.

🔴Улучшенная адаптивность приложений. На устройствах с большими экранами система сможет игнорировать ограничения приложений по ориентации и размеру. Это позволит растягивать программы, которые не оптимизированы для работы на планшетах и складных устройствах.

🔴Обновления предиктивного жеста «Назад». Теперь поведение жеста возврата на предыдущий экран поддерживает и трехкнопочную навигацию. Удерживая кнопку «Назад», можно увидеть фрагмент предыдущего экрана.

🔴Совместимость с кодеком APV. Кодек Advanced Professional Video, разработанный Samsung, предназначен для записи и постобработки видео высокого качества.

🔴Десктоп-режим для планшетов. Эта функция сделает работу на планшете максимально схожей с работой на компьютере. Появятся плавающие окна, которые можно будет перетягивать, запускать в режиме одновременной работы и менять в размерах. А в нижней части экрана будет строка с приложениями.

📌Интересный факт: все экраны придется адаптировать под ландшафт, так как установка в портретной ориентации будет невозможна. Почему так? Смотрите здесь.

С какими устройствами совместима

С Android 16 Beta 1 совместимы смартфоны и планшеты серии Google Pixel: Pixel 6 и 6 Pro, Pixel 6a, Pixel 7 и 7 Pro, Pixel 7a, Pixel Fold, Pixel Tablet, Pixel 8 и 8 Pro, Pixel 8a, Pixel 9, 9 Pro, 9 Pro XL и 9 Pro Fold.

Как установить, и когда выйдет

Самый простой способ установки — зарегистрироваться в программе бета-тестирования. После установки бета-версии Android 16 вернуться к стабильной версии без сброса данных можно будет только после окончательного релиза Android 16. Говорят, стабильная версия выйдет в апреле-июне.

Подробнее читайте здесь.

🔥 — иду тестировать
☕️ — подожду стабильный релиз
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥95😱3🌚1
Привет! Это Анна, Friflex Flutter Team Lead. Сегодня расскажу о переменных окружения: как удобно и безопасно настроить их хранение и использование во Flutter-проектах.

Для разработки приложений стандартно создаются 2-3 основных окружения. В разных командах названия у них могут немного отличаться, но суть всегда одна:

🔴production — пользовательское окружение, берет реальные данные с бэкенда, в таком виде приложение попадет в сторы
🔴staging — окружение для тестирования взаимодействия с бэкендом, дает тестовые серверные данные и позволяет имитировать разные пользовательские сценарии
🔴development — окружение для внутренних процессов разработки, может управлять внутренними моковыми данными для тестирования логики работы приложения

В проектах с несколькими окружениями часто нужно подменять те или иные переменные динамически между prod, stage и dev. Именно для этого есть переменные оружения, которые стандартно хранятся в .env файлах.

Представим, что нам нужно настроить передачу переменых во все три окружения в нашем проекте. Для этого создадим в корне проекта директорию env со следующей структурой.

❗️Файлы .env необходимо добавлять в .gitignore и никогда не загружать в репозитории.

env
|_ prod.env
|_ stage.env
|_ dev.env


В каждый из файлов необходимо добавить те данные, которые в проекте должны подменяться от окружения к окружению. У нас это будет baseUrl для запросов на сервер и ключ API для доступа к AppMetrica.

requestBaseUrl='https://base-url.ru/'
appMetricaApiKey='your_api_key'


Чтобы приложение могло использовать эти переменные, подключим библиотеку envied. Она не только даст доступ к данным переменных, но и поможет зашифровать их, хранить в формате неочевидных наборов целых чисел.

Такая безопасность — главное преимущество этого пакета: данные переменных не будут использоваться в приложении в явном виде. Это значит, что при реверс-инжиниринге и прочих механизмах извлечения данных программного кода получить к ним доступ будет значительно сложнее.

Чтобы приложение получило доступ к переменным создадим интерфейс конфигурации

abstract interface class AppConfigInterface {
abstract final String requestBaseUrl;
abstract final String appMetricaApiKey;
}


Для каждого из окружений добавим реализацию интерфейса конфигурации с аннотацией класса @Envied(). Аннотация требует пути к файлу, откуда будут извлечены переменные окружения.

Поля внутри класса помечаются аннотацией @EnviedField() — сюда можно передать параметры названия переменной, значения по умолчанию, необходимости офусцировать данные и другие данные.

@Envied(name: 'Prod', path: 'env/prod.env')
class AppConfigProd implements AppConfigInterface {
@override
@EnviedField(obfuscate: true)
String get appMetricaApiKey => _AppConfigProd.appMetricaApiKey;

@override
@EnviedField(obfuscate: true)
String get requestBaseUrl => _AppConfigProd.requestBaseUrl;
}


После запуска кодогенерации объекты с аннотацией получают свои значения из указанного по пути файла .env. Зашифрованные значения в приложении хранятся в файле app_config.g.dart.

Готово! Теперь вы можете внедрить объект конфигурации в DI приложения и безопасно использовать переменные окружения!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍135🔥2👌1😍1
Привет! Это Роза, Flutter Dev Friflex👋

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

📌 Заменяй вложенные ListView и Column на CustomScrollView
Если у тебя сложная вложенная структура, CustomScrollView поможет избежать избыточных перестроений и повысит эффективность.

📌 Выбирай ListView.builder для длинных списков
В отличие от ListView, который создает все элементы сразу, ListView.builder рендерит только видимые элементы, что экономит память и ресурсы.

📌 Избегай SingleChildScrollView для длинных списков
Этот виджет загружает весь контент сразу, что приводит к утечке памяти. Он подходит только для небольших списков.

📌 Оптимизируй ListView с itemExtent или SliverFixedExtentList
Фиксированная высота элементов снижает нагрузку на систему прокрутки и делает ее более плавной.

📌 Избегай shrinkWrap в длинных списках
Он пересчитывает размеры всех элементов, что может замедлить рендеринг. Подробнее — в этом посте.

📌 Применяй NestedScrollView для SliverAppBar и TabBarView
Это позволит заголовку сворачиваться плавно и без рывков.

📌 Выбирай ReorderableListView вместо ListView для перетаскивания элементов
Он уже оптимизирован под такие сценарии и не требует сложной ручной обработки состояний.

📌 Добавляй AutomaticKeepAliveClientMixin для сохранения состояния элементов
Если в списке есть сложные элементы добавляй AutomaticKeepAliveClientMixin, чтобы Flutter не пересоздавал виджеты при прокрутке.

📌 Используй к ScrollablePositionedList для быстрой прокрутки к нужному элементу
Если нужно быстро прокручивать к определенному элементу, ScrollablePositionedList эффективнее, чем стандартный ListView.

📌 Пробуй ListView.separated вместо дополнительных Padding и Divider
Этот вариант более производительный, так как Flutter не создает ненужные виджеты для каждого элемента.

📌 Реализуй пагинацию для длинных списков
Если в твоем приложении большой список данных, загружай их по частям. Это снижает нагрузку на память и повышает производительность.

❗️Все эти советы зависят от контекста. Важно тестировать каждый случай.

А какие еще лайфхаки по прокрутке ты используешь? Пиши в комментариях!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍12❤‍🔥4🤩1
Продаем мак и покупаем винду?

Привет, с вами опять Катя, Flutter Dev Friflex. Слышали уже, что Apple открыла исходный код Swift Build — нового мощного движка сборки? Говорят, скоро разработчики смогут собирать Flutter-приложения для iOS на Windows. Давайте разберемся, что такое Swift Build и как он повлияет на разработку кроссплатформенных приложений.

Что это такое
Swift Build — это инструмент, который упрощает процесс сборки приложений на Swift. Он позволяет разработчикам управлять зависимостями, компилировать код и настраивать различные параметры сборки. Открытие исходного кода Swift Build означает, что разработчики могут изучать, изменять и адаптировать его под свои нужды.

Основные возможности Swift Build
🔴Управление зависимостями: легкое добавление и обновление библиотек.

🔴Настройка сборки: гибкие настройки для различных конфигураций и платформ.

🔴Оптимизация сборки: ускорение процесса сборки за счет эффективного управления ресурсами.

Возможности, которые открывает Swift Build
🔴Сборка на Windows: если Swift Build станет доступным для Windows, разработчики смогут собирать iOS-приложения без Mac.

🔴Упрощение процесса разработки: это упростит рабочий процесс для разработчиков, которые предпочитают Windows, и снизит барьер для входа в разработку под iOS.

🔴Расширение аудитории: больше разработчиков смогут создавать приложения для iOS, что приведет к увеличению числа кроссплатформенных приложений.

Реальность или мечта
Пока что сборка iOS-приложений на Windows остается скорее перспективой, чем реальностью. Несмотря на то, что Apple сделала Swift Build открытым, для полноценной сборки iOS-приложений все еще требуется Xcode, который доступен только на macOS.

Но сообщество активно обсуждает возможность адаптации Swift Build для работы на Windows, что может стать революцией в мире кроссплатформенной разработки.

🔥 — продаю мак
❤️ — люблю мак
Please open Telegram to view this post
VIEW IN TELEGRAM
24🔥15👍6
Всем привет! Это Анна, Friflex Flutter Team Lead. Сегодня делюсь с вами своим личным топ-5 самых полезных расширений для VSCode.

🔜 Flutter Widget Snippets
Сниппеты в VSCode — очень удобный инструмент для быстрого создания шаблонных и часто повторяющихся участков кода. Это расширение позволяет быстро создать большинство самых популярных виджетов во Flutter (например, Stateless/StatefulWidget, Layout).

Еще расширение дает доступ к Dart-сниппетам, с помощью которых можно быстро создавать классы, методы и переменные. Со сниппетами писать код можно гораздо быстрее. Но начинающим разработчикам рекомендую для начала изучить сам синтаксис, привыкнуть к разработке без сторонних подсказок, чтобы в дальнейшем не стать заложником дополнительных инструментов.

🔜 bloc
Для тех, кто в своих Flutter проектах использует библиотеку bloc, это расширение может стать незаменимым помощником.
Оно предоставляет набор сниппетов, с которыми в коде проще и быстрее добавлять виджеты в UI, создавать сами блоки и кубиты, а еще управлять их методами.

Расширение добавляет возможность быстро оборачивать виджеты в другие виджеты библиотеки через контекстное меню, а также создавать целые директории с первично настроенными связями между классами Bloc, State и Event. Находка для тех, кто не любит тратить время на организацию файлов и классов в них!

🔜 Flutter Tree
Еще одно полезное расширение для продвинутых Flutter-разработчиков.
С его помощью удобно добавлять вложенность виджетов: не теряешь время на написание параметров, расстановку скобок.

Например, если вам нужно создать контейнер со строкой виджетов внутри, это можно сделать простой записью Container>Row[Expanded>Text,ElevatedButton>Text]. В конце нажимаете Enter, и Flutter Tree все делает за вас — на выходе получаете сформированное дерево по вашему запросу.

🔜 Code Spell Checker
Это расширение пригодится не только Flutter-разработчикам, но и всем, кто пользуется VSCode. Оно помогает проверять написание слов в вашем коде. Будь то документация или название объектов в коде, расширение подчеркнет те слова, которые написаны некорректно и предложит варианты замены. Если слово написано верно, его можно вынести в исключения как для конкретного проекта, так и для вашего пользователя в общем. Поддерживает огромное количество языков, в том числе и русский.

🔜 Commit Message Editor
Почти все серьезные проекты требуют вести историю изменений в репозитории согласно соглашению о коммитах. Каждый коммит должен не только осмысленно отражать суть изменений, но и фиксировать тип изменений, измененные файлы и их критичность.

Чтобы оформлять коммиты по этим правилам, рекомендую Commit Message Editor. Расширение позволяет оформить коммит с помощью формы. Когда вы ее заполните, текст сам отформатируется и подставится в строку сообщения коммита.
Please open Telegram to view this post
VIEW IN TELEGRAM
9🔥5👍2🤩1
Привет, это Роза, Flutter Dev Friflex! 👋  

В Flutter существует огромное количество виджетов для управления размерами. Давайте сделаем быстрый дайджест и пройдемся по некоторым из них. Поехали!

🔴FittedBox
— Автоматически подстраивает дочерний виджет под доступное пространство, сохраняя пропорции.  
— Если контент слишком большой, уменьшает его, чтобы всё поместилось.  

🔴OverflowBox
— Позволяет дочернему элементу выходить за пределы родительского контейнера.  
— Игнорирует ограничения родителя, давая больше свободы.  

🔴ConstrainedBox
— Задаёт минимальные или максимальные размеры для дочернего элемента.  
— Накладывает ограничения, даже если содержимое больше или меньше заданных параметров.  

🔴LimitedBox
— Ограничивает размеры элемента, но только если они не заданы явно.  
— Устанавливает максимальный размер, если дочерний элемент не ограничен другими условиями.  

🔴AspectRatio
— Сохраняет определённое соотношение сторон (например, 16:9).  
– Автоматически подстраивает размеры элемента, сохраняя пропорции.   

🔴UnconstrainedBox
— Убирает все ограничения по размеру для дочернего элемента.  
— Позволяет дочернему виджету занимать столько места, сколько ему нужно.  

🔴IntrinsicWidth / IntrinsicHeight
— Позволяет элементу занимать минимально возможное пространство.  
— Вычисляет минимальный размер, необходимый для отображения дочернего элемента.  

🔴Flex, Expanded и Flexible
— Адаптивно распределяет пространство в Row или Column.  
Expanded — заполняет всё доступное пространство.  
Flexible — занимает пространство по возможности, но не жёстко.  

🔴Align
— Позволяет расположить элемент внутри родителя (например, по центру или в углу).  
— Задает позицию элемента относительно родительского контейнера.  

🔴LayoutBuilder  
— Динамически определяет доступный размер и позволяет перестроить UI.  
— Полезно для адаптации интерфейса под разные размеры экранов.   

❗️Важно
Используйте эти виджеты с умом. Некоторые из них могут повлиять на производительность и рендеринг. Тестируйте каждый случай!

💬 Делитесь в комментариях, какие виджеты используете чаще всего. Там же бонусом полезная табличка.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1711🔥5
Привет, с вами Катя, Flutter Dev Friflex. 

Сегодня я расскажу о новом расширении в Visual Studio Code для Swift. 

🔴Цель обновления
Сделать возможной разработку Swift-приложений на всех платформах. Это позволит разработчикам создавать приложения на Swift без ограничений по операционной системе.

🔴О переходе
Для тех, кто уже использует VS Code, переход будет плавным. Все существующие функции и инструменты останутся доступными, что делает адаптацию к новым возможностям легкой и удобной. Старый релиз должен автоматически установить новое расширение и отключить себя, а в дальнейшем все языковые функции будут предоставляться новым расширением.

📎Ссылка на установку расширения.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥84👌2
This media is not supported in your browser
VIEW IN TELEGRAM
10🔥6
Сегодня #Friflex_team заряжает знаниями на FlutterConf:

🔸12:40 — Юрий (руководитель отдела разработки) и Анна (Flutter TeamLead) в докладе «Router во Flutter. Когда думал, что все легко» расскажут про концепцию декларативного роутера.
📍Зал 1

🔸15:50 — Flutter-разработчики Роза и Екатерина в докладе «Как не наступать на одни и те же грабли: систематизация ошибок в разработке на Flutter» поделятся, как систематизировать ошибки, с которыми часто сталкиваются разработчики и предложат подходы по их минимизации.
📍Зал 2

Если вы здесь, то приходите послушать наши доклады и пообщаться. Присоединиться можно и онлайн.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍54
Media is too big
VIEW IN TELEGRAM
Flutter или …

На FlutterConf пообщались с Анной, Flutter TeamLead в Friflex, и поставили ее перед непростым выбором.

Что ответила Анна🖱
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥11👍5🍓1
Привет! Это Роза, Flutter Dev Friflex! 👋

Открывая любое приложение, скорее всего вы там увидите одну или 2 иконки. Но откуда они, и как добавить свои кастомные иконки? В Flutter вы можете работать с иконками, используя три основных подхода: 

1️⃣ Иконки из шрифтов (Icon Fonts) — встроенные иконки, такие как Material Icons.
2️⃣ SVG-иконки — обработка с помощью пакета flutter_svg
3️⃣ Векторная графика — использование vector_graphics для более быстрого рендеринга.

Предлагаю сравнить эти варианты и рассмотреть, когда и где использовать каждый из них.

🔸Иконки из шрифтов (Icon Fonts)
Иконки из шрифтов — это символы в формате шрифтов, например, Material Icons:
Icon(Icons.home, size: 32, color: Colors.blue)


Можно использовать кастомные шрифты с иконками. Например, с помощью IcoMoon:

1. Генерируем файл .ttf с иконками.
2. Подключаем в pubspec.yaml:

flutter:
      fonts:
        - family: CustomIcons
          fonts:
            - asset: assets/fonts/CustomIcons.ttf


3. Используем:
    
const Text(
'\uE900',
style: TextStyle(fontFamily: 'CustomIcons', fontSize: 32),
),

    


🔸SVG-иконки с flutter_svg:
Для кастомных иконок в векторном формате используем пакет flutter_svg:
import 'package:flutter_svg/flutter_svg.dart';

SvgPicture.asset(
  'assets/icons/home.svg',
  width: 32,
  height: 32,
  colorFilter: ColorFilter.mode(Colors.blue, BlendMode.srcIn),
)


🔸Векторная графика (Vector Graphics)
Для повышения производительности конвертируем SVG в формат vector_graphics. Он рендерится быстрее.

import 'package:vector_graphics/vector_graphics.dart';

VectorGraphic(
  assetName: 'assets/icons/home.vec',
  width: 32,
  height: 32,
)


Что выбрать?

Icon Fonts — для стандартных иконок с высокой производительностью.
Flutter SVG — для кастомных и анимированных иконок.
Vector Graphics — для максимальной скорости рендеринга.

Какой метод используете вы? Делитесь в комментариях! 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍85🤩1
Привет! С вами вновь Анна, Friflex Flutter Team Lead.

🛒Что делать, если в Flutter-приложение нужно добавить возможность покупок виртуальных товаров и услуг? Сегодня подробно разберемся с нюансами в трех самых популярных сторах — Google Play, AppStore и RuStore.

Довольно часто в коммерческих проектах появляется необходимость настраивать внутренние оплаты. Они могут потребоваться как для разовой покупки набора объектов (например, внутренняя валюта приложения), так и для получения постоянного доступа к закрытому контенту в течение некоторого времени (подписки).

Приобретение подобного виртуального товара называется цифровой покупкой. При реализации таких покупок важно учитывать, что Google Play разрешает проведение оплаты только через свою внутреннюю систему платежей. Это правило четко указано в их документации, и пренебрежение им может стать причиной отклонения вашей сборки.

Но в оплате через Google Play есть нюанс — даже при корректной интеграции в ваше приложение и настройке в кабинете разработчика проведение платежей в России, к сожалению, недоступно.

В AppStore подход немного лояльнее. Клиенты имеют возможность оплачивать покупки. Для этого в аккаунте Apple достаточно подключить как источник оплаты мобильный телефон. Важно: в России Apple поддерживает только номера операторов МТС и Билайн.
📎Подробнее о доступных способах оплаты тут.

Кроме этого для аккаунтов разработчиков, зарегистрированных в РФ, есть возможность провести цифровые покупки через внешние ссылки. Для этого необходимо подать в App Store Connect специальную заявку, после одобрения которой появится возможность настроить StoreKit External Purchase Link Entitlement в приложении. Комиссия за такие платежи — 27%.
📎Делюсь полезным туториалом по настройке и заполнению заявки.

Меньше всего проблем сейчас встречается в оплатах через RuStore. Здесь нет никаких ограничений на источники платежей и регион, откуда производится оплата. RuStore позволяет оплатить продукт различными способами, например, картой онлайн, через сервисы T-Pay, SberPay и даже СБП, что сейчас очень удобно для пользователей.

👍В следующем посте разберем на практике, как настроить в приложении in-app покупки c вызовом нативных окон от сторов.
Делитесь своим опытом в комментариях.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥128❤‍🔥4👍3👌2🆒1
✍️Привет, снова с вами Катя, Flutter Dev Friflex

Недавно вышел новый релиз Flutter 3.29, который включает в себя множество улучшений, обновлений и новых возможностей. Предлагаю еще раз по ним пройтись.

Основные изменения в Flutter 3.29

1️⃣ Обновлены и добавлены новые разделы в документации:
🔴Архитектурный обзор
Обновленная страница предоставляет более детальное представление о внутренней архитектуре Flutter, что поможет разработчикам лучше понять, как работает фреймворк.
🔴Flutter для разработчиков Jetpack Compose: Для тех, кто приходит из мира Android-разработки и знаком с Jetpack Compose, добавлен новый раздел, который поможет адаптироваться к Flutter.

2️⃣ Добавлен новый рецепт в Cookbook, посвященный тестированию ориентации виджетов. Это поможет разработчикам эффективно проверять, как их виджеты реагируют на изменения ориентации экрана, что особенно важно для мобильных приложений.

3️⃣CupertinoNavigationBar и CupertinoSliverNavigationBar
🔴Поддержка нижнего виджета: Теперь эти навигационные бары принимают нижний виджет, который обычно используется для поля поиска или сегментированного управления.
🔴Режим отображения: в CupertinoSliverNavigationBar можно настроить нижний виджет с помощью свойства bottomMode, позволяя выбрать между автоматическим изменением размера и постоянным отображением.

Здесь все подробности о новом Flutter.

Поддержка Dart 3.7
Вместе с обновлением Flutter выпущена новая версия Dart — Dart 3.7. Она включает в себя улучшения производительности и новые функции языка.

Осторожность при обновлении до Flutter 3.29
Как и в каждом новом релизе, Flutter 3.29 включает в себя ряд разрушающих изменений. Ознакомиться можно тут.

Хотя этот релиз принесет множество новых возможностей и улучшений, важно помнить, что не стоит спешить с обновлением, особенно если вы активно используете сторонние библиотеки из pub.dev. Многие библиотеки на pub.dev могли еще не обновиться под новую версию Flutter. Это может привести к несовместимости и ошибкам в вашем проекте.

❗️В заключение, хотя Flutter 3.29 предлагает много интересного, разумно подождать, пока экосистема не адаптируется к новым изменениям, прежде чем обновляться.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥1174👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Всем привет! С вами Анна, Friflex Flutter Team Lead.

В прошлом посте мы разобрались, что такое внутренние цифровые покупки в приложении и какие есть нюансы их проведения в разных сторах. Сегодня на практике посмотрим, как можно интегрировать процесс in-app оплат в Flutter-приложение.

Для интеграции in-app покупок в приложение на Android и iOS существует плагин in_app_purchase. Он разработан командой Flutter и имеет отличную репутацию (2,24 тыс лайков и более 123 тыс скачиваний). При правильной интеграции его можно смело использовать в продакшн приложениях.

Какой же функционал дает эта библиотека? Разберемся!

1️⃣ Проверка доступности покупок
Покупки на устройстве доступны только тогда, когда платежная платформа активна и не нарушено подкючение устройства к стору, через который будет осуществленна оплата. Метод вернет true или false в зависимости от результатов проверки.

final isAvailable = await InAppPurchase.instance.isAvailable();


2️⃣ Получение данных о конкретных продуктах
Вы можете запросить в магазине основные данные определенных продуктов по их идентификаторам. В случае, если продукт с таким id был найден, сервис вернет его основную информацию — заголовок, описание, цену, валюту. Если какие-то идентификаторы не были обнаружены, библиотека вернет их общим списком.

 final data =
await InAppPurchase.instance.queryProductDetails({'id1', 'id2', 'id3'});

final products = data.productDetails;
final notFoundIds = data.notFoundIDs;


3️⃣ Осуществление покупки
Продукты бывают двух типов — consumable (расходуемые продукты, например, жизни в игре) и non consumable (одноразовые покупки доступа, такие как подписки).
Для оплаты каждого из типов существуют отдельные методы, которые вызывают нативные окна стров для оплаты. Они требуют данных о продукте для покупки. Опционально можно передать некоторый идентификатор пользователя, чтобы покупку в будущем можно было восстановить на другом устройстве.

 await InAppPurchase.instance.buyNonConsumable(
purchaseParam: PurchaseParam(
productDetails: product,
applicationUserName: userId,
),
);

await InAppPurchase.instance.buyConsumable(
purchaseParam: PurchaseParam(
productDetails: product,
applicationUserName: userId,
),
);


4️⃣ Восстановление покупки
Нередко бывает, что пользователь делает покупку на одном устройстве, а через какое-то время меняет его на другое. В таких случаях необходимо давать возможность восстановить доступ к ранее оплаченным покупкам. Для этого библиотека дает доступ к методу восстановления.

await 
InAppPurchase.instance.restorePurchases(applicationUserName: userId);



5️⃣ Получение обновлений о покупках
С помощью потока событий purchaseStream плагин дает возможность отслеживать обновления о текущих покупках. По завершении метода осуществления или восстановления покупки, данные о ней попадают в этот стрим.

InAppPurchase.instance.purchaseStream.listen((purchaseDetails) {
// обработка данных о покупках в МП
});


С помощью этих 5 основных функций вы легко можете интегрировать процесс покупки в ваше приложение.

❗️Если вы планируете публиковать свое приложение не только в Google Play и AppStore, важно понимать, что для других сторов необходима другая имплементация и, соответственно, другие библиотеки. Например, для RuStore подойдет flutter_rustore_billing, а для AppGallery — huawei_iap.

Делитесь в комментариях своим опытом интеграции in-app покупок.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥148👍4👌2🐳1