Отслеживание изменений размера окна
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как отслеживать изменения размера окна в вашем приложении Flutter 🌟
Используем WidgetBindingObserver
Для того чтобы отслеживать изменения размера окна, мы будем использовать `WidgetBindingObserver`. Этот миксин позволяет нам получать уведомления о различных событиях, происходящих в приложении, включая изменения размера окна 📱
Пример кода
В этом примере мы создаем `StatefulWidget` под названием `MetricsReactor`, который использует `WidgetsBindingObserver` для отслеживания изменений размера окна. Когда размер окна изменяется, мы обновляем состояние виджета с новым размером 📈
Оцените нашу новую рубрику! 👍 Мы надеемся, что вам понравится эта рубрика и вы найдете ее полезной. Оцените нас и подпишитесь на наш канал, чтобы быть в курсе всех последних советов и новостей из мира Flutter 📲
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding
Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как отслеживать изменения размера окна в вашем приложении Flutter 🌟
Используем WidgetBindingObserver
Для того чтобы отслеживать изменения размера окна, мы будем использовать `WidgetBindingObserver`. Этот миксин позволяет нам получать уведомления о различных событиях, происходящих в приложении, включая изменения размера окна 📱
Пример кода
class MetricsReactor extends StatefulWidget {
const MetricsReactor({Key? key}) : super(key: key);
@override
_MetricsReactorState createState() => _MetricsReactorState();
}
class _MetricsReactorState extends State<MetricsReactor> with WidgetsBindingObserver {
late Size _lastSize;
WidgetsBinding get widgetBinding => WidgetsBinding.instance!;
@override
void initState() {
super.initState();
_lastSize = WidgetsBinding.instance!.window.physicalSize;
widgetBinding.addObserver(this);
}
@override
void dispose() {
widgetBinding.removeObserver(this);
super.dispose();
}
@override
void didChangeMetrics() {
setState(() {
_lastSize = widgetBinding.window.physicalSize;
});
}
@override
Widget build(BuildContext context) {
return Text('Текущий размер: $_lastSize');
}
}
В этом примере мы создаем `StatefulWidget` под названием `MetricsReactor`, который использует `WidgetsBindingObserver` для отслеживания изменений размера окна. Когда размер окна изменяется, мы обновляем состояние виджета с новым размером 📈
Оцените нашу новую рубрику! 👍 Мы надеемся, что вам понравится эта рубрика и вы найдете ее полезной. Оцените нас и подпишитесь на наш канал, чтобы быть в курсе всех последних советов и новостей из мира Flutter 📲
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding
👍2
Создаем защиту маршрута страницы
Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀
Что это такое?
Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄
Пример реализации
Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔
Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀
Что это такое?
Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄
Пример реализации
Route<dynamic> route(RouteSettings settings) {
switch (settings.name) {
case 'init_account':
return MaterialPageRoute(
builder: (_) => AuthenticatedGuard(child: InitAccountPage()),
);
}
}
// AuthenticatedGuard внедряет нашу защиту, чтобы предотвратить доступ неавторизованного пользователя к нашей странице
class Guard extends StatelessWidget {
final Future<bool> canActivate;
final Widget child;
final String fallbackRoute;
const Guard({
Key? key,
required this.canActivate,
required this.child,
required this.fallbackRoute,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: canActivate,
builder: (_, isOk) {
if (!isOk.hasData || isOk.hasError) {
return Container();
}
if (isOk.data!) {
return child; // Показываем страницу, если условие выполнено
}
redirect(context); // Иначе перенаправляем
return Container();
},
);
}
redirect(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
Navigator.pushReplacementNamed(context, fallbackRoute);
});
}
}
Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔
Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
Создаем защиту маршрута страницы
Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀
Что это такое?
Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄
Пример реализации
Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔
Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter - создание защиты маршрута страницы. 🚀
Что это такое?
Защита маршрута страницы позволяет перенаправлять пользователя на другую страницу, если определенное условие не выполнено. 🔄
Пример реализации
Route<dynamic> route(RouteSettings settings) {
switch (settings.name) {
case 'init_account':
return MaterialPageRoute(
builder: (_) => AuthenticatedGuard(child: InitAccountPage()),
);
}
}
// AuthenticatedGuard внедряет нашу защиту, чтобы предотвратить доступ неавторизованного пользователя к нашей странице
class Guard extends StatelessWidget {
final Future<bool> canActivate;
final Widget child;
final String fallbackRoute;
const Guard({
Key? key,
required this.canActivate,
required this.child,
required this.fallbackRoute,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return FutureBuilder<bool>(
future: canActivate,
builder: (_, isOk) {
if (!isOk.hasData || isOk.hasError) {
return Container();
}
if (isOk.data!) {
return child; // Показываем страницу, если условие выполнено
}
redirect(context); // Иначе перенаправляем
return Container();
},
);
}
redirect(BuildContext context) {
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
Navigator.pushReplacementNamed(context, fallbackRoute);
});
}
}
Совет для нескольких условий: вы можете каскадировать защиты или просто объединить ваши условия. 🤔
Оцените нашу новую рубрику и напишите в комментариях, что вы думаете! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips 👍
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #FlutterTips #Programming #Development #Coding #FlutterCommunity
👍1
Шпаргалка по Dart map
Maps are fast - Карты работают быстро
Карта - это коллекция пар ключ/значение. Значение извлекается из карты с помощью связанного с ним ключа.
В Dart существует 3 типа карт:
- HashMap - неупорядоченная
- LinkedHashMap - упорядоченная по порядку вставки
- SplayTreeMap - упорядоченная по ключам
Преобразование списка в карту
Зачем использовать карту?
Доступ к элементу в списке с использованием
Доступ к элементу или проверка его наличия в карте занимает O(1).
Карты выигрывают в этом
Как создать неизменяемую карту?
https://pub.dev/packages/built_collection - Этот пакет предоставляет способы создания неизменяемых карт (разработан командой Dart).
Функции карты
Оцените новую рубрику! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #DartTips #MobileDevelopment #ProgrammingTips #Coding #FlutterCommunity
Maps are fast - Карты работают быстро
Карта - это коллекция пар ключ/значение. Значение извлекается из карты с помощью связанного с ним ключа.
В Dart существует 3 типа карт:
- HashMap - неупорядоченная
- LinkedHashMap - упорядоченная по порядку вставки
- SplayTreeMap - упорядоченная по ключам
// Простая карта со строковым ключом: строковым значением
var data = {'name': 'John Doe', 'occupation': 'gardener'};
// карта, типизированная с помощью конструктора Map<String, String>()
var data2 = <int, String>{1: 'sky', 2: 'falcon', 3: 'rock'};
Преобразование списка в карту
// преобразование списка в карту
var resultMap = Map.fromIterable(list, key: (v) => v[0], value: (v) => v[1]);
// или
var result = { for (var v in list) v[0]: v[1] };
// или просто используя метод asMap() для автоматического индексирования
var result = ["test","test2","test3"].asMap(); // {0: test, 1: test2, 2: test3}
Зачем использовать карту?
Доступ к элементу в списке с использованием
indexOf или contains имеет сложность O(n).Доступ к элементу или проверка его наличия в карте занимает O(1).
Карты выигрывают в этом
Как создать неизменяемую карту?
https://pub.dev/packages/built_collection - Этот пакет предоставляет способы создания неизменяемых карт (разработан командой Dart).
Функции карты
var details = {'Usrname': 'bruce', 'Password': 'mypas'};
// добавление
details['Uid'] = '3802983209A';
// обновление
details.putIfAbsent("Uid", () => "3802983209A");
// преобразование в другую карту
details.map((key, value) => MapEntry(key, "$key:$value"));
// приведение к другому типу
details.cast<int, int>();
// проверка наличия ключа
details.containsKey("key"); // сложность O(1)
// копирование
var copy = {...details};
// обновление
details.update("Usrname", (value) => "joker");
Оцените новую рубрику! 👍💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #DartTips #MobileDevelopment #ProgrammingTips #Coding #FlutterCommunity
👍3
Получение данных с использованием http-клиента
Как получить данные с удаленного сервера, используя http-клиент 🤔
Шаг 1: Установите пакет http 📦
* Возвращение обобщенного типа T, чтобы можно было напрямую возвращать другой тип. Рекомендуется использовать пакет json_serializable для легкого парсинга объектов 📄
* Предоставление пользовательских заголовков, таких как токен API 🔒
* Улучшение: отправка пользовательских ошибок в зависимости от кода состояния ⚠️
Оцените новую рубрику и напишите свое мнение в комментариях! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #ProgrammingTips #Coding #SoftwareDevelopment
Как получить данные с удаленного сервера, используя http-клиент 🤔
Шаг 1: Установите пакет http 📦
Future<T> request<T>({
required String endpoint,
Map<String, String>? headers,
Map<String, String>? queryParams,
}) async {
final url = Uri(
scheme: config.baseUrlScheme, // http или https
host: config.baseUrlHost, // localhost или mydomain.com
path: endpoint, // /api/articles
queryParameters: queryParams,
port: config.baseUrlPort, // порт вашего бэкенда
);
final response = await http.get(
url,
headers: {
...?headers, // Предоставление пользовательских заголовков, например, токена API
},
);
if (response.statusCode != 200) {
throw Exception('Запрос к API завершился неудачей: ${response.statusCode} ${response.reasonPhrase}');
}
return json.decode(response.body) as T; // Возвращение обобщенного типа T
}
* Возвращение обобщенного типа T, чтобы можно было напрямую возвращать другой тип. Рекомендуется использовать пакет json_serializable для легкого парсинга объектов 📄
* Предоставление пользовательских заголовков, таких как токен API 🔒
* Улучшение: отправка пользовательских ошибок в зависимости от кода состояния ⚠️
Оцените новую рубрику и напишите свое мнение в комментариях! 💬
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #ProgrammingTips #Coding #SoftwareDevelopment
👍1👎1
Шпаргалка по форматированию цен
Вы можете легко форматировать цены, используя пакет intl. Вот наиболее распространенные методы:
Оцените нашу новую рубрику по Flutter советам! 👍 Оставьте свои комментарии и реакции, если вам понравился этот пост! 💬👍
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #ProgrammingTips #Coding #FlutterTips
Вы можете легко форматировать цены, используя пакет intl. Вот наиболее распространенные методы:
import 'package:intl/intl.dart';
// Форматирование с указанием локали и символа валюты
NumberFormat.currency(locale: 'en_US', symbol: '\$').format(12.2);
// $12.2
// Форматирование валюты с использованием текущей локали устройства
NumberFormat.currency().format(12.2);
// US 12.2 или EUR 12.2 в зависимости от локали устройства
// Форматирование валюты без десятичных знаков
NumberFormat.currency(decimalDigits: 0).format(12.2);
// US 12
// Простое форматирование валюты
NumberFormat.simpleCurrency().format(12.2);
// $12.2
// Компактное форматирование больших чисел
NumberFormat.compactSimpleCurrency().format(1200000);
// $1.2M
Оцените нашу новую рубрику по Flutter советам! 👍 Оставьте свои комментарии и реакции, если вам понравился этот пост! 💬👍
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #AppDevelopment #ProgrammingTips #Coding #FlutterTips
👍4
Сегодня это последняя новость вашей любимой рубрики 😢… Но не грустите! Уже в понедельник мы выкатим рубрику ещё круче — держитесь! 💥 Наш канал растёт вместе с вами, так что готовьтесь к новому уровню!
Fail fast - debug fast
Иногда наш API падает, но мы этого не видим напрямую. В результате мы переходим от файла к файлу или читаем логи. Вместо этого мы можем заставить отладчик остановиться сразу же, даже если мы обработали эту ошибку.
Эта директива "vm:notify-debugger-on-exception" остановит выполнение в этом методе всякий раз, когда возникает ошибка в режиме отладки. В продакшене ничего не произойдет.
Оцените лайком последнюю новость в этой рубрике! 👍💬
#FlutterPulseTips нам тебя будет не хватать....
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #debug #tips #coding #mobiledev #programming #productivity
Fail fast - debug fast
Иногда наш API падает, но мы этого не видим напрямую. В результате мы переходим от файла к файлу или читаем логи. Вместо этого мы можем заставить отладчик остановиться сразу же, даже если мы обработали эту ошибку.
@pragma('vm:notify-debugger-on-exception')
void getUser() {
final response = await http.get(Uri.parse('...'));
if (response.statusCode == 200) {
return ...;
}
throw Exception('Не удалось загрузить пост2'); // Failed to load post2
}
Эта директива "vm:notify-debugger-on-exception" остановит выполнение в этом методе всякий раз, когда возникает ошибка в режиме отладки. В продакшене ничего не произойдет.
Оцените лайком последнюю новость в этой рубрике! 👍💬
#FlutterPulseTips нам тебя будет не хватать....
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #debug #tips #coding #mobiledev #programming #productivity
👍4😱2🔥1👏1
Избегаем Future.delayed в Flutter: лучшие альтернативы для управления временем в интерфейсе
🚀 Хотите улучшить свои навыки разработки на Flutter и создавать более стабильные приложения? 🤔 Тогда вам стоит узнать о лучших альтернативах использованию Future.delayed для управления временем в интерфейсе!
В этой статье рассматриваются проблемы, связанные с использованием Future.delayed, и предлагаются четыре альтернативных подхода для управления временем в интерфейсе Flutter-приложений. Вы узнаете, как использовать KeyboardVisibilityController, MediaQuery, AnimationController и вложенные вызовы WidgetsBinding.instance.addPostFrameCallback, чтобы сделать свои приложения более надежными и адаптивными к различным устройствам и взаимодействиям с пользователем. 📱💻
Эти подходы позволяют реагировать на фактические события интерфейса, а не на произвольные задержки, что делает код более тестируемым и поддерживаемым. Узнайте, как улучшить свои приложения, перейдя по ссылкам ниже! 🔍
🇷🇺 Читать на русском
🇬🇧 Читать на английском
🌐 Оригинал статьи
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените новую рубрику! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #programming #coding #softwaredevelopment
🚀 Хотите улучшить свои навыки разработки на Flutter и создавать более стабильные приложения? 🤔 Тогда вам стоит узнать о лучших альтернативах использованию Future.delayed для управления временем в интерфейсе!
В этой статье рассматриваются проблемы, связанные с использованием Future.delayed, и предлагаются четыре альтернативных подхода для управления временем в интерфейсе Flutter-приложений. Вы узнаете, как использовать KeyboardVisibilityController, MediaQuery, AnimationController и вложенные вызовы WidgetsBinding.instance.addPostFrameCallback, чтобы сделать свои приложения более надежными и адаптивными к различным устройствам и взаимодействиям с пользователем. 📱💻
Эти подходы позволяют реагировать на фактические события интерфейса, а не на произвольные задержки, что делает код более тестируемым и поддерживаемым. Узнайте, как улучшить свои приложения, перейдя по ссылкам ниже! 🔍
🇷🇺 Читать на русском
🇬🇧 Читать на английском
🌐 Оригинал статьи
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените новую рубрику! 👍
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #programming #coding #softwaredevelopment
👍2
Как проверить реальное подключение к интернету в Flutter?
Вы когда-нибудь сталкивались с ситуацией, когда приложение зависает на экране загрузки, хотя Wi-Fi подключен? 🤔
В этой статье рассматривается проблема проверки подключения к интернету в Flutter-приложениях и предлагается решение с использованием BLoC. Автор делится своим опытом, когда обнаружилось, что стандартный пакет
Основная часть статьи посвящена реализации интеллектуального мониторинга статуса интернета с помощью BLoC. Автор поэтапно объясняет, как:
- добавить необходимые пакеты (`
- создать события (`
- реализовать логику BLoC (`
- настроить `
В результате приложение получает возможность отображать реальный статус интернета, меняя цвет AppBar в зависимости от того, работает ли интернет, есть ли подключение, но нет скорости, или отсутствует подключение вовсе.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Поделитесь, насколько вам понравилась эта рубрика! 😊
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #bloc #internetconnection #flutterdev #programming #coding #softwaredevelopment
Вы когда-нибудь сталкивались с ситуацией, когда приложение зависает на экране загрузки, хотя Wi-Fi подключен? 🤔
В этой статье рассматривается проблема проверки подключения к интернету в Flutter-приложениях и предлагается решение с использованием BLoC. Автор делится своим опытом, когда обнаружилось, что стандартный пакет
connectivity_plus не дает полной картины — он показывает только тип подключения (Wi-Fi, мобильная сеть или отсутствие связи), но не проверяет, работает ли интернет на самом деле.Основная часть статьи посвящена реализации интеллектуального мониторинга статуса интернета с помощью BLoC. Автор поэтапно объясняет, как:
- добавить необходимые пакеты (`
flutter_bloc, equatable, connectivity_plus, http`) в проект;- создать события (`
InternetConnectedEvent, InternetDisconnectedEvent, InternetNoSpeedEvent) и состояния (InternetLoading, InternetConnected, InternetDisconnected, InternetNoSpeed`) для BLoC;- реализовать логику BLoC (`
internet_bloc.dart`), которая проверяет подключение к интернету каждые несколько секунд, отправляя HTTP-запрос на Google;- настроить `
main.dart и home_screen.dart`, чтобы UI реагировал на изменения статуса интернета.В результате приложение получает возможность отображать реальный статус интернета, меняя цвет AppBar в зависимости от того, работает ли интернет, есть ли подключение, но нет скорости, или отсутствует подключение вовсе.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Поделитесь, насколько вам понравилась эта рубрика! 😊
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #bloc #internetconnection #flutterdev #programming #coding #softwaredevelopment
👍3
Глубокое погружение в макеты Flutter: Row, Column, Stack и Expanded
Flutter - мощный инструмент для создания красивых и гибких интерфейсов, и сегодня мы поговорим о четырёх китах, на которых держится большинство макетов: Row, Column, Stack и Expanded! 🤯
В этой статье вы узнаете, как работают эти базовые виджеты, когда их использовать и как комбинировать их для создания сложных и красивых интерфейсов. Вы научитесь использовать свойства
Вы узнаете о различных сценариях использования этих виджетов, таких как создание горизонтальных меню, форм, списков и даже наложений виджетов друг на друга. Кроме того, вы научитесь комбинировать эти виджеты для создания сложных и адаптивных макетов. 🤔
🇷🇺Читать на русском
🇬🇧Read in English
🌐Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 👍
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #programming #coding
Flutter - мощный инструмент для создания красивых и гибких интерфейсов, и сегодня мы поговорим о четырёх китах, на которых держится большинство макетов: Row, Column, Stack и Expanded! 🤯
В этой статье вы узнаете, как работают эти базовые виджеты, когда их использовать и как комбинировать их для создания сложных и красивых интерфейсов. Вы научитесь использовать свойства
mainAxisAlignment и crossAxisAlignment, чтобы выравнивать виджеты, и узнаете, как применять Expanded, чтобы занять доступное пространство. 📐Вы узнаете о различных сценариях использования этих виджетов, таких как создание горизонтальных меню, форм, списков и даже наложений виджетов друг на друга. Кроме того, вы научитесь комбинировать эти виджеты для создания сложных и адаптивных макетов. 🤔
🇷🇺Читать на русском
🇬🇧Read in English
🌐Original article
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам новая рубрика! 👍
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appdevelopment #ui #ux #programming #coding
👍1👎1
Flutter и WebView: как не дать хакерам выполнить произвольный код Dart из JavaScript
Многие Flutter-приложения используют WebView для интеграции с внешними страницами, платёжными шлюзами или центрами помощи внутри приложения. Но если вы используете WebView с включённым JavaScript и предоставляете доступ к JS-to-Dart мосту, вы открываете дверь к одной из самых опасных уязвимостей мобильных приложений: внедрению JavaScript Bridge.
В этой статье мы разберём, как работает эта уязвимость, как злоумышленники её эксплуатируют и как избежать превращения вашего Flutter-приложения в движок для удалённого выполнения кода. Вы узнаете о реальных сценариях атак, таких как внедрение вредоносного JavaScript через внешние сайты, загрузка локального HTML с внешним JavaScript и экспозиция native-интерфейса в Android WebView.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам эта рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #webview #javascript #security #mobiledevelopment #appsecurity #coding #programming #devlife
Многие Flutter-приложения используют WebView для интеграции с внешними страницами, платёжными шлюзами или центрами помощи внутри приложения. Но если вы используете WebView с включённым JavaScript и предоставляете доступ к JS-to-Dart мосту, вы открываете дверь к одной из самых опасных уязвимостей мобильных приложений: внедрению JavaScript Bridge.
В этой статье мы разберём, как работает эта уязвимость, как злоумышленники её эксплуатируют и как избежать превращения вашего Flutter-приложения в движок для удалённого выполнения кода. Вы узнаете о реальных сценариях атак, таких как внедрение вредоносного JavaScript через внешние сайты, загрузка локального HTML с внешним JavaScript и экспозиция native-интерфейса в Android WebView.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам эта рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #webview #javascript #security #mobiledevelopment #appsecurity #coding #programming #devlife
👍2
Динамическое выполнение кода в Flutter: как защитить своё приложение от атак
Flutter-приложения считаются "безопасными" благодаря Ahead-Of-Time компиляции, но на самом деле они уязвимы для динамического выполнения кода. Атакующие могут внедрять и запускать произвольный Dart-код, используя инструменты вроде Frida.
В этой статье рассматриваются приёмы, которые используют атакующие для динамического выполнения кода в Flutter, и способы защиты от таких атак. Вы узнаете, как можно перехватить нативные методы, внедрить код в память и запустить произвольную логику в приложении. Кроме того, в статье представлены реальные сценарии атак и способы их предотвращения, включая сборку в режиме релиза, обфускацию кода, защиту нативных плагинов и обнаружение внедрения кода в память.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #security #mobiledevelopment #appsecurity #coding #programming #devsecops
Flutter-приложения считаются "безопасными" благодаря Ahead-Of-Time компиляции, но на самом деле они уязвимы для динамического выполнения кода. Атакующие могут внедрять и запускать произвольный Dart-код, используя инструменты вроде Frida.
В этой статье рассматриваются приёмы, которые используют атакующие для динамического выполнения кода в Flutter, и способы защиты от таких атак. Вы узнаете, как можно перехватить нативные методы, внедрить код в память и запустить произвольную логику в приложении. Кроме того, в статье представлены реальные сценарии атак и способы их предотвращения, включая сборку в режиме релиза, обфускацию кода, защиту нативных плагинов и обнаружение внедрения кода в память.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, понравилась ли вам рубрика!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #security #mobiledevelopment #appsecurity #coding #programming #devsecops
🔍 Обратная разработка libapp.so: как защитить свой Flutter-приложение от взлома
Вы когда-нибудь задумывались, насколько безопасно ваше Flutter-приложение от обратной разработки и взлома? 🤔
В этой статье рассматривается процесс обратной разработки libapp.so — скомпилированного кода Flutter-приложений, и описываются приёмы, которые используют злоумышленники для извлечения скрытых секретов и изменения логики приложения. Вы узнаете о реальных сценариях эксплуатации уязвимостей, таких как декомпиляция libapp.so с помощью Ghidra, изменение логики приложения и извлечение встроенных ключей и секретов шифрования. Кроме того, в статье представлены практические советы по защите вашего приложения, включая обфускацию кода Dart, шифрование секретов, перемещение критической логики на сервер и использование проверок целостности и анти-отладочной логики.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Оцените рубрику и напишите, какие темы вам интересны! 👀
FlutterPulse — канал о мире Flutter!
#FlutterPulseMedium ✨
#flutter #dart #security #reverseengineering #libapp_so #mobiledevelopment #appsecurity #flutterdev #programming #coding #devsecops
Вы когда-нибудь задумывались, насколько безопасно ваше Flutter-приложение от обратной разработки и взлома? 🤔
В этой статье рассматривается процесс обратной разработки libapp.so — скомпилированного кода Flutter-приложений, и описываются приёмы, которые используют злоумышленники для извлечения скрытых секретов и изменения логики приложения. Вы узнаете о реальных сценариях эксплуатации уязвимостей, таких как декомпиляция libapp.so с помощью Ghidra, изменение логики приложения и извлечение встроенных ключей и секретов шифрования. Кроме того, в статье представлены практические советы по защите вашего приложения, включая обфускацию кода Dart, шифрование секретов, перемещение критической логики на сервер и использование проверок целостности и анти-отладочной логики.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Оцените рубрику и напишите, какие темы вам интересны! 👀
FlutterPulse — канал о мире Flutter!
#FlutterPulseMedium ✨
#flutter #dart #security #reverseengineering #libapp_so #mobiledevelopment #appsecurity #flutterdev #programming #coding #devsecops
❤1
Flutter-архитектура, которая спасла команду от 6 месяцев переработок
Представьте, что добавление новой функции в ваше приложение вместо пары недель превращается в шестинедельный кошмар. Команда TechCorp столкнулась именно с этой проблемой, пока не изменила подход к архитектуре своего Flutter-приложения.
В статье разработчики делятся своим опытом о том, как они перешли от хаотичного кода к четкой MVVM-архитектуре с Repository и Service слоями. Они описывают, как разделили бизнес-логику, работу с API и UI, и какие результаты получили после рефакторинга. Вы узнаете, как улучшить поддерживаемость кода, сократить время разработки новых фич и уменьшить количество багов.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените рубрику!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledev #appdev #softwarearchitecture #mvvm #flutterarchitecture #tech #programming #development #coding #softwareengineering
Представьте, что добавление новой функции в ваше приложение вместо пары недель превращается в шестинедельный кошмар. Команда TechCorp столкнулась именно с этой проблемой, пока не изменила подход к архитектуре своего Flutter-приложения.
В статье разработчики делятся своим опытом о том, как они перешли от хаотичного кода к четкой MVVM-архитектуре с Repository и Service слоями. Они описывают, как разделили бизнес-логику, работу с API и UI, и какие результаты получили после рефакторинга. Вы узнаете, как улучшить поддерживаемость кода, сократить время разработки новых фич и уменьшить количество багов.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Оцените рубрику!
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledev #appdev #softwarearchitecture #mvvm #flutterarchitecture #tech #programming #development #coding #softwareengineering
😁2👍1💩1
7 Скрытых виджетов Flutter, которые сэкономят тебе часы разработки!
Ты когда-нибудь задумывался, как опытные разработчики создают такие сложные и красивые интерфейсы во Flutter всего за несколько строк кода? 🤔
В этой статье ты узнаешь о 7 скрытых виджетах Flutter, которые могут значительно упростить твою работу. Ты познакомишься с такими приёмами, как добавление pinch-zoom и drag-and-drop к любому виджету с помощью
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напиши, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #productivity #ui #ux #widgets #programming #coding #softwaredevelopment
Ты когда-нибудь задумывался, как опытные разработчики создают такие сложные и красивые интерфейсы во Flutter всего за несколько строк кода? 🤔
В этой статье ты узнаешь о 7 скрытых виджетах Flutter, которые могут значительно упростить твою работу. Ты познакомишься с такими приёмами, как добавление pinch-zoom и drag-and-drop к любому виджету с помощью
InteractiveViewer, создание анимированных списков с SliverAnimatedList, и реализация эффекта размытия с BackdropFilter. Кроме того, ты узнаешь, как использовать CustomScrollView и SliverFillRemaining, чтобы создать гибкие макеты, и как добавить нативный стиль выбора текста с RawMagnifier. Также в статье описаны AnimatedPositionedDirectional для RTL-дружественных анимаций и ShaderMask для добавления градиентных эффектов к любым виджетам.🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напиши, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #productivity #ui #ux #widgets #programming #coding #softwaredevelopment
🔥2🤝1
✨ Ускорьте свой код Flutter с awesome_extensions!
Flutter и Dart - отличная пара, а с пакетом awesome_extensions разработка станет ещё проще и быстрее! 🚀
В этой статье вы узнаете о пакете awesome_extensions, который предоставляет набор удобных расширений для часто используемых классов Flutter и Dart. С его помощью вы сможете писать более короткий и чистый код, улучшать читаемость и производительность, а также избегать шаблонного кода при создании пользовательского интерфейса.
Вы научитесь устанавливать пакет, импортировать его в свой проект и использовать готовые расширения для упрощения разработки. В статье приведены примеры использования awesome_extensions для стилизации текста, добавления отступов и выравнивания, а также для создания быстрых спейсеров.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #awesomeextensions #productivity #coding #mobiledevelopment
Flutter и Dart - отличная пара, а с пакетом awesome_extensions разработка станет ещё проще и быстрее! 🚀
В этой статье вы узнаете о пакете awesome_extensions, который предоставляет набор удобных расширений для часто используемых классов Flutter и Dart. С его помощью вы сможете писать более короткий и чистый код, улучшать читаемость и производительность, а также избегать шаблонного кода при создании пользовательского интерфейса.
Вы научитесь устанавливать пакет, импортировать его в свой проект и использовать готовые расширения для упрощения разработки. В статье приведены примеры использования awesome_extensions для стилизации текста, добавления отступов и выравнивания, а также для создания быстрых спейсеров.
🇷🇺 Читать статью на русском
🇬🇧 Read the article in English
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨ Напишите, чтобы подписчики оценили рубрику.
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #awesomeextensions #productivity #coding #mobiledevelopment
🔥1
Защитите API-ключи вашего Flutter-приложения раз и навсегда!
Вы когда-нибудь задумывались, насколько безопасны ваши API-ключи в Flutter-приложении? Давайте разберемся, как защитить их от злоумышленников и сделать ваше приложение более безопасным.
В этой статье мы рассмотрим три основных слоя безопасности для защиты API-ключей: использование переменных окружения, обфускацию и безопасное хранение секретов во время выполнения. Вы узнаете, как правильно настроить конфигурацию для разных окружений, как использовать пакеты `
✅ Использование переменных окружения для хранения секретов
🔹 Настройка конфигурации для разных окружений (dev, staging, prod)
⚙️ Обфускация секретов с помощью пакета
👉 Безопасное хранение секретов во время выполнения с помощью
📌 Интеграция безопасности в CI/CD-процесс
🇷🇺 Читать статью на русском:
Часть 1
Часть 2
🇬🇧 Read the article in English:
Part 1 → https://telegra.ph/Stop-Committing-Your-API-Keys-Heres-How-to-Actually-Secure-Them-in-Flutter-Part-1-02-05
Part 2 → https://telegra.ph/Stop-Committing-Your-API-Keys-Heres-How-to-Actually-Secure-Them-in-Flutter-Part-2-02-05
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appsecurity #security #programming #softwaredevelopment #coding #technews
Вы когда-нибудь задумывались, насколько безопасны ваши API-ключи в Flutter-приложении? Давайте разберемся, как защитить их от злоумышленников и сделать ваше приложение более безопасным.
В этой статье мы рассмотрим три основных слоя безопасности для защиты API-ключей: использование переменных окружения, обфускацию и безопасное хранение секретов во время выполнения. Вы узнаете, как правильно настроить конфигурацию для разных окружений, как использовать пакеты `
envied и flutter_secure_storage`, а также как интегрировать безопасность в ваш CI/CD-процесс.✅ Использование переменных окружения для хранения секретов
🔹 Настройка конфигурации для разных окружений (dev, staging, prod)
⚙️ Обфускация секретов с помощью пакета
envied👉 Безопасное хранение секретов во время выполнения с помощью
flutter_secure_storage📌 Интеграция безопасности в CI/CD-процесс
🇷🇺 Читать статью на русском:
Часть 1
Часть 2
🇬🇧 Read the article in English:
Part 1 → https://telegra.ph/Stop-Committing-Your-API-Keys-Heres-How-to-Actually-Secure-Them-in-Flutter-Part-1-02-05
Part 2 → https://telegra.ph/Stop-Committing-Your-API-Keys-Heres-How-to-Actually-Secure-Them-in-Flutter-Part-2-02-05
🌐 Читать оригинал
Все подобные новости ищите по хэштегу #FlutterPulseMedium ✨
FlutterPulse — канал о мире Flutter!
#flutter #dart #flutterpulse #FlutterPulseMedium #mobiledevelopment #appsecurity #security #programming #softwaredevelopment #coding #technews