Flutter Pulse
478 subscribers
291 photos
607 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
🔥 Git: как большие команды пишут код вместе

Привет, коллеги! 👋 Работать в одиночку — одно дело. Но когда над проектом трудится целая команда, всё меняется! 💼 Как синхронизировать код, избежать хаоса и не мешать друг другу? Ответ — в новом полезном видео!

🚀 Что внутри?
👉 Системы контроля версий (спасибо, Git!) — ваш щит от хаоса.
👉 Базовые команды для повседневной работы: коммиты, ветвление, слияние.
👉 Рабочие процессы в больших командах: от пул-реквестов до CI/CD.
👉 Реальные кейсы: как избежать конфликтов и сохранить историю кода чистой.
👉 Фишки для профессионалов: ребейс, теги и секреты эффективного код-ревью.

💡 Почему это must-watch?
Видео — не сухая теория! Автор (технический руководитель платформы Sourcecraft) показывает всё на практике, объясняет сложное простыми словами и делится опытом Яндекса. Вы узнаете:
- Как работать с Git, даже если интернет «умер» 🚇
- Почему ветки должны жить недолго
- Зачем нужны осмысленные коммиты (и как они спасают в будущем!) 🔍

🎬 Смотрите и учитесь:
👉 Git: как большие команды пишут код вместе

💬 «Понимание Git — не про запоминание команд, а про ментальную карту работы системы» — главный посыл ролика.

🔔 Хотите больше полезного?
Подписывайтесь на канал и ищите другие видео по хэштегу #FlutterPulseYoutube! Новые лайфхаки — каждую неделю.

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Рисуем текст на холсте
Холст - это интерфейс для рисования непосредственно на экране 🤩

В этом совете мы рассмотрим, как использовать CustomPaint и TextPainter для рисования текста на холсте во Flutter. Это полезно для создания пользовательских виджетов и сложных визуализаций 🎨


import 'package:flutter/material.dart';
import 'dart:ui' as ui;

// Класс виджета, который рисует текст на холсте
class TextOnCanvas extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Текст на холсте')),
body: CustomPaint(
painter: TextPainterExample(),
child: Container(),
),
);
}
}

// Класс, который расширяет CustomPainter для рисования текста
class TextPainterExample extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
// Определяем стиль текста
final textStyle = TextStyle(
color: Colors.black,
fontSize: 40,
);

// Создаем TextSpan с текстом и стилем
final textSpan = TextSpan(
text: 'Привет, холст!',
style: textStyle,
);

// Создаем TextPainter для рисования текста
final textPainter = TextPainter(
text: textSpan,
textDirection: ui.TextDirection.ltr,
);

// Вычисляем размер текста
textPainter.layout();

// Определяем позицию, где будет нарисован текст
final offset = Offset(50, 100);

// Рисуем текст на холсте в указанной позиции
textPainter.paint(canvas, offset);
}

@override
bool shouldRepaint(CustomPainter oldDelegate) {
return false;
}
}


Оцените новую рубрику и напишите в комментариях, какие темы вам наиболее интересны! 💬👍
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips
🚀 Flutter-архитектура: как избежать хаоса в проектах? Смотрите лекцию от Яндекс Маркета!

Привет, коллеги! Только что наткнулся на 🔥горячее видео, которое перевернёт ваше представление о проектировании приложений. Лектор Саша из команды Яндекс Маркета на Школе мобильной разработки 2025 разложил по полочкам всё, о чем мы часто спорим в кулуарах.

Почему стоит посмотреть?
▫️ Архитектура ≠ холивар — автор честно предупреждает: нет "серебряной пули", но есть работающие принципы
▫️ SOLID, DRY, KISS — не просто буквы, а инструменты выживания в больших проектах
▫️ State-менеджмент на практике — сравнение 6 подходов (от setState до Riverpod) на живом ToDo-приложении
▫️ Ошибки, которые дорого стоят — например, почему циклические зависимости в DI могут "убить" ваше приложение

