Flutter Pulse
776 subscribers
473 photos
1.15K links
На канале будут новости про flutter с сайтов, информация об обновлении пакетов, а также авторский контент.
Download Telegram
Принцип подстановки Барбары Лисков: основа правильного полиморфизма в программировании 🌟
Привет, друзья! Сегодня мы поговорим о третьей букве в акрониме SOLID - L, которая означает принцип подстановки Лисков 🤔. Этот принцип гласит, что объекты подклассов должны быть взаимозаменяемы с объектами их базового класса без нарушения корректности работы программы 💻.

Почему это важно? 🤔 Нарушение LSP приводит к непредсказуемому поведению программы, код начинает проверять типы объектов с помощью if/else или is, что противоречит принципу открытости/закрытости и делает систему хрупкой 🌪. Соблюдение LSP гарантирует, что полиморфизм работает правильно и подклассы действительно являются специализацией базового класса 🔩.

Давайте рассмотрим пример нарушения LSP 🚫:

class Bird {
void fly() {
print("Flying");
}
}

class Penguin extends Bird {
@override
void fly() {
throw Exception("Cannot fly"); // Нарушение LSP
}
}

Здесь функция, принимающая Bird, ожидает, что любой потомок сможет летать. Но при подстановке пингвина код валится с ошибкой, значит, иерархия нарушает принцип Лисков 🚫.

А теперь пример правильного использования LSP 🌟:

abstract class Bird {
void move();
}

class Sparrow extends Bird {
@override
void move() {
print("Flying");
}
}

class Penguin extends Bird {
@override
void move() {
print("Swimming");
}
}

Ключевые правила LSP 📝:
✔️ Предусловия не могут быть усилены в подклассе — подкласс не должен требовать больше, чем базовый класс
✔️ Постусловия не могут быть ослаблены в подклассе — подкласс должен гарантировать как минимум то, что гарантирует базовый класс
✔️ Инварианты должны сохраняться — свойства, которые истинны для базового класса, должны оставаться истинными для подклассов
✔️ Исключения — подкласс не должен выбрасывать новые типы исключений, которые не ожидаются от базового класса

Полную новость читайте здесь.

FlutterPulse — канал о мире Flutter!

#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
🔥2
🪙 Жизненный цикл Flutter-приложения: как отслеживать изменения состояний 📱
Каждое мобильное приложение проходит через ряд состояний, определяемых перечислением AppLifecycleState. Чтобы корректно реагировать на эти события, нам нужно понимать, какие состояния существуют и как на них реагировать.
Существует пять основных состояний:
- resumed: приложение находится на переднем плане и готово к взаимодействию с пользователем 📈
- inactive: приложение временно неактивно, например, при поступлении звонка 📞
- paused: приложение уходит в фон и не реагирует на действия пользователя 📊
- hidden: приложение скрыто от пользователя, но процесс остается в памяти и готов к быстрому возобновлению 🔒
- detached: приложение больше не активно и готовится к завершению 🔴

Чтобы отслеживать изменения этих состояний, мы используем WidgetsBindingObserver и его метод didChangeAppLifecycleState, который вызывается каждый раз, когда система переводит приложение между состояниями.

Пример работы с didChangeAppLifecycleState:

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
  super.didChangeAppLifecycleState(state);
  setState(() {
    if (state == AppLifecycleState.resumed) {
      appState = 'Возобновлено';
    } else if (state == AppLifecycleState.inactive) {
      appState = 'Неактивно';
    } else if (state == AppLifecycleState.paused) {
      appState = 'Приостановлено';
    } else if (state == AppLifecycleState.detached) {
      appState = 'Отключено';
    } else if (state == AppLifecycleState.hidden) {
      appState = 'Скрыто';
    }
  });
}


Полную новость читайте здесь.

FlutterPulse — канал о мире Flutter!

#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
👍3🔥1
💎 Выбор аккаунта разработчика: индивидуальный или корпоративный?
Привет, друзья! 💬 Сегодня мы поговорим о важном этапе перед публикацией приложения в Google Play и AppStore - создании аккаунта разработчика. 📈 Этот аккаунт может быть двух видов: индивидуальный и корпоративный. 🤔

Индивидуальный аккаунт - это аккаунт физического лица, который регистрируется на конкретного человека. 📝 Преимущества такого аккаунта включают быстрый процесс регистрации, минимальное количество документов и проверок, отсутствие необходимости наличия официально зарегистрированного юридического лица, меньше бюрократии и более низкие затраты на содержание. 💸 Однако, есть и недостатки: ограничения в доступах, даже для администраторов, указание имени владельца аккаунта в карточке приложения, что может повлиять на репутацию продукта, доход поступает как доход физического лица и требуются особые условия для публикации. 📊

Корпоративный аккаунт регистрируется на официальное юридическое лицо. 📈 Преимущества включают более высокое доверие клиентов, поскольку они видят перед собой целую компанию, а не одного человека, огромный выбор ролевых моделей в управлении проектом, возможность делегирования ключевых прав и удобное ведение бизнеса. 📈 Однако, есть и недостатки: сложный процесс регистрации, требующий много документов и времени, более строгие требования к соответствию внутренним правилам и возможные ограничения для разработчиков из определенных стран. 🚫

Итак, какой аккаунт выбрать? 🤔 Если вы работаете над pet-проектом, стартапом или экспериментальным продуктом, индивидуальный аккаунт может быть оптимальным вариантом. 🌟 Однако, если ваше приложение является частью полноценного бизнеса или у вас большая команда разработчиков, лучше выбрать аккаунт юридического лица. 📈

Полную новость читайте здесь.

FlutterPulse — канал о мире Flutter!

#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly #mobiledevelopment #appdevelopment
💭 Реализация перетаскивания файлов в Flutter с помощью пакета desktop_drop 📁💻

Привет, друзья! Сегодня я хочу рассказать вам о пакете desktop_drop, который позволяет реализовать перетаскивание файлов в ваших десктоп- или веб-приложениях на Flutter. 🌟

Пакет предоставляет виджет DropTarget, который определяет область, на которую можно перетаскивать файлы. Этот виджет невидим, но он позволяет вам определять область для перетаскивания вокруг своего child. 📈

Основные свойства DropTarget включают:

✔️ onDragEntered — вызывается, когда файл входит в область виджета
✔️ onDragExited — вызывается, когда файл покидает область виджета
✔️ onDragDone — вызывается после того, как файл был отпущен внутри области
✔️ onDragUpdated — вызывается при движении файла внутри области
✔️ child — виджет, который отображается внутри области DropTarget

Пример использования DropTarget:

DropTarget(
onDragDone: (detail) {
for (final file in detail.files) {
print(file.path);
}
},
onDragEntered: (detail) => print('Файл в области'),
onDragExited: (detail) => print('Файл вне области'),
child: // some child
)


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

При работе с desktop_drop есть несколько нюансов, о которых стоит помнить:

▪️ Разные платформы могут по-разному обрабатывать события перетаскивания
▪️ С помощью DropDoneDetails можно получать пути к файлам и обрабатывать их без необходимости загружать весь файл в память
▪️ Для безопасной работы всегда проверяйте тип, размер и количество файлов

Для полноценного функционала работы с файлами desktop_drop можно комбинировать с file_picker и другими пакетами.

❤️ — если было полезно

Полную новость читайте здесь.

FlutterPulse — канал о мире Flutter!

#flutter #dart #FlutterPulse #FlutterPulseNews #flutterfriendly
👍1