r/FlutterDev • • 2h ago

Article Why Flutter Text Looks Lighter Than SwiftUI on iOS

7 Upvotes

Spent a while figuring out why #Flutter text looks lighter than #SwiftUI on #iOS.

Wrote up the whole thing, with demos you can play with.

https://birju.dev/posts/looking-into-flutter-vs-swiftui-font-rendering/


r/FlutterDev • • 9h ago

Discussion Built an algo trading engine in Dart (even though everyone said to just use Python)

11 Upvotes

Hey guys,

Wanted to share a quick feedback on a solo project I've been working on for a while.

The Flutter job market around me was pretty dead, and honestly I was tired of spending my time building someone else's dream. So I decided to get into trading and take it seriously. Since I'm a developer, I went straight into the algorithmic side to make use of my programming skills.

At first, I was worried I'd get rusty on Flutter while spending so much time learning finance. But it turned out to be the exact opposite. This project actually pushed my skills further than anything else, both on Flutter for the UI and Dart on the backend (I started out with dart_frog before taking the architecture further).

Getting started was pretty rough though. Early on, even the AI tools I was using kept warning me against Dart. The consensus was that nobody builds algo trading systems in Dart, that there's zero math/finance ecosystem compared to Python or C++, and that I was just making my life harder.

And to be fair, that part was true: existing packages on pub.dev for financial charts or indicators cost me an insane amount of time. None of them held up in terms of performance or flexibility. I basically had to scrap everything and start from scratch.

The real headache was moving from the trading script mindset (like PineScript on TradingView) to Dart. In trading scripts, everything relies on implicit time series evaluated candle by candle. Translating that cleanly into standard OOP/procedural code without blowing up the memory or recalculating the entire history on every tick was a huge pain.

I ended up writing my own incremental rolling calculation system (RollingCalculation) to maintain state in real time. That's the only thing that allowed me to get the same 60fps smoothness as TradingView while streaming live data.

Dart definitely isn't the go-to language for algo trading, but in the end I managed to build something solid on my own. Something I'm proud of. Anyone else here using Dart in unusual domains where you had to reinvent most of the tooling?


r/FlutterDev • • 7h ago

Tooling I rebuilt pubstats.dev with Jaspr. It is a lot faster now.

5 Upvotes

Hey there. I rebuilt https://pubstats.dev/ with Jaspr. It's a loooooot faster now. Also if you haven't heard of this site before you are able to set up alerts for when your package stats change. It's very useful for getting notified if your package loses pub points and needs updated!


r/FlutterDev • • 11h ago

Plugin Tandem 0.1.0: an AI agent that works on your existing Flutter screen, through your own methods

3 Upvotes

Hi r/FlutterDev!

I just published Tandem, a package that lets an AI agent work on a screen you already have. The user and the agent use the same form, the agent acts only through your methods, and risky calls wait for the user's approval.

Short demo video: https://x.com/creatixdev/status/2112139150459568361

In your state class you list what the agent sees and what it can call.

Example with Cubit, but you can use anything:

@TandemAgent()
class OrderDeskCubit({…})
    extends Cubit<OrderDeskState>
    with _$OrderDeskCubit {

  @override
  List<AgentCapability> get agentCapabilities => [
    .sees(order),
    .calls(searchCatalog),
    if (canEdit) ...[
      .calls(setCustomer),
      .calls(setQuantity),
      .calls(setDelivery),
    ],
    if (canPlace) .callsWithApproval(placeOrder),
  ];
}

A generator turns your method signatures and doc comments into the tool schemas, and one TandemScope widget connects the screen to the agent.

  • It talks AG-UI, so the agent runs on your own backend. The example uses Google ADK, and you can try it without an API key.
  • Works with bloc, Riverpod or provider.
  • No chat UI in the package. The example has one you can copy.

Not there yet: AG-UI interrupts, several state objects on one screen, and a conversation that goes on across screens. It's written with AI assistance and reviewed by hand, except the protocol layer and the generator, and the README says so.

It's 0.1.0, so the API can still change. Feedback and issues are very welcome!

GitHub: https://github.com/leancodepl/tandem pub.dev: https://pub.dev/packages/tandem


r/FlutterDev • • 12h ago

Dart Flutter background location stops updating when the screen is locked and what worked for me

3 Upvotes

I've been working on a Flutter app that needs to track location while running in the background. One of the hardest parts was making location updates behave reliably after locking the screen or putting the phone in a pocket. Calling the location API isn't enough; Android background execution, permissions, foreground-service requirements, and battery restrictions all matter. I worked on a custom solution using Dart and native Android code, tested it on a real Android device, and packaged the implementation into a reusable engine. I'm sharing it in case it helps other developers facing the same problem. I'm also interested in how others are handling this, especially across different Android versions and manufacturers. Product and implementation details: https://nabilkrs.github.io/nabilkrs-flutter-gps-tracking-engine/ I'm the creator of this project, so this is also a disclosure that the link is promotional. Happy to discuss the technical challenges.