💡 Особенно зацепило:
"Архитектура — это про будущее. Если думать только о 'здесь и сейчас', бизнес вас быстро заменит". Автор показывает, как проектировать системы, которые:
Легко масштабируются
Позволяют быстро добавлять фичи
Упрощают онбординг новых разработчиков

📽 Полная версия лекции с живыми примерами кода, сравнением Bloc vs Provider и демкой работы с DI:
Flutter-архитектура — ШМР Flutter 2025

👉 P.S. Хотите больше практики? Ищите другие полезные ролики по хэштегу #FlutterPulseYoutube в нашем канале! Подписывайтесь, чтобы не пропустить разборы сложных кейсов.

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube

🔍 Детали видео: Лекция разделена на 2 части (теория + практика), упоминаются Clean Architecture, MVC/MVVM, Dependency Injection, Backend-Driven UI. Автор акцентирует: слепое следование SOLID так же вредно, как и полный хаос в коде.
Приостановка потока, когда нет подписчиков

Не теряйте события, когда некому их слушать 😉

В Flutter и Dart при работе с потоками (Stream) важно уметь правильно управлять подпиской и событиями. Один из полезных советов - приостанавливать поток, когда нет подписчиков, чтобы не терять важные события.

Пример реализации:



// Этот класс отвечает за рассылку уведомлений приложению
// Он также отвечает за прослушивание уведомлений
class AppEventsDispatcher {
final StreamController<AppEvent> _controller;
late final Stream<AppEvent?> _stream;

Stream<AppEvent?> get stream => _stream;

final List<AppEvent> _onNotificationEventsSubscriber;

AppEventsDispatcher()
: _onNotificationEventsSubscriber = [],
_controller = StreamController() {
_stream = _controller.stream.asBroadcastStream(
onCancel: (c) => c.pause(),
onListen: (el) {
if (el.isPaused) {
el.resume();
}
},
);
}

void dispose() {
_onNotificationEventsSubscriber.clear();
_controller.close();
}

void publish(AppEvent event) {
_controller.add(event);
}
}

final dispatcher = AppEventsDispatcher();
// Публикуем событие
dispatcher.publish(AppEvent('Новое уведомление'));
// Ждём немного
await Future.delayed(Duration(seconds: 1));
// Подписываемся на поток
final subscription = dispatcher.stream.listen((event) {
print('Получено событие: $event');
// так как мы приостановили поток, мы получим события
});



В этом примере мы создаём класс AppEventsDispatcher, который управляет потоком событий AppEvent. Когда нет подписчиков, поток приостанавливается, а при появлении нового подписчика - возобновляется с последнего события.

👍 Оцените нашу новую рубрику FlutterPulseTips и напишите в комментариях, что хотите видеть в следующих постах! 🤔

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #StreamManagement #AppDevelopment #CodingTips
🚀 Глубокое погружение в Router и диплинки Flutter 2025!

Привет, Flutter-энтузиасты! 👋 Только что наткнулся на 🔥суперполезное видео от Шакири Аваса (Flutter-разработчик из Яндекс Pro), которое перевернет ваше представление о навигации в приложениях. Если вы хотите освоить Router и диплинки — это must-watch!

📺 О чём видео?
👉 Router vs Navigator 1.0: Почему старый подход устарел и как Router решает его проблемы.
👉 Диплинки на практике: Настройка глубоких ссылок под Android, iOS и особенности Flutter Web 🌐.
👉 Nested Navigation: Как сохранять состояние вложенных экранов (например, в табах).
👉 Guard-логика: Защита роутов для авторизованных пользователей.
👉 Реальный кейс: Пошаговая реализация приложения с маршрутизацией «под ключ».

💡 Почему стоит посмотреть?
«Разбор такой детализированный, что даже новички поймут, а опытные найдут нюансы для своих проектов». Автор не просто объясняет теорию — он показывает код, тестирует решения и делится фишками, которых нет в документации!

🔗 Смотрите видео здесь:
Router и прямые ссылки в приложении — ШМР Flutter 2025

