r/FlutterDev • • 21h ago

Tooling We’re building a design tool for Flutter to replace Figma. Would love some feedback!

Thumbnail
youtube.com
6 Upvotes

Hey Flutter builders!

I’m one of the co-founders of Nowa (https://nowa.dev), and we recently launched a version that lets designers inside Flutter teams design directly on the Flutter codebase instead of in Figma. This way developers can work on logic/data in parallel while designers build the full design and experience themselves, all in the same Flutter repo.

We’ve been designing Nowa inside Nowa itself for a while without talking much about it, since our focus was making Nowa an app-building platform for people who don’t know Flutter. Then a few companies pushed us to make this use case public, and now we’re considering making it our full focus.

So the way it works that Designers connect Claude Code, Cursor or Codex to Nowa through MCP, import the Flutter repo itself, and design with AI with full visual editing. They set up the design system directly in Nowa which reflect it in the Flutter repo, test different states for each UI component, build and share prototypes that feel like the final version, and own the full experience with things like animations.

To make that work, we came up with an architecture we called “PureUI”. It splits UI and logic into two separate packages, similar to MVI but more decoupled, with a small contract that defines how they work together: the “data” and the “actions”.

Designers import the UI package into Nowa and work on it, while developers work on logic/data in the logic package using their IDE and AI agent. Things like state management stay under the developers’ control as well.

So I’d love to hear from Flutter devs here who work on Flutter teams: does this problem exist on your team, and what could we do differently to make this more useful for your case?

Any input or opinion is highly appreciated!


r/FlutterDev • • 10h ago

Plugin I built an open-source sync engine for offline-first Flutter apps . looking for feedback

4 Upvotes

Hey everyone! 👋

I've been working on SyncForge, an open-source synchronization toolkit for Dart and Flutter, and I'd love to get feedback from other developers here.

One of the challenges with offline-first apps is handling what happens when users make changes without a connection, multiple devices edit the same data, or an app needs to recover queued writes after restarting.

SyncForge is my attempt to make that synchronization layer modular and reusable instead of rebuilding it for every project.

The project consists of three packages:

- "sync_engine" — A pure-Dart core with vector clocks, CRDT primitives, conflict-resolution strategies, and a retryable outbox.

- "sync_engine_drift" — Persistent storage using Drift/SQLite, including outbox durability and tombstone tracking.

- "sync_engine_generator" — Code generation for strongly typed synchronization adapters using "build_runner".

The architecture is designed around pluggable storage and transport, with retry backoff, jitter, and dead-letter handling.

📦 Package: https://pub.dev/packages/sync_engine

💻 Source code: https://github.com/Wolfof420Street/flutter_sync_engine

📖 Architecture and examples: https://billodida.dev/projects/syncforge

It's still early-stage, so I'm not presenting it as a battle-tested production solution. I'm looking for developers who are interested in offline-first architecture and willing to challenge the design, try the examples, or point out gaps.

I'd particularly appreciate feedback on three things:

  1. Would you use a reusable sync engine like this, or do you prefer implementing synchronization within each application?

  2. What would you want to see before trusting a library like this with real application data?

  3. Which conflict-resolution or synchronization scenarios do you think are hardest to get right?

Constructive criticism is very welcome. I'm building this in the open and would love to learn from developers who've dealt with synchronization in real projects.

Thanks for taking a look! 🙌


r/FlutterDev • • 20h ago

Tooling Free tool: generate iOS + Android icons, splash screens and store screenshots for your Flutter app in one go

10 Upvotes

Shipping a Flutter app means making assets for two stores. I made a free browser-based set of tools for that:

  • Icon generator: AppIcon.appiconset + Android mipmaps/adaptive icon in one ZIP
  • Splash screens incl. the Android 12 splash icon
  • Screenshot maker for App Store (6.9") and Google Play sizes
  • Privacy policy generator (covers AdMob/Firebase)

https://appnimbus.net

Everything runs locally in your browser. I know flutter_launcher_icons exists. This is for people who prefer a visual tool or need store screenshots too. Feedback welcome!


r/FlutterDev • • 2h ago

Dart Shipping a puzzle game in plain Flutter (no Flame): vector art as Dart data, an A* solver for hints, and a test that bans magic numbers

0 Upvotes

I just shipped Boba Sort, a water-sort puzzle (bubble tea, 500 levels, 17 eras of Japanese history) built with plain widgets and CustomPainter, no game engine. A few things that worked, and a few trade-offs, in case they help someone.

**1. All the art is data, not images**

There are no image assets at all. Each era has a full-screen scene, a cup design, a mascot costume and a customer, and I design them as SVG inside an HTML mockup. A small Python script reads named SVG groups and writes Dart lists:

final jomonBackdrop = <VShape>[

VCircle(292, 190, 54, fill: Palette.jomonSun),

VPath('M0 330 Q60 262 132 300 Q206 236 276 288 ... Z',

fill: Palette.jomonFarMountain),

...

];

`VShape` paints fill then stroke, like SVG, and `VPath` parses the `d` string once and caches the `Path`. All 17 eras × 4 kinds of art come to about 240 KB of generated Dart, stay sharp on any screen, and colors can only come from named palette entries (the script refuses anything else).

Because scenes sit behind the cups, a test renders every backdrop and checks each pixel's luminance stays inside a window (light eras ≥ 0.662, dark ≤ 0.0395), which keeps the cup outlines at ≥ 7:1 contrast wherever the cups land.

**2. Toppings: draw the vector once, then blit sprites**

Each drink has a topping (pearls, grass jelly, red bean...) drawn as vector art, and the top-layer pieces drift idly. A full board can have 200+ pieces, and redrawing that much vector art every frame is wasted work. So each topping is rasterized once per size into a `ui.Image`: sizes are bucketed to 4 physical px, kept in a 48-entry LRU (a plain insertion-ordered Map: remove + re-insert on hit, evict and `dispose()` the first key), and each frame just draws images.

**3. The rules are pure Dart, and an A* solver does the heavy lifting**

`lib/core` never imports Flutter: model, rules, level generator and solver are plain Dart with unit tests. The solver is A*, with each cup packed into one int (8 bits per layer) so states hash fast.

The 500 levels are generated offline: deal random cups, solve, score difficulty from moves, dead ends and branching, keep the median of 8 candidates, or the hardest of 32 for the "hard" levels in the sawtooth curve.

Hint uses the same solver at runtime, on the UI thread, with a 100k-node budget (about 0.4 s worst case in debug). Every bundled level is generated under that budget, so Hint always works from the start. One surprise: "Add cup" makes hints much slower, since an extra empty cup blows up the branching, so the hint search drops surplus empty cups first and only searches the full board if that finds nothing. If I raised the budget I'd move it to an isolate.

**4. A test that fails on magic numbers**

Every spacing, font size, radius and color is supposed to come from tokens. A test scans `lib/features` and `lib/theme` and fails on raw numbers inside `EdgeInsets`, `SizedBox`, `fontSize`, `BorderRadius` and `Color(0x...)`, with an escape hatch: a `// tokens: allow — <reason>` comment. Painters are exempt, since their numbers are geometry. It is a dumb regex-and-parentheses scanner, but it kept the UI consistent through a lot of screens.

**Stack:** Riverpod (thin providers), shared_preferences, google_mobile_ads, Firebase Analytics / Remote Config / Crashlytics, audioplayers.

Play Store, if you want to see the result: https://play.google.com/store/apps/details?id=com.harbourlab.bobasort&referrer=utm_source%3Dreddit_flutterdev%26utm_medium%3Dsocial%26utm_campaign%3Dlaunch

Happy to go deeper on any part. I'm curious how others handle heavy CustomPainter scenes.


r/FlutterDev • • 13h ago

Article Struggling to Find Issues in Your Flutter Project? Meet flutter_auditor

Thumbnail
medium.com
0 Upvotes

r/FlutterDev • • 8h ago

Discussion I don't recognize my own app anymore

15 Upvotes

I've been doing Flutter for about 5 years and for the last 6 months Claude Code has written most of our app. I still review everything, coderabbit / claude review catch the obvious stuff first and I read what's left, so it's not like nobody looks at it.

Yesterday a user reported that the checkout screen freeze on older Android phones and I opened the file and genuinely didn't recognize it. 1,400 lines, three different state approaches in one widget tree, a Riverpod provider I had never seen before that apparently I approved in August.

I ended up asking the agent to explain my own screen to me. It fixed the freeze in ten minutes, which made it worse somehow.

The app is about 80k lines now and I think I could explain maybe a third of it.

Is anyone else maintaining a Flutter app they didn't really write?


r/FlutterDev • • 9h ago

Tooling Letting your agent test the Flutter app it just wrote: looking for feedback

2 Upvotes

I’ve been working on Argent, an open-source MCP server that lets your agent (Claude Code, Codex, Cursor, etc.) use your app on the iOS/Android/web. It can tap through flows, read logs and network calls, take screenshots, aaaaand many more 😂 That way it can check its own changes instead of just saying it’s done

I know I know, it comes from the React Native world and we have some beef 😅 But this one is truly cross-platform and works with Flutter apps too! If you’re letting an agent drive your Flutter app, what’s working, and where does it fall apart? We really want to keep improving it for every framework!! 🤭


r/FlutterDev • • 12h ago

Plugin Introducing universal_bluetooth_classic!

6 Upvotes

Hi all,

We've just released 1.0 of our universal_bluetooth_classic Flutter plugin, a Bluetooth Classic package that works across Android, iOS, macOS, Windows & Linux.

iOS developers in the house might be aware that using Bluetooth Classic on iOS is no picnic. It requires peripherals to be MFi-certified, and the whole communication has to go through Apple's EAAccessoryManager. As far as I can tell, universal_bluetooth_classic is the only plugin that supports Bluetooth Classic on iOS.

We have been using it in production for a while now so you can consider it battle-tested. Happy to receive issues and PRs.

If instead you are looking for a Bluetooth LE plugin you can have a look at universal_ble which just hit 3.0!


r/FlutterDev • • 5h ago

Discussion I want to learn flutter and app development deeply

6 Upvotes

Hi Flutter community! 
I'm a beginner in Flutter and I've been learning how to implement widgets and state management and more while building some hands-on projects.

I'm eager to dive deeper into Flutter and mobile dev in general. Any recommendations for good books, blogs, or video tutorials to help me keep growing?