Flutter Pulse
526 subscribers
350 photos
770 links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Смена версии Flutter

Иногда это просто необходимо 🤔

Чтобы изменить версию Flutter, следуйте этим шагам:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:


git checkout 1.22.6
# Обновление файлов: 100% (4559/4559), готово.
# Примечание: переключение на '1.22.6'.



Теперь следующая команда flutter установит все необходимые требования 📦

2. Чтобы вернуться к последней стабильной версии, просто используйте:


git checkout stable



ИЛИ

Используйте FVM, чтобы переключать версию Flutter напрямую 🔄



dart pub global activate fvm



Или используйте пакет brew... 🍺


fvm use 1.22.6



Больше информации на https://fvm.app/ 🤓

Оцените нашу новую рубрику! 👍👎
Все подобные новости можно найти по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #FVM #FlutterTips #MobileDev #DevTips
🚀 Flutter Deep Linking & State Restoration: Как вернуть пользователя ТОЧНО туда, где он остановился?

Привет, Flutter-энтузиасты! Сегодня делимся 🔥горячим видео от коллег, которое перевернет ваше представление о навигации и сохранении состояния в приложениях! Речь о вебинаре «Flutter Deep Linking & State Restoration: возвращаем пользователей» из курса «Flutter Mobile Developer».

Представьте: пользователь ушел из вашего приложения (SMS, звонок, перезапуск системы), а при возвращении видит точно тот экран, поле формы или даже позицию скрола, где остановился! 💯 Магия? Нет — грамотная работа с диплинками и восстановлением состояния.

Что разобрали в видео:
- Диплинки: Scheme-based, Universal Links, App Links — чем отличаются и как внедрить.
- Навигация: Когда выбрать Navigator 1.0, а когда перейти на мощный Router API (Navigator 2.0) для сложных сценариев.
- State Restoration: Как сохранять/восстанавливать состояние UI даже после выгрузки приложения из памяти.
- Restorable Routes: Автоматический возврат пользователя в нужную точку стека навигации.
- Практика: Создание приложения с «бесшовным» UX — диплинки + восстановление состояния.

🎯 После просмотра вы сможете:
- Реализовать «умные» диплинки, которые открывают нужный экран.
- Выбирать оптимальный подход к навигации для вашего проекта.
- Избавить пользователей от потери данных в формах 🗒 или позиции в ленте.
- Сделать приложение, которое никогда не сбрасывает прогресс!

Кому будет полезно?
- Разработчикам multi-screen приложений.
- Тем, кто хочет повысить retention и UX.
- Всем, кто боролся с «сбросом» состояния после перезапуска.

💡 Главный секрет: Flutter — это не только про красивый UI, но и про контроль над каждым шагом пользователя. Видео покажет, как превратить технические возможности в конкурентное преимущество!

👉 Смотрите запись прямо сейчас:
Flutter Deep Linking & State Restoration: возвращаем пользователей

Не забудьте подписаться на канал Flutter Pulse — здесь только полезное для вашего кода! Ищите другие уроки по хэштегу #FlutterPulseYoutube 🚀

#Flutter #Dart #FlutterPulse #FlutterPulseTips #FlutterPulseYoutube #DeepLinking #StateRestoration #MobileDev #UX
Полезный совет по Dart: Как изменить версию Flutter

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

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

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

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
Полезный совет по Dart: Как изменить версию Flutter

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

Иногда возникает необходимость изменить версию Flutter. Вот как это можно сделать:

1. Проверьте, где установлен Flutter на вашей системе, а затем выполните команду:
git checkout 1.22.6
> Updating files: 100% (4559/4559), done.
> Note: switching to '1.22.6'.

После этого следующая команда flutter установит все необходимые требования.

2. Чтобы вернуться к последней стабильной версии, просто используйте:
git checkout stable

Или используйте FVM для быстрого переключения версий Flutter:

1. Активируйте FVM:
dart pub global activate fvm

2. Используйте нужную версию:
fvm use 1.22.6