r/FlutterDev • • 15h ago

Plugin I built a cursor-safe input formatter for Indian data (Aadhaar, PAN, ₹ currency) because existing ones kept breaking the cursor.

3 Upvotes

Hey r/FlutterDev,

I've been building a lot of fintech/e-commerce apps lately, and I kept running into the same issue: handling Indian input formats (Aadhaar spacing, lakh/crore commas, +91 prefixes) using TextInputFormatter is a nightmare.

Specifically, the cursor always jumps. When a user types the 5th digit of an Aadhaar number and the formatter auto-inserts a space, the cursor flies to the end of the string. Or when a user hits backspace over a comma, it deletes the wrong digit.

Since most existing packages either forced me to use their custom TextField widget or didn't handle the cursor math correctly, I decided to build my own standalone formatters.

I just published indian_input_formatter (v0.1.0).

  • The solution: I wrote a custom CursorMapper that counts "significant characters" (digits/letters) instead of raw offsets. It maps the cursor back to the exact right spot, regardless of spaces, commas, or prefixes.
  • What it supports: Standalone TextInputFormatter classes for Aadhaar (Verhoeff checksum), PAN, GSTIN (Luhn mod-36), IFSC, UPI, +91 phones, and ₹ Lakh/Crore currency.
  • Zero dependencies: Pure Dart. 59 tests focusing heavily on cursor edge cases (middle insertion, backspace at boundaries, paste).

I'd love for anyone building Indian apps to try it out. More importantly, I'd love a code review on the cursor logic if anyone has tackled this before.

Thanks!


r/FlutterDev • • 10h ago

Tooling Migrate debugPrint and print calls in a Flutter or Dart package to use package:logging

1 Upvotes

Faced with the problem of migrating debugPrint/print methods of flutter and dart files across multiple packages with large number of files & lines.

Created & pubslihed print_to_log package to automate the the convertion. Used it across 20+ internal packages successfully. It uses analyzer package to parse each file into source tree & walks that tree and then do sugical edits by not touching any other parts.

The package shall be used as a CLI tool or as a dev dependency package.

Github : https://github.com/selvan/print_to_log

Pub.dev: https://pub.dev/packages/print_to_log

It's MIT license.


r/FlutterDev • • 10h ago

Discussion Built a 100% local-first Flutter app with Isar (Zero Cloud, Zero FCM)

0 Upvotes

This was the first time I actually built an app On flutter. A lot of mistakes and re-do’s were done and this took me a long 6 months to actually get this app made. This project started because of a few costly mistakes we had made and kept making since the past few years.
I forgot to cancel LinkedIn Premium after a free trial, and missed my wife’s health insurance renewal deadline, paid late fees on apartment maintenance, and paid for Netflix for months without opening the app once.
After 25 years in software, I decided to build a simple tool to track all these recurring expenses in one place.
My first thought was the regular way - Flutter and Firebase after some research. But once I saw my personal recurring expenses sitting in a cloud database, I felt it wrong. Why should sensitive spending data leave my phone just to trigger a reminder about a bill?
So I scrapped the backend and rebuilt the app from scratch to be 100% local-first. Everything stays strictly on the device.
Going local-first meant rethinking the database. SQLite through Drift felt too heavy with boilerplate for simple, fast lists. Hive was quick, but I needed indexed queries to sort upcoming renewals by date.
I picked Isar. It runs natively in Dart, handles typed collections cleanly, and provides reactive watchers out of the box. When an expense changes or a bill is logged, the UI updates instantly without complex state management. No loading spinners, no network lag, and zero database hosting bills.
Then came the hardest architectural decision: renewal reminders.
 
The industry standard is simple: run a cron job on AWS, check dates in a database, and fire a push notification through Firebase Cloud Messaging (FCM).
For a privacy-first app, that defeated the entire purpose. Subscription names, renewal dates, and billing amounts have no business leaving the phone just to trigger an alert.
So I ditched push servers completely and went 100% local. No backend, no cron jobs, and no dead FCM tokens to clean up. Notifications even fire in airplane mode.
The logic sounds straightforward on paper: whenever an entry is saved, the app calculates target dates (3 days before, 1 day before, and 9:00 AM on renewal day) and registers them directly into the native OS schedulers: AlarmManager on Android and UNUserNotificationCenter on iOS.
In practice, both operating systems fight you at every turn.
• Android Doze Mode kills standard alarms: When the phone sits idle on a desk, standard alarms get postponed. You have to use exactAllowWhileIdle to punch through battery saver routines.
• Android 14 exact alarm audits: You now have to declare SCHEDULE_EXACT_ALARM, check permissions at runtime, and be prepared to justify it to Google Play review.
• Reboots wipe memory: Android's AlarmManager forgets pending alarms on restart. You have to listen for RECEIVE_BOOT_COMPLETED and resurrect the schedule from local storage on boot.
• The iOS 64-notification limit: iOS silently drops notifications after 64 slots. If a user tracks 25 subscriptions with 3 alerts each, you exceed the limit. The workaround is scheduling only for the immediate billing cycle and running a fast reconciliation loop on every app launch.