👇 Не пропустите!
Это ваш шанс прокачать скиллы в навигации — тема критически важная для сложных приложений. После просмотра вы сможете:
✔️ Настраивать диплинки за минуты,
✔️ Оптимизировать переходы между экранами,
✔️ Избежать типичных ошибок в Router.

👉 Подписывайтесь на Flutter Pulse, чтобы не пропустить новые полезные материалы! Исследуйте другие видео по хэштегу #FlutterPulseYoutube.

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Автоматическое перерисовывание холста с помощью ChangeNotifier

Привет, подписчики! 👋 Сегодня мы рассмотрим полезный совет по Flutter, который поможет вам оптимизировать процесс отрисовки пользовательского интерфейса. 📱💻

Вы когда-нибудь сталкивались с ситуацией, когда ваш CustomPainter не обновлялся автоматически при изменении данных? 🤔 Это может быть раздражающим, особенно когда вы работаете с динамическим содержимым. Но не волнуйтесь, у нас есть решение! 😊

Использование ChangeNotifier для автоматического обновления

Один из способов обеспечить автоматическое перерисовывание холста — использовать ChangeNotifier. Давайте разберемся, как это работает: 🔍



class WaveModel extends ChangeNotifier {
// ...
void notify() => notifyListeners(); // Уведомляем слушателей об изменении
}

class WorldPainter extends CustomPainter {
final WaveModel model;

WorldPainter({required this.model}) : super(repaint: model);

@override
bool shouldRepaint(covariant WorldPainter oldDelegate) => false;
}



В этом примере WaveModel расширяет ChangeNotifier и уведомляет своих слушателей при вызове метода notify(). 🔔

WorldPainter, который расширяет CustomPainter, принимает WaveModel в качестве параметра и передает его в конструктор суперкласса с параметром repaint. 🔄 Это означает, что всякий раз, когда WaveModel уведомляет своих слушателей, WorldPainter будет перерисовываться автоматически. 🎨

Преимущества этого подхода

* Автоматическое обновление холста при изменении данных 🔄
* Упрощение кода за счет использования встроенных механизмов Flutter 📚
* Повышение производительности приложения за счет оптимального управления отрисовкой 🚀

Оцените новую рубрику и напишите в комментариях, какие темы вам наиболее интересны! 👇

Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #UIUX #CodingTips #AppDevelopment
🚀 Глубокое погружение в хранение данных во Flutter: от Shared Preferences до ObjectBox!

Привет, Flutter-энтузиасты! Сегодня у нас суперполезное видео, которое точно стоит вашего внимания. Речь о надежном хранении данных — ключевом аспекте для любого приложения. Лектор Дмитрий (Яндекс Pro) на примере MoodTracker++ разбирает все тонкости Persistence.

🔥 Что внутри?
👉 Основные подходы:
- Shared Preferences для простых настроек (тема, счетчики).
- Secure Storage для токенов и паролей (аппаратное шифрование!).
- Работа с файлами (фото, CSV-экспорт) через path_provider.
- NoSQL: ObjectBox и Realm для сложных объектов.
- SQL-решения: Drift с миграциями и транзакциями.
- Облака: Firebase и Supabase для синхронизации.

💡 Фишки:
- Как выбрать инструмент под задачу?
- Тестирование хранилищ: моки, подмена путей.
- Offline-first архитектура: чтобы приложение не «забывало» данные.
- GDPR-совместимость: очистка данных по запросу.

📌 Практика:
На примере MoodTracker++ вы увидите:
- Сохранение настроек, записей, фото.
- Экспорт статистики в CSV.
- Синхронизацию между устройствами.

👉 Смотрите запись лекции с живыми примерами кода и лайфхаками от эксперта:
Хранение данных (Persistence) — ШМР Flutter 2025

💬 «Если приложение не хранит данные — оно как кот, который всё забывает. Наша цель — чтобы пользователь чувствовал заботу!» (Дмитрий, Яндекс Pro)

