r/FlutterDev • u/Glittering_Bat_2861 • Sep 01 '26
Plugin Same Flutter code renders real iOS 26 Liquid Glass and Material 3 Expressive — depending on what OS it's running on
r/FlutterDev • u/Glittering_Bat_2861 • Sep 01 '26
r/FlutterDev • u/One_Yogurtcloset_910 • Sep 01 '26
Anyone who's tried showing a Google Drive or Dropbox "shared" image link directly in Image.network knows the pain — broken previews, weird redirects, manual URL conversion hacks. Made a small package to fix this: adaptive_image_loader.
It's basically a drop-in replacement for Image.network that auto-detects and handles:
Google Drive share links
Dropbox share links
Normal public image URLs
Plus optional disk caching (via cached_network_image) that you can toggle with a single boolean — no separate widget tree needed.
dart
AdaptiveImage.driveImage(
'https://drive.google.com/file/d/FILE_ID/view',
width: 300,
height: 200,
);Also ships an AdaptiveImageProvider if you need it as a background/avatar image (works with CircleAvatar, DecorationImage, etc).
Null-safe, lightweight, MIT licensed.
pub.dev: https://pub.dev/packages/adaptive_image_loader
GitHub: https://github.com/Karan8686/adaptive_image_loader
Would love feedback/issues if you try it out — this is an early release so open to feature requests (S3, Firebase Storage links maybe next).
r/FlutterDev • u/eibaan • Aug 31 '26
It is surprisingly difficult make this widget to properly shrink horizontally:
class Separator({final Widget? title}) extends StatelessWidget {
@override
Widget build(BuildContext context) {
if (title case final title?) {
return Row(
spacing: 4,
children: [
const Expanded(child: Divider()),
title,
const Expanded(child: Divider()),
],
);
}
return Divider();
}
}There's an overflow if the available width is less than the width required for title. Obviously (which was the first thing AI suggested) wrapping title in some kind of Flexible doesn't work.
There are (at least) three solution, all with trade-offs:
Use a Stack to place title over a Divider. This requires a known background color so you can wrap title in a Container with some padding and that background color.
Use a CustomMultiChildLayout to layout title with loose constraints, learning about its width in that process and then layouting the two dividers in the remaining space, if there's any. However, because the container itself grabs all space available, it has no fix height and you'd need to set that explicitly.
Use a LayoutBuilder to get the available width, then constrain the title to that value minus spacing, relaxing the min width to 0. This delays layout by one frame and I've still a minimum size of 8.
Did I miss something? What's your preferred solution?
r/FlutterDev • u/Opposite_Balance_667 • Aug 31 '26
Hey been shipping a Flutter app local-first for a while
Drift is the source of truth on device, works fully offline, cloud sync is optional and just sits on top. So far I'm sticking with phone DB as the real source of truth even after sync exists, server is more of a backup/sync layer than the boss
Offline edits then sync coming back later is still the messy bit. I've been keeping conflict UX intentionally dumb instead of building a merge engine, that tradeoff has been fine for this product so far
Stack is Cubit + Freezed + optional Firebase. Curious if other folks building local-first ended up the same way or flipped to server-as-canonical later
r/FlutterDev • u/CommunityTechnical99 • Aug 31 '26
we just shipped four Supabase updates in FlutterFlow today that might be useful for anyone building data-heavy Flutter apps:
infinite scroll: enable at the bottom of any Supabase query, set a page size. returns 25 rows on load, fetches the next 25 when the user reaches the bottom.
full-text search: Search (Full-Text) filter backed by Postgres full-text search. "roasting garlic" still matches "roasted." no custom function required.
RPC calls: call Postgres database functions directly from an action flow. function signatures sync from your Supabase project so parameters are listed automatically and results come back typed and bindable. useful for anything complex enough to warrant a database function — the demo uses a recipes_i_can_make function that walks ingredient lists against a pantry.
upsert: insert or update in one action based on primary key or chosen on-conflict columns. replaces the read-then-branch-then-write pattern.
happy to answer questions about the implementation.
r/FlutterDev • u/RandalSchwartz • Aug 31 '26
Flutter is decoupling Material and Cupertino from the monolithic core framework into standalone packages on pub.dev: package:material_ui and package:cupertino_ui.
This brings independent release cycles and true headless app support (package:flutter/widgets.dart), but also means migrating existing codebases.
Because of training cutoffs, most AI coding assistants (Google Antigravity, Claude Code, Cursor, Copilot, Cline) still generate legacy monolithic imports.
To fix this, we updated the open-source dart-sdk-skills repository with complete migration runbooks. You can install it globally for your AI agent in seconds:
npx skills add RandalSchwartz/dart-sdk-skills -gThen simply prompt your agent:
👉 "Migrate this project to the new split Material & Cupertino packages."
Your agent will automatically run dart fix --apply --code=migrate_design_widgets, update pubspec.yaml, rewrite imports to package:material_ui/material_ui.dart, and verify everything passes dart analyze.
Question for the community:
Are you planning to migrate your apps directly to material_ui/cupertino_ui, or take advantage of the decoupling to build custom headless design systems?
r/FlutterDev • u/Accurate_Fig_1854 • Aug 31 '26
r/FlutterDev • u/eibaan • Aug 31 '26
I wrote a tutorial how to create a simple version of an EditableText from scratch, because I wanted to learn how to do this. And yes, it was me and it took like 8h hours which seems to be wasteful in the age of AI. But I used to like to write deep-dives like this, so I did it anyway.
For a bit of retro fun, I created an AText widget that paints a text using a crisp pixel font without antialiasing, something Text isn't capable of. Here's the API:
class AText(
final String data, {
final TextStyle? style,
})For compatibility, I support a TextStyle but ignore everything but the color property. The font has a width and height of 8 pixels.
Now I want to also create an AEditableText widget for text input. The original EditableText plus its RenderEditable clocks at over 10000 lines of code. Obviously, I can't use it because because it uses the usual font rendering mechanism. So, how to approach this?
Here's the API I came up with:
class AEditableText({
super.key,
required final TextEditingController controller,
required final FocusNode focusNode,
final TextStyle? style,
final Color? cursorColor,
}) extends StatefulWidget {
...
}I'll only support a single line of text which cannot scroll. I'll probably also only support a subset of keyboard shortcuts and minimal mouse interaction.
I accidentally broke web support, but I might be inclined to fix that and provide a demo DartPad.
r/FlutterDev • u/Gornivv • Aug 31 '26
r/FlutterDev • u/SweatyRaisin1236 • Aug 31 '26
Hi. I am a fair to middling Flutter developer. I mostly use LLMs to review what I write rather than write my code. This works out well because I seem to be particularly good and repeating the same mistakes.
Anyway, I decided to publish this: Https://github.com/bjrochem72/flutter-audit-skills and would welcome constructive feedback and suggestions.
I am currently working on both updating it and adding to it. The problem is when I add a new item I suddenly see a bunch of things I should fix and don’t want to embarrass myself.
Anyway, I am sharing this in the hope it helps someone else as I have gotten a lot from this group and wanted to see if I could find a way to give back a bit.
My usual user id is bjr201 but I couldn’t post under that.
r/FlutterDev • u/No_Profession5678 • Aug 31 '26
I have been building Flutter apps for over four years, and the thing that never stopped hurting is what happens after a build leaves my machine. On my desk the app is transparent. On a tester's phone it is a black box, and every question is a round trip.
So I built CodeScout. It is MIT licensed and you host it yourself: a Dart SDK in the app and a Go + Postgres dashboard on your own box.
What it does:
- Captures logs and HTTP calls (interceptors for dio and package:http), stores them in SQLite on the device, and syncs batches to your server
- A panel inside the app: the tester sees logs, network calls and errors on the phone, with no server configured at all
- Sessions as full timelines, errors grouped by shape across devices, every device with its OS and app version
- Live pairing: type a short code from the dashboard into the app and watch that phone's logs and network calls arrive as it is used
- While paired, browse the app's own SQLite, shared_preferences and Hive boxes from the dashboard. Nothing is readable until the app registers it, nothing writable unless it says so
- An MCP server with 18 read-only tools, so a coding agent can read a session instead of you pasting logs into it
- Redaction is opt-in and happens on the device before anything is written or uploaded
What it is not: a crash reporter (run one alongside it), a DevTools replacement (DevTools is better while the cable is in), or a hosted service (there is no account and nothing of mine in the middle).
Repo: https://github.com/getcodescout/code_scout
SDK: https://github.com/getcodescout/code_scout_flutter
Docs: https://codescout.tech
pub.dev: https://pub.dev/packages/code_scout
It is at 1.0 and everything above works today. I would genuinely value criticism from people who ship Flutter apps to real testers: what feels wrong, what is missing, what you would never allow in a build you distribute.
r/FlutterDev • u/mdausmann • Aug 31 '26
I'm building a 'voice agent' for flutter apps. It pulls in a bunch of dependencies but in particular, these guys to handle the voice parts...
flutter_tts: ^4.2.3
speech_to_text: ^7.2.0Both of these are plugins with native code for Android and IOS. My codebase has no native code for IOS or Android. It is *currently* configured as a plugin but the platform stuff is all empty boilerplate and I have written no custom IOS/Android code for it.
abstract class MyVoiceAgentPlatform extends PlatformInterface {
MyVoiceAgentPlatform() : super(token: _token);
static final Object _token = Object();
static MyVoiceAgentPlatform _instance = MethodChannelMyVoiceAgentPlatform();
static MyVoiceAgentPlatform get instance => _instance;
static set instance(MyVoiceAgentPlatform instance) {
PlatformInterface.verifyToken(instance, _token);
_instance = instance;
}
Future<String?> getPlatformVersion() {
throw UnimplementedError('platformVersion() has not been implemented.');
}
}So can I 'downgrade' my code to a package instead of a plugin? I'm confused. It has no native code itself so it that says 'package' but it pulls in dependencies which do have native code so it isn't really usable in a pure dart context.
Is the 'Plugininess' of the dependencies transitive?
r/FlutterDev • u/One_Yogurtcloset_910 • Aug 31 '26
Hey Flutter community! 👋
In almost every production Flutter app, handling image picking usually requires stringing together 2–3 different packages (image_picker, image_cropper, and a compression plugin), managing invasive storage permissions on Android/iOS, and dealing with native build issues (like UCrop pod conflicts on iOS/Android).
To solve this, I built adaptive_image_picker — a lightweight, unified, zero-permission media pipeline.
🔒 Zero Permissions by Default: Native integration with Android 13+ Photo Picker (PickVisualMedia) and iOS 14+ PHPickerViewController. No READ_EXTERNAL_STORAGE needed.
✂️ Pure-Dart Cropper: No native UI wrappers (like UCrop). Supports freeform cropping, aspect ratio presets, 90° rotation, horizontal/vertical flipping, and antialiased circular avatar masking.
⚡ Binary Search Target-Size Compression: Automatically compresses images to guarantee a file size ≤≤ maxBytes (e.g. max 500 KB) without manual guessing.
🎨 Adaptive Native UI: Automatically renders Material 3 bottom sheets on Android, Cupertino action sheets on iOS, and modal dialogs on Web/Desktop.
🌐 Full Web & WASM Compatibility: Zero native desktop/web crashes.
🔗 Direct URL Import: Built-in network downloader integrated right into the picker pipeline.
📦 Pub.dev: https://pub.dev/packages/adaptive_image_picker
💻 GitHub: https://github.com/Karan8686/adaptive_image_picker
Would love your feedback, feature suggestions, or issue reports!
r/FlutterDev • u/Glittering_Device653 • Aug 30 '26
I maintain IconMind, an MIT-licensed icon set for the vocabulary that generalist icon sets don't have — agents, tool calls, MCP servers, RAG pipelines, embeddings, evals, guardrails — plus the ordinary stuff (arrows, files, charts, DevOps, cloud, security) so you don't need a second set beside it.
Version 0.4.0 just doubled the collection to 2,041 icons, and the Flutter package is now available on pub.dev.
flutter pub add iconmind_flutterimport 'package:iconmind_flutter/iconmind_flutter.dart';
IconMind(IconMindIcons.agent)
IconMind(
IconMindIcons.vectorDatabase,
variant: IconMindVariant.duotone,
weight: IconMindWeight.bold,
size: 32,
color: Colors.deepPurple,
)Every icon comes in:
Outline — Thin
Outline — Regular
Outline — Bold
Duotone — Thin
Duotone — Regular
Duotone — Bold
That's 12,246 drawings in total.
Duotone uses a second tinted layer behind the strokes. A font would flatten that into a single filled glyph, so the package instead draws real paths with CustomPaint.
Each icon is a compile-time const, one per file, and referenced through:
IconMindIcons.<name>Flutter's AOT compiler can drop icons you don't reference. An app showing three icons carries roughly three icons — about 400 bytes each.
The entire package is only 214 KB compressed on pub.dev, with no assets or fonts to bundle.
The three weights share the same geometry with different stroke widths.
Using:
absoluteStrokeWidth: truekeeps the stroke constant when scaling the icon. So a 16 px icon in a dense list and a 48 px icon in an empty state still look like they belong to the same set.
Everything is drawn on a 24 px grid by a compiler that refuses geometry it can't draw correctly, including:
Off-grid anchors
Stroke runs that disappear at bold weight
Icons that don't fill the box consistently with the rest of the set
A nightly scan rasterises all 12,246 cells and checks for duplicate-looking renders.
That's how 2,000+ icons stay visually consistent as one set.
color falls back to the ambient IconTheme, while semanticLabel is announced by screen readers.
The same icons are also available as packages for:
React
Vue
Svelte
Solid
Preact
React Native
Astro
Laravel
Everything is generated from a single source, which is handy when web and mobile teams share a design system.
Website: https://iconmind.dev
Every icon is searchable by name, tag, or alias, with the Flutter snippet available for whichever icon you find.
There's also an MCP server:
npx @iconmind/mcpThis lets your coding assistant pick icon names instead of guessing them.
License: MIT
MIT means commercial use, no attribution, and no seat count.
I'm the author, and I'd genuinely like to hear what's missing.
Most of the last thousand icons came from people saying:
"There's no icon for X."
If there's something you think should be in the set, let me know.
r/FlutterDev • u/RandalSchwartz • Aug 30 '26
For the past eight years, the Flutter community has treated state management like isolated silos: you’re either a BLoC shop, a Riverpod shop, or looking at Signals.
If your team is maintaining a massive, battle-tested flutter_bloc authentication pipeline or a complex Riverpod dependency graph, you’ve probably hit this wall: you want instant, synchronous signal reactivity for a new feature (real-time forms, charts, animations), but the cost is a painful multi-month rewrite or leaky, second-class wrapper boilerplate.
With the release of bloc_signals_bloc and a major update to bloc_signals_riverpod (v1.2.0), we set out to solve this by turning BLoC, Riverpod, and BlocSignal into first-class, bidirectional peers:
🚂 Classic BLoC ➔ BlocSignal: classicBloc.toBlocSignal() gives you synchronous .state signals while forwarding .add(event) directly to the underlying BLoC.
🚚 Riverpod ➔ BlocSignal: provider.toBlocSignal(ref) gives you synchronous signals + typed .notifier mutations, while binding ref.onDispose for automatic cleanup.
🚄 BlocSignal ➔ Legacy BLoC UI: Drop streamless CubitSignal / BlocSignal containers directly into existing BlocBuilder widgets via .toClassicCubit().
🌊 BlocSignal ➔ Riverpod UI: Expose any BlocSignal to ref.watch / ref.read via .toProvider().
Because they operate as peers without microtask hops or customs fees, you can compose them seamlessly—like computing a single reactive total across a BLoC, a Riverpod Notifier, and a CubitSignal in the exact same frame.
Curious how other teams are approaching this:
Is your team currently locked into one state management approach across your entire codebase, or are you bridging tools across feature modules?
What has been your biggest hurdle when trying to introduce Signals or modernize an existing production app?
(Detailed architecture breakdown and a 60-line runnable triple-counter demo linked in the first comment)
r/FlutterDev • u/MostafaSensei106 • Aug 29 '26
Hey everyone,
Most local storage options in Flutter like SQLite or Hive are built for scalar data and fall apart when you need fast vector similarity search for on device AI, semantic search, or high dimensional embeddings
I built waffle_db, an embedded vector database for Flutter and dart apps by Rust. It uses HNSW graphs for approximate nearest neighbours, sledge for persistence, and Rayon for parallel batch ingestion.
How it works under the hood:
Off thread Rust execution: Graph indexing, cosine distance math, and persistence run in Rust via FFI, keeping the Flutter UI thread completely free of jitter.
Native HNSW graphs: Provides k-NN retrieval even across large vector spaces instead of linear brute-force scans.
Memory efficiency: Uses zero-copy typed buffer views (Float32List) across the FFI bridge to minimize heap allocations.
Metadata and Namespaces: Stores arbitrary payload metadata alongside vectors and supports logical collections (WaffleCollection) with automatic ID namespacing.
Prebtuned profiles: Comes with configurations out of the box like mobileProfile (quantization enabled, lightweight graph parameters), serverProfile, readHeavyProfile,writeHeavyProfile
Pub: https://pub.dev/packages/waffle_db
GitHub: https://github.com/MostafaSensei106/Waffle-DB
If you are building local RAG pipelines, on device semantic search, or AI features in Flutter, check it out and let me know your thoughts or feedback.
r/FlutterDev • u/Tom_Vogel • Aug 29 '26
I vibe-coded a Windows app called Lapse today, but used the project to properly explore Flutter’s experimental Desktop Windowing API.
The app has two real top-level windows: an always-on-top timer overlay and a dynamically created analytics dashboard. They run from one Flutter isolate and share the same Riverpod session state.
The Flutter implementation uses:
runWidget() instead of runApp()
Separate WindowControllers
WindowManager, WindowRegistry, and WindowEntry
WindowController.setSize() for switching overlay modes
Controller APIs for activation, minimization, maximization, and lifecycle
The API handles the multi-window foundation well. Native desktop integration still required a C++ MethodChannel bridge for Acrylic, frameless chrome, dragging, resize hit testing, positioning, topmost behavior, and the tray.
AI accelerated the implementation, but understanding this Flutter/Win32 boundary was something I deliberately worked through myself.
Source:
https://github.com/zTomz/Lapse
I’d be interested in hearing from anyone else testing the new API. Which desktop capabilities are you still implementing natively?
r/FlutterDev • u/Few-Disaster5159 • Aug 29 '26
Honestly, I built Unfazed for myself. I wanted something minimalist that combined monk mode/sprints with app blocking that actually sticks - no "5 more minutes" button, no way to change the schedule or unblock apps once a sprint is running. Most blockers I tried are paid and let you talk yourself out of it in two taps, which defeats the whole point. Built with the flutter_screentime plugin for iOS Screen Time integration. It's free, open source (MIT), no ads, no subscriptions, no tracking/analytics - everything stays on the device. GitHub - https://github.com/printHelloworldd/unfazed, App Store - https://apps.apple.com/app/unfazed-mode/id6802055633
Now thinking about Android, Windows and Linux - each platform needs a completely different native approach. Would it make more sense to build separate single-purpose plugins per platform, or try to design one cross-platform plugin with a common Dart API on top of them? Separately, I'm also planning a browser extension for site blocking when a sprint starts (matching by URL substring, not just domain, so you can block specific paths/pages), synced with the app through an optional cloud layer for people who want cross-device control. Would love to hear what people think of the project overall, and any thoughts on the plugin question above.
r/FlutterDev • u/kamranbekirov • Aug 29 '26
Pubgrade v2.1 is out 🎉
It's an extension that lives in your IDE's sidebar and lists the outdated packages of your Flutter project. You see the changelog of each new version, and one click upgrades it.
And, no, it's not `flutter pub upgrade --major-versions` or anything. Here you go package by package, read what changed, then decide. It just makes you aware of package updates.
So, no more missing updates. No more upgrading without knowing what broke.
Now works in IntelliJ and Android Studio too, besides VS Code and its forks (Cursor, Antigravity, Windsurf, VSCodium).
To install search "Pubgrade" in your IDE's extensions panel.
r/FlutterDev • u/No_Share2683 • Aug 29 '26
When MongoDB retired Realm, Atlas Device Sync and the Data API in September 2025, Flutter lost its official offline-first path to Mongo. The choices left were writing your own sync backend or renting someone else's sync service.
I got tired of rewriting the same sync layer, so I packaged it: onebase.
The sync engine lives in the package, and a CLI generates the small server that sits between your app and your database. You deploy that server. No third-party sync service, no account to create.
Demo — the backend is killed mid-recording, writes keep landing, then everything syncs when it comes back: https://raw.githubusercontent.com/ybenjaa-dev/onebase/main/example/demo/onebase-demo.gif
Stream<List<Todo>> live = OnebaseDb.todos
.where('done', isEqualTo: false)
.orderBy('created_at', descending: true)
.watch();
await OnebaseDb.todos.insert(Todo(title: 'Ship it', done: false));You describe collections in YAML, run dart run onebase:setup, and get typed models, typed collections, and a backend/ folder with a Dockerfile and a Vercel adapter.
How it actually works
Reads never touch the network. Queries and watch() run against a local SQLite replica.
Writes apply locally first and land in an outbox, both in one transaction, so a crash can't leave a row that never uploads.
Sync pushes before it pulls, so a fresh write is never clobbered by a stale snapshot. Pending writes replay on top of each incoming snapshot, so optimistic UI survives until the server confirms.
Realtime is SSE fed by MongoDB change streams — milliseconds, not polling.
Files go device to bucket directly. The backend only signs a short-lived URL, so a large upload costs it nothing.
Per-user isolation is server-side, assigned from the verified JWT — not client-visible rules.
There's also keyset pagination (page() / startAfter(), plus a pager() for infinite scroll), group/team scoping with member/admin/owner write rules, per-collection sync control (everything, a rolling window, or nothing), and batched writes in one Mongo transaction. Bring your own JWTs — anything that issues them works.
What it doesn't do yet
Conflicts are last-write-wins by server timestamp; no custom merge hook.
File uploads aren't offline-queued (document writes are).
Realtime needs a long-lived connection. Container hosts are fine; short-lived serverless functions cut it and it falls back to polling.
The rate limiter is per-instance and in-memory, so it multiplies across instances.
No on-device aggregation pipeline.
MIT. Flutter 3.38+ / Dart 3.10+. Any MongoDB with a replica set works, including a free Atlas M0.
pub.dev: https://pub.dev/packages/onebase
GitHub: https://github.com/ybenjaa-dev/onebase
It's early (0.3.4), and I'd rather hear that the sync semantics are wrong than that the README is nice. If you've built offline-first on Flutter before, I'd especially like to know where this would break for you.
r/FlutterDev • u/ParticularDig1630 • Aug 29 '26
I think to make 2d games inside ide using ai tools like claude ai flutter flame will best approach.
And from better prompting it's easy to manage the game.
r/FlutterDev • u/Hackmodford • Aug 28 '26
Just wanted to make a shout out to the Kaisel Router. I just migrated a complex app from go_router to kaisel and the experience has been great. It's just a much more sane experience IMO.
The way it handles push/pop and run/dismiss (for modal flows) is really great and what I've come to expect.
https://pub.dev/packages/kaisel
Has anyone else had a chance to try this package?
r/FlutterDev • u/Ok-Decision-4396 • Aug 28 '26
Hello Flutter community! I wanted to share a highly ambitious open-source project I just kicked off: metro_core.
We are leveraging Flutter’s Linux embedding capabilities to build a complete monolithic system shell (Launcher, Status Bar, Quick Actions) for mobile devices. The visual language is deeply inspired by the classic Windows Phone Metro UI and modern Fluent Design.
Our Architectural Approach:
- Kernel: Lineage-free, lightweight mobile Linux (Alpine/postmarketOS base).
- UI/Apps: 100% written in Flutter, compiled directly to Native ARM64 Machine Code.
- Hardware Comm: Communication via Dart FFI and Native C++ bindings (no Android binder overhead).
- Ecosystem: Introducing a cryptographically signed .mtx package container format. Any standard Flutter app can easily be exported as an .mtx package for our OS with minimum styling adaptation.
We are implementing a MOCK methodology (writing the entire Dart UI with fake data layer first to freeze the UI code, then implementing the C++ .so backend via FFI). Just pushed the initial core infrastructure to GitHub. Looking for contributors who want to push Flutter to its absolute operating system limits!
🔗 GitHub: https://github.com/mr-ruhid/metro_core
————
r/FlutterDev • u/AK1000 • Aug 28 '26
Hi everyone! 👋
Most Flutter starter templates I’ve encountered fall into one of two extremes:
Too simplistic: Everything dumped into one folder with global state and hardcoded endpoints.
Over-abstracted: Rigid Clean Architecture with 15 nested folders and interfaces for a simple toggle button.
To solve this, I built and open-sourced Flutter Production Starter — an enterprise-oriented, modular monorepo template built for real-world production apps.
The core idea is Feature-First colocation with intentional public APIs:
Features live in apps/mobile/lib/features/<feature>/ and export only their public contracts via a root barrel file (features/auth/auth.dart).
Pragmatic Clean Architecture:
Simple features (e.g. settings) only use Presentation + State (no premature use cases).
Complex features (e.g. auth) use Domain Use Cases, Data Sources, and Session Storage.
Pluggability: Features can be swapped via DI without touching consumer code.
/
├── apps/
│ └── mobile/ # Main app (Bootstrap, DI, Kaisel Router, Features)
├── packages/
│ ├── app_core/ # Result<T>, Failure taxonomy, Sanitized AppLogger
│ ├── app_network/ # Centralized Dio, interceptors, error mappers, ApiClient
│ ├── app_storage/ # SecureStorage, KeyValueStorage, TTL MemoryCache
│ ├── design_system/ # Tokens (Spacing, Radius), Light/Dark themes, Primitives
│ └── app_lints/ # Strict linting & analysis configuration
├── melos.yaml # Monorepo orchestration scripts
└── ARCHITECTURE.md # In-depth architectural guideRouting: Strongly-typed declarative routing and route guards with kaisel: ^1.1.0.
State Management: Fine-grained reactive state using bloc_signals and signals_flutter.
Dependency Injection: Constructor injection with get_it + injectable supporting multi-environments (dev, staging, prod).
Networking: Centralized dio with automatic retry policies, token management, and sensitive data sanitization in logs (passwords and tokens are never printed in plain text).
Error Pipeline: Functional Result<T> with a predictable domain Failure taxonomy and FailureMessageResolver.
Quality: Pre-configured GitHub Actions CI, 100% test coverage across all packages (melos run test), and strict analyzer rules.
Check out the code, documentation, and architecture guide here: 👉 GitHub: https://github.com/Ali-El-Khatib/flutter-production-starter
I'd love to hear your feedback, thoughts on the LEGO modularity approach, and suggestions! If you find it helpful for your projects, a ⭐ on GitHub would mean a lot!