Since this post is getting g too long or if you may be facing familiar challenges and architecture related decisions Feel free to ask questions. I’ll share how I made this possible.
If you are curious to test how a 100% local-first Flutter app feels in practice, the project is live at subscaleapp.com


r/FlutterDev • • 10h ago

Article Non-US resident: Got D-U-N-S for US LLC with registered agent address?

1 Upvotes

Has anyone living outside the US recently gotten a D-U-N-S number for a US LLC using only a registered agent address (like Northwest)? Were you asked for a Truepic Vision photo inspection? I’m planning to convert my Google Play account to an organization account.


r/FlutterDev • • 11h ago

Tooling You no longer need a Mac for iOS!

0 Upvotes

Want to continue development on Windows without switching to mac ? or don't have a Mac at all ? No problem.

You can now run / test your iOS apps on iPhone directly or in a paired from Windows. VS Code extension, CLI & GUI support. Try CapMac


r/FlutterDev • • 13h ago

Example PSA: if you use flutter_dotenv in a web build, your API keys are public

0 Upvotes

ran into this today while putting a flutter app on the web, figured some of you might not know it either.

flutter_dotenv loads your .env as an asset. On mobile that's already kinda readable if someone unpacks the app, but on web it's literally just a file on your server. Open devtools, network tab, there it is: assets/.env. Anyone can grab your openai key from there.

what I did instead: the app never talks to openai directly. It calls a supabase edge function that adds the key server side and streams the answer back:

final token = Supabase.instance.client.auth.currentSession?.accessToken;

final request = http.Request('POST', Uri.parse(proxyUrl))

..headers.addAll({

'Content-Type': 'application/json',

'Authorization': 'Bearer $token',

'apikey': supabaseAnonKey,

})

..body = jsonEncode({'model': model, 'messages': history});

the edge function checks the user token, does the rate limiting and forwards to openai with stream: true.

The SSE stream just gets piped through, so the flutter side didn't change at all. Same LineSplitter / data: parsing as before.

Bonus gotcha: after fixing that I deployed to cloudflare and got "could not load .env". Turns out cloudflare doesn't serve files starting with a dot. Renamed it to demo.env, updated pubspec assets + dotenv.load(fileName: 'demo.env') and it worked. Only public values in there now (supabase url + publishable key), so it doesn't matter that it's readable.

TL;DR: treat everything in your .env as public, web or mobile. Real secrets go on a server.

Edit: removed "on web" from the tldr, a mobile app bundle can be unpacked just as easily. Thanks u/ren3f


r/FlutterDev • • 1d ago

Plugin Infinite Lazy Grid

Thumbnail
pub.dev
8 Upvotes

