Ответ
Да, я работаю Flutter-разработчиком. В мои текущие задачи входит полный цикл разработки мобильных приложений: от проектирования архитектуры и реализации UI до интеграции с бэкендом и оптимизации производительности.
В последнем проекте я использовал следующий стек:
- State-менеджмент: Riverpod для предсказуемого управления состоянием и инъекции зависимостей.
- Архитектура: Чистая архитектура (Clean Architecture) с разделением на domain, data и presentation слои.
- Бэкенд: REST API (Dio для сетевых запросов), Firebase (Auth, Cloud Firestore, Cloud Messaging).
- Локальное хранилище: Hive для кэширования данных и работы в оффлайн-режиме.
Пример организации фичи в проекте:
// Presentation Layer - Widget
class ProductListScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(productListNotifierProvider);
return state.when(
loading: () => CircularProgressIndicator(),
data: (products) => ListView.builder(...),
error: (e) => ErrorView(error: e),
);
}
}
// Domain/Data Layers - Notifier & Repository
final productListNotifierProvider = StateNotifierProvider<ProductListNotifier, ProductListState>((ref) {
return ProductListNotifier(ref.watch(productRepositoryProvider));
});
Я открыт для обсуждения новых интересных проектов и задач в экосистеме Flutter.
Ответ 18+ 🔞
А, Flutter-разработчик, говоришь? Ну, хуй с горы, сейчас расскажу, чем дышу. По сути, я тут как универсальный солдат: от того, чтобы нарисовать интерфейс, который мамку не позорит, до таких танцев с бубном вокруг бэкенда, что волосы дыбом встают. В общем, полный цикл, от идеи до публикации, и чтобы всё летало, а не ползало как мартышлюшка с похмелья.
Вот в последнем проекте, например, я такую архитектуру выстроил, что сам от себя охуел. Чистая архитектура, ёпта! Не то чтобы я зануда, но когда проект растёт, а не превращается в спагетти-код, где всё связано со всем — это просто песня. Разделил всё на слои: domain, data, presentation. В domain — бизнес-логика, святая святых. В data — всякие репозитории, которые тащат данные хоть из API, хоть из локальной базы. А в presentation — уже виджеты, которые этим всем пользуются.
Для стейт-менеджмента взял Riverpod. Ну, знаешь, эта штука, которая Provider'у младший, но более зубастый брат. Удобно, предсказуемо, зависимости инжектить — одно удовольствие. Никакого провайдера глобального, который на тебя из-за угла смотрит. Всё чётко, по струнке.
Бэкенд был на REST API, общался через Dio — надёжный такой мужик, не подводит. Плюс Firebase прикрутил: авторизацию, облачную базу Firestore и пуш-уведомления. А чтобы приложение и без интернета не тупило, добавил Hive для локального кэша. Получился такой гибрид: онлайн — всё супер, оффлайн — тоже не подводит.
Вот, смотри, как примерно фича выглядела. Тут виджет, который просто показывает список продуктов и не парится, откуда данные берутся.
// Presentation Layer - Widget
class ProductListScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(productListNotifierProvider);
return state.when(
loading: () => CircularProgressIndicator(),
data: (products) => ListView.builder(...),
error: (e) => ErrorView(error: e),
);
}
}
// Domain/Data Layers - Notifier & Repository
final productListNotifierProvider = StateNotifierProvider<ProductListNotifier, ProductListState>((ref) {
return ProductListNotifier(ref.watch(productRepositoryProvider));
});
Видишь? Виджет просто смотрит на провайдер (ref.watch). А в том провайдере уже сидит ProductListNotifier — это такой умный дядька, который говорит репозиторию: «Э, сабака сука, дай-ка мне продукты». А репозиторий уже сам решает: из сети их достать или из локального кэша Hive. Виджету вообще похуй, он просто рендерит: грузится — спиннер, загрузилось — список, ошибка — сообщение об ошибке. Красота, а не жизнь.
В общем, если есть какие интересные задумки на Flutter — давай обсудим. Я всегда за задачи, где можно голову поломать, а не просто кнопки красить. Главное, чтобы проект был с душой, а не очередная «ещё одна тупая аппка».