🔔 Подписывайтесь на Flutter Pulse — каждый день актуальные туториалы, кейсы и новости! Ищите другие видео по хэштегу #FlutterPulseYoutube.

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Flutter Canvas: что делают canvas.save() и canvas.restore()?

Привет, разработчики Flutter! 👋 Сегодня мы рассмотрим важный аспект работы с Canvas во Flutter - методы save() и restore(). Эти методы крайне полезны при создании сложных графических элементов и анимаций. 🔍

Когда вы работаете с Canvas, вы часто выполняете различные трансформации, такие как вращение, масштабирование или перемещение. Эти трансформации изменяют текущее состояние Canvas, и иногда вам нужно временно сохранить это состояние, чтобы позже вернуться к нему. Именно здесь на помощь приходят save() и restore(). 🔄

canvas.save() сохраняет текущее состояние Canvas, включая все примененные трансформации и настройки отрисовки. Это позволяет вам временно изменить состояние Canvas, выполнив необходимые операции, а затем вернуться к сохраненному состоянию с помощью canvas.restore().

Рассмотрим пример кода:


class WorldPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
canvas.save(); // сохраняем текущее положение
canvas.translate(size.width/2, size.height/2); // перемещаемся в центр
...
canvas.drawLine(Offset(0, 0), model.offset, whitePainter); // выполняем необходимые действия
canvas.restore(); // сбрасываем до последнего сохраненного положения
}
}



В этом примере мы сохраняем текущее состояние Canvas перед тем, как переместиться в центр экрана. После выполнения необходимых операций мы восстанавливаем сохраненное состояние, возвращая Canvas в исходное положение.

Использование save() и restore() позволяет вам создавать сложные графические элементы, сохраняя чистоту и управляемость кода. 💻

Оцените нашу новую рубрику и оставьте свои комментарии! 💬 Все подобные новости вы можете найти по хэштегу #FlutterPulseTips. Не забудьте подписаться и следить за новыми советами и трюками! 😉

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDevelopment #CanvasTips #FlutterTips #ProgrammingTips
🚀 Build and Release — ШМР Flutter 2025: Глубокий разбор CI/CD и релиза!

Привет, Flutter-энтузиасты! 👋 Только что наткнулся на 🔥 суперполезное видео от Никиты (разработчика в команде Яндекс.ПРО), которое просто нельзя пропустить! Если вы хоть раз задавались вопросами о CI/CD, сборке приложений или релизе в сторы — это для вас.

👉 Смотреть видео здесь 👈

📌 В лекции разобрано:
🔹 Что такое CI/CD и зачем это нужно
🔹 Настройка пайплайна в GitHub Actions для Flutter
🔹 Магия Flavors (таргеты, dart-define)
🔹 Подписание приложений для Android/iOS
🔹 Публикация в Google Play и App Store
🔹 Как ваш код превращается в артефакт: от flutter build до запуска!

💡 Никита объясняет сложные вещи простым языком: ошибки сборки, кэширование, branch protection, Firebase Distribution — всё с реальными примерами. А ещё — ответы на вопросы зрителей!

Почему стоит посмотреть?
- Узнаете, как автоматизировать рутину и экономить время
- Поймёте, как избежать "ад зависимостей" в Gradle/CocoaPods
- Научитесь настраивать тришейкинг для уменьшения размера приложения
- Увидите разбор частых ошибок сборки (+ фиксы!)

🔔 Не забудьте подписаться на наш канал — здесь мы регулярно делимся такими находками! Ищите другие полезные ролики по хэштегу 👇

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube

P.S. Видео длинное (2+ часа), но оно того стоит — сохраняйте в закладки и пересматривайте сложные моменты!
Canvas с GestureDetector: обработка событий только в пределах радиуса

Привет, Flutter-разработчики! 👋 Сегодня мы поделимся с вами полезным советом о том, как использовать GestureDetector с CustomPaint для обработки жестов только в определенной области. 📱💡