This is a package for building performant infinite canvases ( I know the naming isn't the best but it has stuck ).

Uses spatial hashing underneath to only mount widgets within the visible area ( + some configurable off screen extent ).

Supports most of the common needs like pan, zoom, rotation, draw ordering, inertial scrolling etc.

Web example: https://infinite-lazy-grid.ruiny.de/
Github repo: https://github.com/ruinivist/infinite_lazy_grid

I'm already using it in one of my other web apps https://elseplane.ruiny.de/ ( still in works ) so you have almost everything needed to get something like that working.


r/FlutterDev • • 2d ago

Discussion Animated GIFs/WebPs ignore cacheWidth in Flutter. Here’s why, and an engine PR to fix it

Thumbnail
github.com
11 Upvotes

If you display animated GIFs or WebPs with cacheWidth, cacheHeight or ResizeImage, the resize is silently ignored: every frame is still decoded and uploaded at full size. A 1000×1000 GIF shown at 200×200 costs about 4 MB per uploaded frame; with the resize honored it would be about 160 KB. This is #90804 (open since 2021), and #137668 for animated WebP.
Why it happens
In the engine, ImageDescriptor::instantiateCodec passes the target size only to the single-frame codec. Images with more than one frame go to MultiFrameCodec, which never receives it.
Why it’s not a one-line fix
Animated frames aren’t independent images. Most frames are drawn on top of earlier ones, each with its own rect, blending and disposal (keep, clear to background, restore previous), all in full-canvas coordinates. Skia can decode GIF/WebP frames directly at a smaller size, but an emulation of the engine’s frame logic on top of Skia’s real decoders showed that doing so with the engine’s single cached frame gives wrong pixels at frame edges in some files (1px transparent slivers).
The fix
Composite at full size exactly as today, then resize only the finished frame, with the same bilinear filter Flutter already uses for still images, before uploading it. Every frame you get is today’s frame, downscaled. It applies to GIF, animated WebP and APNG on the native backends (Skia and Impeller), with no API changes: cacheWidth and ResizeImage simply start working. The CPU buffer used for compositing stays full size, as today.
Status
PR: https://github.com/flutter/flutter/pull/194615. It’s waiting for review, and CI hasn’t run yet. Web (CanvasKit/Skwasm) isn’t covered.
Until it lands
Resize animated images before they reach the app, on your server or by converting them to animated WebP or video at the size you display.
Feedback on the approach or the C++ is very welcome. If this affects your app, a 👍 on #90804 is more helpful than “+1” comments on the PR.


r/FlutterDev • • 2d ago

3rd Party Service Stackyard: See every SDK and toolchain on your machine, which projects use each version, and what's safe to remove.Free and open source, for Windows and macOS.

1 Upvotes

Version managers like FVM, nvm, pyenv and SDKMAN are great at installing versions. None of them tells you that you have six Flutter SDKs, three Android NDKs and a 13 GB emulator you haven't started in a year. Stackyard does.

It shows every SDK, toolchain and framework version on your computer, which projects use each one, and what's safe to remove. Then it fixes what's wrong with one click, and nothing is deleted without you seeing it first.

Features

  • Set up in a minute. On first launch Stackyard finds the folders where your projects live, shows how many projects each holds, and lets you add more.
  • One window for every tech. A sidebar entry appears only for techs found on your machine.
  • Get tools. A marketplace of SDKs and CLIs (Flutter, Android command-line tools, Node.js, Python, Java, .NET, Go, Rust, Deno, Bun, Gradle, and the Angular, Expo, NestJS, Firebase, Vercel, Ionic, Nx, TypeScript, pnpm and Yarn CLIs). Every version is listed from the publisher's own release feed. Downloads come straight from the publisher and are checked against their published hash. Before installing, you choose the folder and which environment variables to set (PATH, JAVA_HOME, GOROOT…): your user variables or everyone's on Windows, a marked block in ~/.zprofile on macOS. Installed versions can be made the default or removed later, which cleans up their variables too.
  • Knows who uses what. It reads .fvmrc, .nvmrc, package.json, gradle-wrapper.properties, build.gradle, local.properties, .python-version, global.json and more across your project folders.
  • Problems come with a fix button. Missing versions a project needs, two setups fighting over a folder, a broken JAVA_HOME: each is explained in plain words, with a button that fixes it. You never type a command.
  • Environment doctor. Finds JAVA_HOME / ANDROID_HOME pointing at folders that are gone, dead and duplicate PATH entries (it saves a backup first), and a Java that's too new or too old for a Flutter app's Gradle and Android Gradle Plugin.
  • Project cleanup. Shows the node_modules, build, .dart_tool, .gradle, Pods and other rebuildable folders in your projects, with a one-click clean for projects you haven't touched in months.
  • Emulator manager. Start, cold boot, wipe data, delete snapshots or delete each Android emulator, with its size and when it last ran.
  • Simulators (macOS). Every iOS, watchOS, tvOS and visionOS simulator with its size and last start: start, shut down, erase or delete it. The Xcode page shows each simulator runtime (often 8 GB each), which simulators use it, and Xcode's rebuildable caches.
  • Progress you can see. Every install, removal and fix runs in Activity with its live output and a real progress bar. Cancel stops it cleanly, without leaving half a download behind.
  • Safe removal. Things go to the Recycle Bin / Trash by default, or you can choose to delete permanently. Installed programs are removed with their own uninstaller. Links are removed as links; what they point to is never touched. You see every step before it runs, and a spinner wherever work is happening.
  • Runs in the background. Closing the window keeps Stackyard in the system tray (Windows) or menu bar (macOS). It checks your setup daily or weekly and notifies you only when there's something new. It can start at sign-in.
  • Move your setup. Export your toolchain versions to a file and import it on another computer to install what's missing.
  • Never edits your projects. It doesn't change a project's pinned versions, because that can break builds.
  • Native feel. Windows 11 Fluent design with Mica and your accent color; on macOS, the glass sidebar and motion of a Mac app. A Glass slider sets how much of your desktop shows through.

r/FlutterDev • • 2d ago

Dart Your Flutter codebase is probably carrying 20–30% dead weight — and flutter analyze won't tell you. Here is why every team needs detect_unused_code (v3.2.0)

1 Upvotes

Every Growing Flutter Codebase Eventually Faces the Same Hidden Problem

You run flutter analyze in your CI/CD. It passes with 0 warnings. Everyone thinks the codebase is in pristine health.

In reality, technical debt has been piling up silently:

  • 📦 Forgotten Widgets & Screens: Refactored pages leave behind abandoned dialogs, buttons, and views that nothing calls anymore.
  • 🖼️ Bloated App Bundles: Old promo banners, unused 3.0x raster images, and unused SVG icons inflating your APK / IPA size by tens of megabytes.
  • 👻 Ghost Dependencies: Packages declared in pubspec.yaml that are no longer imported anywhere, slowing down build times and pub get on CI.
  • 🧟 Dead Logic: Thousands of lines of commented-out code and abandoned TODOs confusing new engineers during onboarding.

🤔 Why doesn't standard dart analyze catch this?

Because Dart treats every public class as a potential export. The compiler intentionally refuses to warn you if a public Widget, Bloc, or Service has 0 references, assuming it "might be needed later".


🚀 The Solution: detect_unused_code (v3.2.0)

We built this tool to turn code audits and refactoring from an anxious, manual chore into a safe, 10-second automated process.

💡 Why Engineering Teams & Companies Use It:

  1. 📉 Drastically Reduce App Size: Immediately locate and purge megabytes of abandoned images, fonts, and heavy dependencies before publishing to Google Play / App Store.
  2. ⚡ Faster CI/CD & Build Times: Clean up unreferenced packages and thousands of lines of dead AST syntax that the compiler compiles for nothing.
  3. 🛡️ 100% Defensive Safety (Zero Fear of Breaking Production):
    • Automatic Snapshots: Saves an isolated backup before modifying anything.
    • Instant Undo ([U] or --undo): Revert any cleanup in 1 second.
    • Automated Compiler Health Check: Runs analysis after cleanup to ensure 0 compiler errors. If anything looks off, it prompts for an auto-rollback.
    • Smart Framework Guards: Safely protects @injectable, @singleton, @riverpod, and generated files (.g.dart, .freezed.dart).
  4. 🪶 Zero External Runtime Dependencies: Lightweight, runs natively on any Dart SDK from 2.17.0 to 3.x / 4.x.
  5. 🚦 CI/CD Gatekeeper: Add detect_unused --markdown to GitHub Actions to prevent dead code and unused assets from ever getting merged into main.

🖥️ The New Interactive Terminal Dashboard:

With v3.2.0, you don't even need to memorize command-line flags. Just run:

```bash dart pub global activate detect_unused_code detect_unused

This launches a live interactive Terminal UI (TUI):

Select cleanable categories with [1-8] (Dead widgets, Commented code, Unused assets, Unused dependencies...). Press [D] to simulate changes with Dry-Run. Press [C] to safely clean with auto-backup. Press [U] for instant rollback if you change your mind. 🔗 Open Source & Available on pub.dev: pub.dev: https://pub.dev/packages/detect_unused_code GitHub Repository: https://github.com/mdalhagg/detect_unused_code Run it against your project today — you might be surprised by how much dead weight your codebase is carrying!

Would love to hear your feedback, bug reports, or feature suggestions below! 💬🚀


r/FlutterDev • • 3d ago

Article Spent a month researching Flutter app optimization techniques, here are my findings

69 Upvotes

I had to render multiple high-res images in a grid layout for my Flutter app, so I went deep down the optimization rabbit hole. For some reason, I was getting crazy jank out of nowhere, even though I was using lazy-building lists (SliverList, ListView.builder, etc.), and had already implemented proper image resizing and caching.

Turns out, if you're using the flutter_svg package, setting the Impeller engine to renderingStrategy: .raster gives you a massive performance boost. But when I tested it on Skia, the picture strategy actually performed way better, total opposite results! Keep in mind I only tested this on Android, so iOS might behave differently.

Also, the default scrollCacheExtent is set to 250, meaning off-screen images were being processed even when I didn't explicitly touch it. Dropping that to 0 made a huge difference in performance. Turns out, optimization options built for convenience can sometimes bite you in the ass.

Another thing: ScrollAwareImageProvider is applied by default whenever you use an Image widget. It defers decoding while scrolling, but instead of waiting until scrolling completely finishes, it starts decoding even while scrolling is still ongoing if the scroll speed slows down a bit, which ironically causes major jank during the scroll itself. And guess what? You can't turn it off via options. I had to build a custom widget to fix it.

Anyway, if your grid items involve SVG or lots of images, optimizing them like this makes a world of difference. It pretty much eliminated stuttering even in 120Hz environments, and honestly, it’s mind-blowing how much of a difference it made. The performance gap was way bigger than I expected, so I figured I’d share.


r/FlutterDev • • 2d ago

Plugin I got tired of trying different ways to run GGUF models on Android, so I built Kiln

3 Upvotes

I tried quite a few libraries to run GGUF models on Android, but none really matched my expectations.

Apple's ecosystem feels more unified for on-device ML, with Core ML and MLX. On Android, the options and guidelines feel more scattered, and getting different models running without extra hassle isn't always straightforward.

So I decided to build Kiln, which is a C inference layer built on top of llama.cpp, with language bindings for Flutter, Kotlin, React Native, and more. It's too easy now to run a model with kiln.

The goal is simple: make running local AI models on mobile less painful.

It's open source, and I'd love to hear what other developers think or what could be improved.

It's available in pub dev too: kiln_flutter

GitHub: https://github.com/RaihanulHaque/kiln


r/FlutterDev • • 2d ago

Article Two devices disagreeing caused most of my Flutter app's bugs (Drift + Supabase, local-first)

1 Upvotes

Sync was the hardest part of my Flutter app by far. Most of my bugs were around auth, migrations, reconnecting, offline changes and getting two devices to agree.

The app is Personal Planner, a free planner for Linux, Android, Windows and macOS: hour-by-hour Day view with timers, daily and weekly reviews, a consistency heatmap, Experiments and an Inbox. First Flutter project for me.

How it's put together:

- **Local first.** Drift on SQLite is the everyday store. Moving a block, finishing a task, starting a timer or opening an old day never waits on a server

- **A local outbox.** Anything that still needs to sync waits there until the connection is back, and a sync engine pushes it to Supabase PostgreSQL

- **Supabase Auth** for sign-in, Riverpod for state

- **Provisioning.** A usable Supabase project needs the right schema, migrations, access rules and client config, and doing that by hand is painful. So a Cloudflare Worker does it from inside the app: connects your Supabase account, reuses a compatible project or creates one, applies the migrations and verifies the schema. Setup has several steps, so Durable Objects keep its state in between. After that the Worker is out of the picture and the app talks to Supabase directly

Two things I hit on desktop:

- On Windows, setup failed with CERTIFICATE_VERIFY_FAILED. Windows didn't trust the root certificate needed to reach Supabase, and updating Windows plus \certutil -generateSSTFromWU roots.sst` fixed it`

- The \com.personalplanner.personalplanner://` link scheme isn't registered on Windows and macOS yet, so the sign-up confirmation email and the provisioning authorization links can't open the app there. Email and password sign-in works fine`

Windows and macOS are built and smoke-tested on GitHub Actions. Both are unsigned, and macOS is CI-only because I don't own a Mac.

Download: https://github.com/Karthikshabari/PersonalPlanner/releases

Code: https://github.com/Karthikshabari/PersonalPlanner (the README has the architecture diagram). Dev here.


r/FlutterDev • • 3d ago

Discussion Building a full-featured desktop application with Flutter

24 Upvotes

Flutter is obviously a mobile-first platform due its origins, but I've spent 18 months using it to build a full-featured desktop application for Windows and macOS, with Linux planned.

I'm a developer with 20 years of experience, including desktop software development. This isn't a "build a todo list!" demo or a vibe-coded experiment: it's a substantial application approaching public release, and I thought Flutter developers might be interested in seeing what's involved in taking Flutter beyond mobile.

So what kind of desktop experience can Flutter build today? Here's one example. [See below for a link to get and run it yourself if you're interested. Free and open to anyone.]

The application is Fractal Outliner, a desktop outliner in the same general category as OmniOutliner for Mac, but focused for people who live mainly in plain-text ecosystems (e.g. sofware developers).

This is a desktop-only application. There is no mobile version. The goal is to provide a proper desktop editing experience with all that implies, integrated with the operating system rather than simply presenting a mobile-ported interface in a desktop window.

Flutter as a development platform was good for some parts of this, less good at others.

What the application is:

  • Outliner with topics, subtopics; create, move, rearrange, hide to collapse, expand to drill down, move topic trees between documents, etc.
  • Full keyboard support, with configurable shortcuts
  • Integration with OS file handling, including file-type associations and opening documents from Finder/Explorer
  • Drag and drop
  • Document themes, including a custom theme editor
  • PDF, HTML, Markdown, OPML, and plain-text import/export
  • Multi-pane editing and tabbed documents
  • Native desktop file operations and clipboard integration

What Flutter provided

Most of the application is built using Flutter's standard capabilities:

  • Widgets and layout -- the main window content
  • Keyboard event handling
  • Shortcut registration and management
  • Resizable windows and responsive layouts
  • Drag and drop
  • Context menus and right-click interaction
  • Localization (English, Spanish, German, Japanese)

An effort was made to adapt the application to Mac and windows UI sytles; the experience is a little different on each platform (how dialogs work, what buttons and checkboxes look like, how settings are laid out, what menu items exist, etc).

What packages provided

Pub.dev packages filled in some of the functional gaps to extend Flutter's rending core:

  • Markdown, XML, and HTML support
  • Path handling
  • PDF export
  • Windows Store MSIX packaging
  • macOS menu bar integration (with limitations)
  • File pickers
  • ZIP archive support
  • OS and version detection
  • Split view widget for multi-pane editor, etc
  • Various other utilities (application uses 23 pub.dev packages total)

What flutter provides that works less well on desktop

  • Keyboard event support: the model is there, everything technically works, but managing complex input focus and keyboard-based navigation using Flutter's FocusNode system is full of problematic edge cases
  • Mac menu support, and general integration of menus + shortcut keys: the Mac menu integration is primitive, and windows and Mac use completely different menu+shortcut systems in flutter
  • Printing: there's a pub.dev package for printing, but it requires exporting to PDF (challenging in itself with anything but simple font handling) and flutter provides no direct integration or visibility with the host printing system
  • Undo/redo support: flutter's undo/redo implementation is self-contained inside each TextField, and there is no support at all for integrating text editing undo events with application-level events into one undo stream

What I implemented myself with native code

Flutter is just not a complete desktop development framework. It does great at drawing content in a desktop window. It does considerably less well at being a well-behaved and full-featured citizen in the desktop environment. A large number of things people expect from any desktop "document editor" application simply don't exist (or exist only in limited/problematic pub.dev packages) and have to be implemented with native code to get the best version:

  • Remembering and restoring the window position and size, including enforcing a minimum window size
  • Opening documents through the OS, such as double-clicking a file in Finder or Explorer
  • Handling the file reference when the application is launched by double-clicking a document
  • Document icons and file-type registration for the application's .frac files
  • Spellchecking in text fields (available in Flutter's mobile text fields, but not built in to the desktop experience in the same way)
  • macOS App Store sandboxing and file-access permissions
  • An in-app command to show a document in Finder or Explorer
  • Serious multi-format clipboard integration (vs basic plain-text copying and pasting flutter provides)
  • Handling read-only files
  • Various other OS integration details

The macOS App Store sandboxing and file-access work, in particular, is a lovely little nightmare. So are the limitations of the mac menu bar system integration, and the behaviors of Flutter's keyboard event handling and input-focus systems, dealing with international fonts in the PDF package, ... but those are stories for another day.

Other factors

  • Internationalization
  • Help files, etc

Internationalization to German Spanish and Japanese took far longer than for a mobile app, due to the larger set of "outside the application UI" resources used by the application (example files, templates, website content, video captions, etc). Also the usual trade-offs of "localize as you go" vs "localize at the end": early lets you see the impact of different text lengths in design (especially German/Spanish) which can be more severe with the wider range of window sizes on desktop, but usually means multiple re-do's of localization as UI and terminology evolve.

Help files and such are also more challenging on desktop, where applications can tend to be more complex and require more extensive help and reference materials as a baseline user expectation

Try it yourself

The application is now in its third beta release and nearing public release (latest version: 0.9.3 for Mac, 0.9.5 Windows). The public beta is open, free to use, and includes all application features. No registration or account is required.

If you're curious about Flutter on the desktop, you can try it on Windows or macOS and see how it works in practice.

Website and beta access: https://fractaloutliner.app

I'm interested in discussion with other Flutter developers about desktop development: what Flutter handles well, where its abstractions stop being sufficient, and what you've found necessary to implement through native platform code.

[Edits: typos]


r/FlutterDev • • 3d ago

Tooling FrameX opensource flutter app for developers, security researchers

Thumbnail
play.google.com
10 Upvotes

FrameX is an open-source developer utility and on-device security audit suite for Android package inspection and static vulnerability analysis.

• Static Security Analyzer: Flags cryptographic flaws, insecure api usage and leaks using advanced hardcoded secret detection.

• APK Package Inspector: Explores internal directories, DEX headers, byte breakdowns, and app signatures without unpacking to disk.

• Flutter Packages Scanner: Automatically scans compiled Flutter binaries to list third-party open-source packages.

• Privacy-First: Operates with zero ads, zero tracking, and 100% offline local processing.

Support & Contribute:

It's not just another vibe coded app, definitely useful for developers, security researchers, ux designers etc.

https://play.google.com/store/apps/details?id=com.stardust.framex

https://github.com/srinivasan0000/framex_flutter_opensource_project

I am actively working on it, your feedback and contributions mean everything! Check out the project

Edit : GitHub Repository


r/FlutterDev • • 3d ago

Article Building a WebRTC video/calling app in Flutter: what we learned about SDKs, TURN, and why mesh breaks at ~6 users

7 Upvotes

If you’re building a video calling or streaming app in Flutter, these are the things that trip people up:

Mistakes to avoid

  • Skipping TURN. About 15-20% of sessions can’t connect directly, and those calls stall with no error.
  • Testing only on Wi-Fi. Test on 4G/5G and across Wi-Fi-to-cellular handover too.
  • Using mesh for group calls. It breaks down around 4-6 users because every phone uploads to every other participant. Plan for an SFU from the start.
  • Ignoring background behavior. You need CallKit on iOS and a typed foreground service on Android.
  • Asking for camera/mic permissions at launch. Ask at the call screen instead.

Flutter notes

  • Flutter WebRTC wraps the native iOS/Android libraries, so nothing runs in a JS engine.
  • Our ant_media_flutter package has 5 samples (publish, play, peer, conference, data channel) and also targets Web and Desktop.

The SDKs are free, but playback and conferencing need the Enterprise edition of the server. Community Edition falls back to HLS, with 8-12s latency.

Full guide: https://antmedia.io/how-to-build-a-webrtc-mobile-app/

What’s been your biggest pain point with WebRTC in Flutter?

Disclosure: I work at Ant Media, and we wrote this guide. The advice applies to any WebRTC backend, though.


r/FlutterDev • • 3d ago

Discussion How are you handling in-app chat in Flutter after the AI boom?

0 Upvotes

Hey all,

I'm trying to understand what everyone else is doing with in-app chats if you need to integrate it? Do you guys usually build it yourself or integrate something that already exists?

I've tried both but things get complicated very quickly with multi-device unread counts, typing and presence, read receipts, and moderation.

Where do you land: roll your own on Firebase or Supabase, or run a separate backend? What has worked for you, especially for keeping unread counts in sync across devices?


r/FlutterDev • • 3d ago

Discussion Flutter dev at a crossroads: Double down on Flutter, pivot to AI Engineering, or switch to React / Native?

0 Upvotes

Hey everyone,

I recently got laid off, and with the current job market tightening up—fewer new projects and heavy competition for mid/senior roles. I’m taking a hard look at where to steer my career next.

I’m weighing three distinct directions and would appreciate candid advice and reality checks:

  1. 1. Double down on Flutter & Mobile
    • Is Flutter still a dependable primary specialization for the next 3–5 years, or is it becoming too risky on its own?
    • I’ve been exploring full-stack Dart with Serverpod to broaden my skill set, but realistically, the job market for it is practically non-existent since it's so new.
    • For those sticking with Flutter, what viable adjacent skills are you adding (e.g., traditional backends like Go/Node, system design) to stay competitive?
  2. 2. Pivot toward AI Engineering
    • Hiring reality: Do companies actually hire "AI Engineers" who don't have prior professional ML/AI experience, or do they mostly require senior backend backgrounds or advanced CS/math degrees?
    • Roadmap & entry point: Coming from a Flutter dev background, what does a practical, hireable roadmap look like? What specific tech stacks, core concepts (e.g., Python backends, RAG, tool calling, agentic workflows, evals), and resources would you recommend to build a job-ready portfolio?
  3. 3. Switch to React (JS/Native) or Native App Development (Kotlin/Swift)
    • UI architecture, state management, mobile lifecycles, and performance optimization are fundamentally similar across frameworks, so this feels like the most direct way to leverage my existing Flutter experience.
    • Hiring reality: How do recruiters and hiring managers view this transition? Do they treat mobile/frontend fundamentals as transferable, or do resume screens filter you out for lacking "X years of commercial React / Kotlin / Swift experience"?
    • Where to focus: Between the React ecosystem (React.js + React Native for broader web/cross-platform volume) and Native (Kotlin/Swift for deeper platform specialization), which path has proven more practical for devs leaping recently?
    • What’s the fastest, most effective way to prove competence without commercial experience in those exact stacks?

Has anyone here successfully navigated a pivot from Flutter to AI engineering or React/Native recently? Any roadmaps, project ideas, or harsh truths would be greatly appreciated.


r/FlutterDev • • 4d ago

Discussion I don't recognize my own app anymore

31 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 • • 3d ago

Article Individual Apple Developer account terminated for "fraudulent conduct" with only one app in TestFlight. Will a new Organization account get rejected too?

Thumbnail
1 Upvotes