Дополнительная информация доступна на сайте FVM:
https://fvm.app/docs/getting_started/installation
https://fvm.app/

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

Все подобные советы ищите по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #DevTips #FlutterCommunity
Спам кнопок: как предотвратить множественные нажатия?

Вы когда-нибудь сталкивались с ситуацией, когда пользователь нажимает кнопку несколько раз подряд, вызывая нежелательные действия? 🤯

Представьте, что пользователь нажимает кнопку "Лайк" 10 раз за 1 секунду! 👍 Как сделать так, чтобы событие сработало только один раз? 🤔

Решение: использование RxDart с debounceTime ⏱️


import 'dart:async';
import 'package:flutter/material.dart';
import 'package:rxdart/subjects.dart';
import 'package:rxdart/rxdart.dart';

class LikeButtonWidget extends StatefulWidget {
final Function onTap;

const LikeButtonWidget({required this.onTap, Key? key}) : super(key: key);

@override
_LikeButtonWidgetState createState() => _LikeButtonWidgetState();
}

class _LikeButtonWidgetState extends State<LikeButtonWidget> {
final pushSubject = BehaviorSubject<void>();
late StreamSubscription<void> pushSubscription;

@override
void initState() {
super.initState();
pushSubscription = pushSubject.stream
.debounceTime(const Duration(milliseconds: 1000))
.listen((_) {
// отправить запрос на сервер или выполнить другое действие
widget.onTap();
});
}

@override
void dispose() {
super.dispose();
pushSubscription.cancel(); // не забудьте отменить подписку на поток
}

@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
pushSubject.add(null);
},
child: const Icon(Icons.plus_one),
);
}
}


Этот код создает кнопку "Лайк", которая срабатывает только один раз в секунду, даже если пользователь нажимает ее несколько раз подряд. 🔥

Оцените нашу новую рубрику и оставьте свои отзывы! 😊

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #RxDart #DebounceTime #ButtonSpam #SpamProtection
👍2🔥1
Центрирование формы без скрытия полей при открытом клавиатуре

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

Проблема: Когда клавиатура открывается, поля формы могут быть скрыты, что затрудняет ввод данных пользователем. 😕

Решение: Использовать Scaffold с параметром resizeToAvoidBottomInset: true и обернуть форму в SingleChildScrollView. 📝



Scaffold(
resizeToAvoidBottomInset: true, // Изменяет размер при открытии клавиатуры
body: Form(
key: _formKey,
child: SingleChildScrollView( // Позволяет прокручивать содержимое
child: SizedBox(
height: MediaQuery.of(context).size.height,
width: MediaQuery.of(context).size.width,
child: Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center, // Центрирует содержимое
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Spacer(flex: 1), // Гибкое пространство сверху
TextFormField(...), // Поля формы
TextFormField(...),
const Spacer(flex: 1), // Гибкое пространство снизу
],
),
),
),
),
)



Как это работает:
- resizeToAvoidBottomInset: true заставляет Scaffold изменять размер при открытии клавиатуры. 🔄
- SingleChildScrollView позволяет прокручивать содержимое формы, если оно не помещается на экране. 🔄
- Spacer с гибким размером (flex: 1) обеспечивает равномерное распределение пространства сверху и снизу формы. ⚖️

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

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #AppDevelopment #CodingTips
👍41🔥1🤯1
Круглый аватар с границей
Круглый аватар не имеет границы, но есть быстрый способ добавить её!

Если вы не хотите переписывать виджет CircleAvatar...
Просто оберните его ещё в один или используйте Container с градиентом.



CircleAvatar(
radius: radius + 2, // Увеличиваем радиус для границы
backgroundColor: borderColor, // Цвет границы
child: CircleAvatar(
radius: radius, // Радиус внутреннего аватара
backgroundImage: NetworkImage(url), // Изображение из сети
),
);