Вы когда-нибудь сталкивались с ситуацией, когда ваш CustomPaint должен реагировать на жесты только в определенной области? Например, вам нужно, чтобы нажатие обрабатывалось только если оно произошло в пределах определенного радиуса вокруг объекта? 🔍

Для этого можно использовать метод hitTest в вашем CustomPainter. Вот пример кода:


class WorldPainter extends CustomPainter {
...
bool hitTest(Offset position) {
// вычисляем расстояние от позиции до нужной точки
var distance = position.distanceTo(this.location);
// возвращаем true, если расстояние меньше радиуса обнаружения
return distance < detectionRadius;
}
...
}



Затем оберните ваш CustomPaint в GestureDetector:


class MyPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => print("do what you want"), // действие при нажатии
child: CustomPaint(
size: Size.infinite, // размер canvas
painter: WorldPainter(), // ваш кастомный painter
),
);
}
}



Таким образом, событие нажатия будет обрабатываться только если оно произошло в пределах заданного радиуса. 🔝

Оцените нашу новую рубрику и оставьте свои комментарии! 💬 Все подобные новости вы можете найти по хэштегу #FlutterPulseTips. 👉 #flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #FlutterTips #CodingTips #AppDevelopment
🚀 Погружаемся в мир статического анализа Flutter: как сделать код идеальным?

Привет, Flutter-энтузиасты! 👋 Только что наткнулся на 🔥горячее видео от Кости Фидурова (Flutter-разработчик Яндекс Pro), которое перевернёт ваше представление о качестве кода! Если вы хоть раз задумывались о:

🔧 Настройке анализатора
✍️ Создании своих lint-правил
🚫 Борьбе с "ворнингами" в проектах

— это must-watch! 💡

👉 О чём видео?
Костя детально разбирает работу статического анализа в Dart:
Чем анализатор отличается от линтера
Как настроить analysis_options.yaml под свои нужды
Секреты кастомизации правил (даже написали плагин для префикса my_ в реальном времени!)
Практические примеры дебага AST (синтаксических деревьев)

💎 Самые сочные моменты:
Разбор 4 ключевых компонентов анализа: код, анализатор, конфиг, analysis server
Как избежать runtime-ошибок через strict-casts
Создание кастомного линт-правила за 40 строк кода!
Фикс типичных ошибок через Quick Fix в IDE

🔗 Смотрите запись лекции:
Анализатор — ШМР Flutter 2025

💬 "Приготовьтесь сделать ваш код чище и профессиональнее!" — обещаю, после просмотра вы:
• Пересмотрите настройки линтинга в своих проектах
• Научитесь ловить баги до запуска приложения
• Сможете создавать правила под специфику команды

👉 Не пропустите! Это глоток свежего воздуха для всех, кто устал от бесконечных ignore: todo в коде.

📌 Подписывайтесь на наш канал, чтобы первыми получать лучшие Flutter-материалы! Ищите другие сокровища по хэштегу: #FlutterPulseYoutube

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube
Имитация вызовов REST API
Привет, разработчики Flutter! 👋 Сегодня мы рассмотрим важный аспект тестирования приложений — имитацию вызовов REST API. 📱💻

Имитация вызовов API позволяет тестировать ваше приложение без фактического обращения к серверу, что делает процесс тестирования более быстрым и надежным. ⚡️

Как это работает?
1. Импортируйте пакет mocktail:
import 'package:mocktail/mocktail.dart';


2. Создайте класс HttpClientMock, который имитирует поведение HttpClient:
class HttpClientMock extends Mock implements HttpClient {}
final httpClientMock = HttpClientMock();


3. Используйте when для определения поведения имитированного клиента:
when(() => httpClientMock
.get(Uri.parse('myapi/...')))
.thenAnswer((_) async => Response('''
{"id":"testId","route":"myPage"}
''', 200));


Таким образом, вы можете легко тестировать ваше приложение, имитируя различные ответы сервера. 🌟

Оцените нашу новую рубрику и оставьте свои комментарии! 💬

Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #MobileAppDevelopment #AppTesting #MockingAPI #FlutterTips