Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Сегодня мы рассмотрим 3 способа хранения ключей и различных переменных, которые зависят от окружения.
1. Использовать библиотеку flutter_dotenv. Для этого требуется создать файл
И добавить его в
Этот способ рабочий, но не очень безопасный, так как добавляет файл в сборку. Плюс нам нужно будет делать дополнительные изменения в проекте.
2. Использовать функционал Dart define:
И потом получать в нужном месте через
Но данный способ не подойдет, если у вас много переменных.
3. Использовать Dart define from file. Для этого требуется создать файл с расширением
И потом запустить приложение с командой:
Делитесь в чате, как вы храните такие переменные?
1. Использовать библиотеку flutter_dotenv. Для этого требуется создать файл
.env
в корне проекта:
MY_VAR=”MY VALUE”
И добавить его в
assets
в pubspec.yaml
assets:
.env
Этот способ рабочий, но не очень безопасный, так как добавляет файл в сборку. Плюс нам нужно будет делать дополнительные изменения в проекте.
2. Использовать функционал Dart define:
flutter run --dart-define=MY_VAR=’MY VALUE’
И потом получать в нужном месте через
String.fromEnvironment(‘MY_VAR’);
bool.fromEnvironment(‘MY_SEC_VAR’);
Но данный способ не подойдет, если у вас много переменных.
3. Использовать Dart define from file. Для этого требуется создать файл с расширением
.json
в корне проекта:
{
“MY_VAR”: “MY VALUE”
}
И потом запустить приложение с командой:
flutter run --dart-define-from-file=my_env.json
Делитесь в чате, как вы храните такие переменные?
👍11❤3🥰2💩1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Мы уже говорили про многомодульность и переменные окружения, а сегодня посмотрим на случай, когда нужно сделать изменения по нативной части или заменить что-то в приложении полностью. Например, название и иконки.
В этом нам помогут Flavors - механизм создания нескольких разных сборок из одной кодовой базы. Изначально они появились в нативных приложениях.
Зачем нам нужны Flavors?
🟡 Для разделения приложения по разным окружениям. Например, можно сделать версии для разработки, тестирования и релиза.
🟡 Для White Label приложений, где сборки различаются темами, иконками, ресурсами и переменными окружения.
🟡 Если у вашего приложения есть 2 версии - бесплатная и платная.
Что можно поменять через Flavors?
Bundle ID приложения. Например, добавить к нему суффикс, чтобы вместо
Иконку и название приложения. Это полезно, чтобы разграничить версии для разных окружений.
Переменные окружения для нативных частей. Для замены некоторых частей приложения, где это необходимо.
Тему приложения и ресурсы (assets). Для изменения внешнего вида приложения.
Давайте посмотрим, как это делается во Flutter-части наших приложений. Для начала создадим дополнительную точку входа для нашего приложения -
Далее изменим
И теперь мы можем запустить наш код:
В следующих постах мы рассмотрим как нам сделать Flavors для Android и iOS.
В этом нам помогут Flavors - механизм создания нескольких разных сборок из одной кодовой базы. Изначально они появились в нативных приложениях.
Зачем нам нужны Flavors?
Что можно поменять через Flavors?
Bundle ID приложения. Например, добавить к нему суффикс, чтобы вместо
com.sample.example
стало com.sample.example.dev
, или полностью его изменить, сделать com.myapp.example
.Иконку и название приложения. Это полезно, чтобы разграничить версии для разных окружений.
Переменные окружения для нативных частей. Для замены некоторых частей приложения, где это необходимо.
Тему приложения и ресурсы (assets). Для изменения внешнего вида приложения.
Давайте посмотрим, как это делается во Flutter-части наших приложений. Для начала создадим дополнительную точку входа для нашего приложения -
main_dev.dart
. Это полная копия нашего main.dart
, но тут мы уже можем изменять тему и любые части, которые нужно.Далее изменим
pubspec.yaml
, чтобы он добавил ресурсы, которые различаются для различных Flavors:flutter:
assets:
- assets/common/ # Для общих ресурсов
- path: assets/main
flavors:
- main
- path: assets/dev
flavors:
- dev
И теперь мы можем запустить наш код:
flutter run --flavor dev --target lib/main_dev.dart
В следующих постах мы рассмотрим как нам сделать Flavors для Android и iOS.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤2🥰1
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Продолжаем разбираться с Flavors. Сегодня посмотрим, как это делается для Android.
Большую часть изменений мы будем делать в файле
Далее для замены иконки создадим папку
Получается, что одно и то же приложение при запуске через Flavor будет иметь разные иконку, название и
Делитесь в чате, использовали Flavors на Android?
Большую часть изменений мы будем делать в файле
android/app/build.gradle
, в блоке android. Давайте добавим Flavor:android {
…
flavorDimensions “default”
productFlavors {
dev {
dimension “default”
applicationIdSuffix “.dev”
resValue “string”, “app_name”, “My App Dev”
}
}
}
Далее для замены иконки создадим папку
app/src/dev
и скопируем туда папки res
из app/src/main
, которые содержат иконку, и заменим их.Получается, что одно и то же приложение при запуске через Flavor будет иметь разные иконку, название и
applicationId
.Делитесь в чате, использовали Flavors на Android?
❤12👍2🔥2
Hola, Amigos! С вами Михаил Чернецов, Flutter Dev в Amiga. Мы продолжаем рубрику о нашей команде и ее пути в мире разработки. Сегодня я расскажу немного о себе и своем опыте🔥
С Flutter я познакомился в 2021 году, когда начал писать свой дипломный проект. Сразу зацепило, насколько доступна и понятна была официальная документация. Она позволяла быстро войти в работу и буквально на практике изучать фреймворк, а большое количество обучающих материалов помогало углубиться в детали и разобраться с архитектурой приложений.
Со временем я понял, что одного Flutter иногда недостаточно. Это подтолкнуло меня изучать взаимодействие с нативными платформами, а также разбираться в backend-разработке — сейчас я постепенно осваиваю эти направления.
Из полезной литературы могу порекомендовать:
📚 «Грокаем алгоритмы» — чтобы прокачать алгоритмическое мышление.
📚 «Чистый код» — чтобы научиться писать понятный и поддерживаемый код.
Желаю всем вдохновения и успехов! 🚀
С Flutter я познакомился в 2021 году, когда начал писать свой дипломный проект. Сразу зацепило, насколько доступна и понятна была официальная документация. Она позволяла быстро войти в работу и буквально на практике изучать фреймворк, а большое количество обучающих материалов помогало углубиться в детали и разобраться с архитектурой приложений.
Со временем я понял, что одного Flutter иногда недостаточно. Это подтолкнуло меня изучать взаимодействие с нативными платформами, а также разбираться в backend-разработке — сейчас я постепенно осваиваю эти направления.
Из полезной литературы могу порекомендовать:
📚 «Грокаем алгоритмы» — чтобы прокачать алгоритмическое мышление.
📚 «Чистый код» — чтобы научиться писать понятный и поддерживаемый код.
Желаю всем вдохновения и успехов! 🚀
🔥10❤4👏3
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Продолжаем разбираться с Flavors. Сегодня посмотрим, как это делать в iOS.
Нам нужно сделать несколько шагов:
1) Создать копию Target у приложения.
2) Переименовать все схемы запуска через Runner -> Manage Schemes.
3) Дублировать конфигурации в проекте и переименовать их.
После этого мы сможем менять Bundle ID, логотип, название приложения и многое другое.
Смотрите в карточках, как это делается, и делитесь в чате, пробовали так на своих проектах?
Нам нужно сделать несколько шагов:
1) Создать копию Target у приложения.
2) Переименовать все схемы запуска через Runner -> Manage Schemes.
3) Дублировать конфигурации в проекте и переименовать их.
После этого мы сможем менять Bundle ID, логотип, название приложения и многое другое.
Смотрите в карточках, как это делается, и делитесь в чате, пробовали так на своих проектах?
👍13🔥3👏2
Hola, Amigos! На связи Михаил Чернецов, Flutter Dev в Amiga. Сегодня мы расскажем о возможности импортов во Flutter.
Классы для экспорта
Часто случается, когда при импорте нескольких файлов из одной папки увеличивается количество строк:
Вместо этого мы можем создать в этой же папке специальный файл для экспорта. Например,
Теперь подключение будет занимать всего одну строку:
Еще одна возможность, которая появляется — использовать любой класс из тех, что мы экспортировали, без необходимости импортировать их еще раз.
Ключевые слова
Наверное, вы уже видели такую запись:
Это префикс
Допустим, у нас в 2 пакетах есть класс
Также этот способ подходит, если в пакете присутствуют методы, и вы хотите знать, что они оттуда. Например, это используется при работе с пакетами
Есть еще 2 ключевых слова, которые позволяют изолировать видимость классов, методов, переменных, расширений и миксинов из импортов:
1.
2.
Пишите в чате, как вы организовываете импорты на своих проектах?
Классы для экспорта
Часто случается, когда при импорте нескольких файлов из одной папки увеличивается количество строк:
import “class_a.dart”;
import “class_b.dart”;
import “class_c.dart”;
import “class_d.dart”;
Вместо этого мы можем создать в этой же папке специальный файл для экспорта. Например,
my_imports.dart
. После чего внесем наши файлы с ключевым словом export
в начале:export “class_a.dart”;
export “class_b.dart”;
export “class_c.dart”;
export “class_d.dart”;
Теперь подключение будет занимать всего одну строку:
import “my_imports.dart”;
Еще одна возможность, которая появляется — использовать любой класс из тех, что мы экспортировали, без необходимости импортировать их еще раз.
Ключевые слова
as
, hide
и show
Наверное, вы уже видели такую запись:
import “dart:math” as math;
Это префикс
as
, который нужен, чтобы мы могли использовать зависимость вместе с другими, у которых имеются такие же классы.Допустим, у нас в 2 пакетах есть класс
MyClass
, и нам нужно использовать оба. В таком случае мы можем добавить ключевое слово as
к импортам и использовать их вместе:import 'my_package.dart' as package1;
import 'other_package.dart' as package2;
…
package1.MyClass();
package2.MyClass();
Также этот способ подходит, если в пакете присутствуют методы, и вы хотите знать, что они оттуда. Например, это используется при работе с пакетами
math
, http
и dio
.Есть еще 2 ключевых слова, которые позволяют изолировать видимость классов, методов, переменных, расширений и миксинов из импортов:
1.
hide
. Скрывает, что нам не понадобится. Например, если нам не нужен какой-то определенный класс или его имя дублируется.2.
show
. Отображает только то, что нам необходимо. Это позволяет нам использовать что-то определенное, без доступа к остальному.import “my_model.dart” hide ModelA;
import “my_sevice.dart” show MyService;
Пишите в чате, как вы организовываете импорты на своих проектах?
❤7👏6🔥4👍2
Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead в Amiga. Мы уже поговорили про импорты, но вы подсказали, что есть еще пару лайфхаков, связанных с ними.
Механизм Part Of
Все наши файлы на Dart это небольшие библиотеки, но иногда они становятся настолько большими, что их хочется поделить. В этом случае можно применить ключевые слова
Этот механизм часто используется библиотеками для генерации кода. Думаю, вы видели файлы
Давайте рассмотрим как работать с данным механизмом на примере BLoC. У нас есть файл
В
И уже в файлах-частях вместо импортов будет строчка:
Таким образом эти 3 файла будут распознаваться как один и тем самым импорты мы можем писать только в
Выбор импорта в зависимости от условий
Допустим, вы делаете приложение и на мобильные платформы, и на веб, но некоторые импорты нужно менять в зависимости от платформы. Это бывает при использовании
Для этого нужно будет подготовить 3 файла — один под МП, второй под веб, третий если ни один из них не подходит. И создать третий файл для экспорта:
Импортируя уже этот файл, мы точно получим нужный нам инстанс, который будет работать.
Делитесь в чате, пробовали ли вы использовать эти 2 механики на своих проектах? И пишите, что еще хотели бы узнать, а мы соберем информацию об этом❤️
Механизм Part Of
Все наши файлы на Dart это небольшие библиотеки, но иногда они становятся настолько большими, что их хочется поделить. В этом случае можно применить ключевые слова
part
и part of
.Этот механизм часто используется библиотеками для генерации кода. Думаю, вы видели файлы
my_class.g.dart
, если такими пользуетесь.Давайте рассмотрим как работать с данным механизмом на примере BLoC. У нас есть файл
my_bloc.dart
, который будет основным, и файлы my_event.dart
и my_state.dart
, которые будут его частями.В
my_bloc.dart
мы пропишем:part ‘my_event.dart’;
part ‘my_state.dart;
И уже в файлах-частях вместо импортов будет строчка:
part of ‘my_bloc.dart’;
Таким образом эти 3 файла будут распознаваться как один и тем самым импорты мы можем писать только в
my_bloc.dart
, и он же будет импортироваться в другие файлы.Part of
имеет смысл применять, только если это неотделимые друг от друга классы. Например, события и состояния для BLoC или обработка JSON для моделей, в остальных случаях лучше использовать export.Выбор импорта в зависимости от условий
Допустим, вы делаете приложение и на мобильные платформы, и на веб, но некоторые импорты нужно менять в зависимости от платформы. Это бывает при использовании
dart:io
и dart:web
Тут к нам на выход приходит использование if
.Для этого нужно будет подготовить 3 файла — один под МП, второй под веб, третий если ни один из них не подходит. И создать третий файл для экспорта:
export ‘my_none.dart’
if (dart.library.io) ‘my_mobile.dart’
if (dart.library.js_interop) ‘my_web.dart’;
Импортируя уже этот файл, мы точно получим нужный нам инстанс, который будет работать.
Делитесь в чате, пробовали ли вы использовать эти 2 механики на своих проектах? И пишите, что еще хотели бы узнать, а мы соберем информацию об этом❤️
👍11🔥4❤2
Дайджест ноября
Hola, Amigos! Собрали в одну подборку все полезные посты ноября, которые вы могли пропустить. Выбирайте, что вам интересно, и переходите по ссылкам.
⚪️ Chopper
⚪️ Retrofit
⚪️ Chopper или Retrofit
⚪️ 3 способа хранения ключей и различных переменных
⚪️ Flavors во Flutter. Android. iOS
⚪️ Команда Flutter. Михаил Чернецов
⚪️ Импорты во Flutter
⚪️ Лайфхаки в импортах во Flutter
Всем хорошего кода!🙂
Hola, Amigos! Собрали в одну подборку все полезные посты ноября, которые вы могли пропустить. Выбирайте, что вам интересно, и переходите по ссылкам.
Всем хорошего кода!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤4👏3👍1
Hola, Amigos! На связи Михаил Чернецов, Flutter Dev в Amiga. Сегодня поговорим об одном из плагинов из набора plus_plugins — connectivity_plus.
Connectivity Plus — простой плагин для проверки сети, позволяющий использовать асинхронную функцию для определения соединений. Например:
Однако лучшим способом будет прослушивание потока данных и сохранение в отдельный
Но при использовании и закрытии приложения и изменении статуса мы не всегда можем получить обновленный статус. Для этого создадим метод, который будет пересоздавать прослушку потока данных и вызывать его при изменении жизненного цикла приложения:
А как вы работаете с изменением состояния сети? Делитесь в чате.
Connectivity Plus — простой плагин для проверки сети, позволяющий использовать асинхронную функцию для определения соединений. Например:
final List<ConnectivityResult> connectivityResult = await Connectivity().checkConnectivity();
Однако лучшим способом будет прослушивание потока данных и сохранение в отдельный
Singleton
— тогда доступ к подключениям можно получить синхронно:Connectivity().onConnectivityChanged.listen(
(List<ConnectivityResult> result) {
MyConnectivitySingleton.instance.setValue(result);
}
);
Но при использовании и закрытии приложения и изменении статуса мы не всегда можем получить обновленный статус. Для этого создадим метод, который будет пересоздавать прослушку потока данных и вызывать его при изменении жизненного цикла приложения:
AppLifecycleListener(
onShow: () async {
await MyConnectivitySingleton.instance.refresh();
},
);
А как вы работаете с изменением состояния сети? Делитесь в чате.
👍11🔥5❤2
Hola, Amigos! Хотим поделиться с вами классной новостью. 6 декабря прошла церемония награждения премии Tagline Awards 2024 — главной награды за достижения в digital-сфере.
В премии участвует 500+ известных брендов и агентств, а награды вручаются за уровень работ, качество их исполнения и эффективность решения коммерческих задач🔥
Делимся победами! В этом году мы заняли:
🏆 2 место в номинации «Лучшее мобильное MVP-приложение» с кейсом разработки мобильного приложения для сети «Аптека Ваша №1»
🏆 3 место в номинации «Лучший маркетплейс» с кейсом создания первого маркетплейса горного оборудования в России
Спасибо команде за работу и заказчикам за доверие❤️ Такие достижения мотивируют расти и не останавливаться!
Читайте кейсы по ссылкам и пишите свое мнение в чате, мы будем рады вашему фидбеку)
В премии участвует 500+ известных брендов и агентств, а награды вручаются за уровень работ, качество их исполнения и эффективность решения коммерческих задач🔥
Делимся победами! В этом году мы заняли:
🏆 2 место в номинации «Лучшее мобильное MVP-приложение» с кейсом разработки мобильного приложения для сети «Аптека Ваша №1»
🏆 3 место в номинации «Лучший маркетплейс» с кейсом создания первого маркетплейса горного оборудования в России
Спасибо команде за работу и заказчикам за доверие❤️ Такие достижения мотивируют расти и не останавливаться!
Читайте кейсы по ссылкам и пишите свое мнение в чате, мы будем рады вашему фидбеку)
🔥8❤3👍3
Hola, Amigos! На связи мобильная команда агентства продуктовой разработки Amiga. Сегодня вышли Dart 3.6 и Flutter 3.27, но эти обновления совсем небольшие, поэтому делимся с вами в карточках самым важным:
- Обновленная работа с монорепозиториями;
- Отступы между виджетами в
- Разделители в больших числах
- Много-много других небольших новинок.
Делитесь в чате, успели уже попробовать данное обновление?
- Обновленная работа с монорепозиториями;
- Отступы между виджетами в
Row
и Column
;- Разделители в больших числах
Pub.dev
теперь показывает количество скачиваний пакетов;- Много-много других небольших новинок.
Делитесь в чате, успели уже попробовать данное обновление?
🔥21❤🔥7❤3