Оцените новую рубрику лайком 👍 и подпишитесь, чтобы не пропустить новые советы! 😉
Все подобные новости можно найти по хэштегу #FlutterPulseTips
#flutter #dart #flutterpulse #FlutterPulseTips #mobiledev #appdevelopment #uiux #codingtips
👍3
Как создать список чекбоксов с помощью CheckboxListTile

Привет, подписчики! 👋 Сегодня мы рассмотрим, как легко создать список чекбоксов в вашем Flutter-приложении, используя виджет CheckboxListTile. 📝

Преимущества CheckboxListTile:
- Упрощает создание списков с чекбоксами
- Позволяет легко управлять состоянием выбранных элементов
- Поддерживает стандартный стиль Material Design

Пример кода:


class SkillsFilterList extends StatelessWidget {
final SkillsFilter skillsFilter;
final Function() onChanged;

const SkillsFilterList({
Key? key,
required this.skillsFilter,
required this.onChanged,
}) : super(key: key);

@override
Widget build(BuildContext context) {
return ListView.separated(
shrinkWrap: true,
physics: const BouncingScrollPhysics(),
itemCount: skillsFilter.value.length,
separatorBuilder: (context, index) => const SizedBox.shrink(),
itemBuilder: (context, index) {
final skill = this.skillsFilter.value[index];
return ListTileTheme(
contentPadding: EdgeInsets.all(0),
child: CheckboxListTile(
dense: true,
title: Text(skill.scopeName),
value: skill.chosed,
onChanged: (skill) {
skillsFilter.select(skill);
onChanged();
},
),
);
},
);
}
}



Ключевые моменты:
ListView.separated используется для создания списка с разделителями
CheckboxListTile упрощает создание элемента списка с чекбоксом и текстом
✦ Свойство onChanged обрабатывает изменения состояния чекбокса

Оцените эту рубрику и напишите в комментариях, какие темы вы хотели бы видеть в будущих выпусках! 💬

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

#flutter #dart #flutterpulse #FlutterPulseTips #MobileDev #UIUX #FlutterTips #AppDevelopment #CodingTips
👍31
Работаем с клавиатурными сокращениями

При создании приложений для Flutter Web или Desktop, важно обеспечить удобное управление клавиатурными сокращениями. В этом нам помогут виджеты Shortcuts и Actions! 🚀

Shortcuts - это виджет, который создаёт привязку клавиш к определённым действиям для своих потомков. Всё просто: вы предоставляете карту клавиш и интенций (Intent).

Actions - этот виджет позволяет потомкам вызывать действия, определённые в родителе. Его можно использовать как вместе с Shortcuts, так и отдельно 😉

Давайте рассмотрим пример кода:

// Это просто используется для указания нужного действия
class SelectAllIntent extends Intent {}

@override
Widget build(BuildContext context) {
return Shortcuts(
shortcuts: <LogicalKeySet, Intent>{
LogicalKeySet(LogicalKeyboardKey.control, LogicalKeyboardKey.keyA): SelectAllIntent(),
},
child: Actions(
dispatcher: LoggingActionDispatcher(),
actions: <Type, Action<Intent>>{
SelectAllIntent: SelectAllAction(),
},
child: Builder(
builder: (BuildContext context) => TextButton(
onPressed: Actions.handler<SelectAllIntent>(context, SelectAllIntent()),
child: const Text('SELECT ALL'),
),
),
),
);
}

// Action будет содержать логику, которую вы хотите выполнить при срабатывании клавиатурного сокращения
class SelectAllAction extends Action<SelectAllIntent> {
@override
void invoke(covariant SelectAllIntent intent) {
// делайте то, что вам нужно
}
}



В этом примере мы создаём клавиатурное сокращение Ctrl+A для вызова действия SelectAllAction. Просто и удобно! 👍

Оцените нашу новую рубрику и напишите, о чём бы вы хотели узнать в следующий раз 🤔

Все подобные советы ищите по хэштегу #FlutterPulseTips

#flutter #dart #flutterpulse #FlutterPulseTips #FlutterTips #MobileDev #KeyboardShortcuts #FlutterDev #CodingTips
👍2