本站已进行升级,老用户可以通过找回密码登录。

24h Intel · 82 条

Flutter 24小时情报 GitHub 热门仓库与技术资讯

每日汇总 Flutter / Dart GitHub 热门仓库,以及 Dev.to、freeCodeCamp、Hacker News、Medium、Reddit 的近期技术资讯,跟踪 24 小时 Stars 增量与社区讨论。

更新于 10/18 06:516 个来源

GitHub

20 条

Dart 与 Flutter 相关仓库热度

Dev.to

12 条

开发者文章与项目分享

Flutter vs. React + Capacitor in 2026: Which Stack Saves More Time & Budget for Your Business App?
10/18 03:45

Flutter vs. React + Capacitor in 2026: Which Stack Saves More Time & Budget for Your Business App?

Vanza Labs

If you are a founder or business owner planning to build a cross-platform mobile app for iOS and Android in 2026, you will immediately face a critical technical decision: Should we build it in Flutter, or use a Web-to-Mobile stack like React + Capacitor? Pick the wrong stack for your specific use case, and you can easily add 4 to 6 extra weeks to your development timeline. At VanzaLabs, we don't treat technology choices like a religion. In fact, we recently built and shipped two production B2B mobile apps to Google Play—one written in Flutter (FormGrid: Forms & Sheets) and the other in React 19 + Tailwind CSS 4 + Capacitor 8 (Vanza: Invoices & Contracts). Here is a practical, business-focused guide on when to use each stack—based on real production trade-offs. When Flutter Is the Unbeatable Choice Choose Flutter for your business app if: You need 60/120fps native scrolling and gesture fluidity: Flutter renders its own UI via Impeller/Skia rather than relying on a browser WebView. When users scroll through hundreds of spreadsheet rows or switch between tabs rapidly, it feels indistinguishable from a native iOS/Android app. Why didn't we use Flutter here? Because the core of an invoicing and contract app is document layout, dynamic multi-step forms, and complex print formatting. Choose React + Capacitor for your business app if: You need both a Web App AND a Mobile App from a single codebase: With React + Capacitor, 95% of your web application code runs natively inside an iOS/Android shell with full access to native APIs (filesystem, camera, share sheet, in-app purchases via RevenueCat). For a startup on a tight budget, this saves 35–45% compared to building a web app and mobile app separately. We also help growing companies automate manual workflows by integrating CRMs, ERPs, payment gateways, and custom AI agents. 🌐 Explore our work and request a free 1-day project estimate: https://vanzalabs.tech

fluttermobilereactsoftwaredevelopment
Özel Yazılım Yaptırmak İstiyorum (Şirketlere Özel Otomasyon): Production Architecture & Best Practices 2026
10/17 23:00

Özel Yazılım Yaptırmak İstiyorum (Şirketlere Özel Otomasyon): Production Architecture & Best Practices 2026

Nuh Mehmet Demirkol

Özel Yazılım Yaptırmak İstiyorum (Şirketlere Özel Otomasyon) Mobil uygulama ekosisteminde ölçeklenebilir ve sürdürülebilir bir sistem inşa etmek için doğru mimari ve mühendislik disiplini şarttır. Clean Architecture katmanları ile iş mantığını ve UI katmanını birbirinden ayırmak bakım maliyetlerini %60 oranında azaltır. Flutter ile tek kod tabanından iOS ve Android için 120 FPS akıcılık elde edilir. Her kurumsal projede %100 açık kaynak kod, Git deposu ve en az 1 yıllık teknik bakım garantisi sağlanmalıdır. 📌 İlgili Özel Sayfa: Özel Yazılım Yaptırmak İstiyorum (Şirketlere Özel Otomasyon) 🧮 Canlı Maliyet Hesaplama: Mobil Uygulama Maliyet Hesaplama 👨‍💻 Bilgisayar Mühendisi: Nuh Mehmet Demirkol 📞 WhatsApp: +90 507 823 68 11 | Ankara, Türkiye

fluttermobilearchitectureios
Fast account switching in Flutter without a sign-in round trip
10/17 21:45

Fast account switching in Flutter without a sign-in round trip

Frank Milvus

Most messenger accounts are single-account by design: you sign in, the session In tonGues, a Flutter language-exchange messenger, we added saved : the app remembers up to five accounts and switches between them in This post covers the UX we landed on, the session lifecycle, and the isolation Saved accounts are listed on the login screen above the sign-in button, and in long-press the profile avatar in the navbar (right-click on desktop); Alt+0 (Ctrl+0 if the user chose Ctrl as the main modifier); More → Switch account, next to Log out. The switcher can switch to a saved account, add another one, remove a single IndexedStack, Up to five accounts are remembered, most-recently-used first. Adding a sixth The tempting implementation is: read the target's token, drop the current The rule we use is the reverse: validate the target completely, then teardown, . saved account tapped │ ├─ access token still valid? ──no──► refresh the session │ │ │ └─ rejected? → remove entry, show error ▼ confirm the identity with the backend │ ├─ network failure → keep the current session untouched └─ valid → tear down → publish → reconnect A network failure leaves the user exactly where they were. Only a definitive The teardown itself is deliberately boring: end any active call, stop presence not deleted by a switch. Two switches interleaving is a surprisingly easy bug to ship. We learned the before the first , not after validation. Validation can take several round trips; We also stamp each session with an epoch. Late async work compares its captured There is a second half to the token-refresh case: the rotated token still This is where most of the work lives. A messenger accumulates a lot of local Every store now includes the account id in its key or path: Store Scoped form Message cache one database per account Translations / transcriptions key suffix per account Pinned messages account + conversation Conversation freshness markers account + conversation Chat tabs account Encryption keys account prefix Drafts and upload outbox already per account The fallback segment is _shared, used only before a session exists. In normal Encryption keys are the critical case. Sharing an identity between accounts Keying the stores by account is necessary but not sufficient. The subtle bug is when the account is resolved. A cache write often happens after network final account = AccountScope.segment; final fetched = await api.fetchMessages(conversationId); if (AccountScope.segment != account) return; // the session moved on await MessageCacheService.save(conversationId, fetched, segment: account); Three details make this reliable: The account is captured once, before the first await. The result is dropped if the active account changed in the meantime. The cache API accepts the captured segment instead of re-reading the global state at write time. For encryption operations we go one step further and freeze the account for the static Future<T> capture<T>(Future<T> Function() body) { final captured = segment; return runZoned(body, zoneValues: {_operation: captured}); } static String get segment => (Zone.current[_operation] as String?) ?? _userId ?? '_shared'; This is the difference between "the key store is usually scoped" and "an Existing installs had exactly one session: un-prefixed tokens, one message The migration runs only when the app has proven which user the legacy session The important safety rule: a legacy layout is never claimed by "whichever The tests were green and the analyzer was clean, but a behavioural review still A partial secure-store read looked like a complete session. One token key was present and the other was not, so the read path skipped the fallback and returned a session with no refresh token. Fix: complete only the missing half from the fallback, and add a test for the mixed state. Cache writes resolved the account at completion time. A prefetch that started under account A could finish after a switch and write into account B's database. Fix: capture the account at the start and pass it through. A legacy layout was claimed by the first account to load. That exposed the previous user's tab names and chosen contacts. Fix: migrate legacy data only on the proven legacy path. None of these are compiler errors. They are the class of bug that only shows up Validate the destination before ending the current session. Users forgive a slow switch; they do not forgive being signed out of both accounts. Capture ambient state at the start of async work. "Current account" is ambient state, and it can change under you. Make the account an explicit parameter at the storage boundary. It turns a silent cross-account write into a compile-time argument. Treat legacy data as owned by a proven user. Never let a random first load claim it. Test the mixed and i

flutterdartshowdevlanguageexchange
Mastering Background Tasks in Flutter: Reliable Data Sync & Notifications
10/17 21:24

Mastering Background Tasks in Flutter: Reliable Data Sync & Notifications

Muhammad Tahir

Introduction: The Unseen Workhorse of Modern Mobile Apps In today's fast-paced digital landscape, user expectations for mobile applications have never been higher. Users demand real-time updates, instant notifications, and consistent data, regardless of whether the app is actively running in the foreground. For developers and businesses, this translates into a critical need for reliable background processing. Imagine a fitness app that fails to track your run when minimized, or a messaging app that doesn't deliver notifications until opened. These aren't minor glitches; they're deal-breakers that lead to frustrated users, uninstalls, and significant business impact. The challenge lies in the complex and often platform-specific nature of background tasks. Both Android and iOS have strict battery optimization policies and varying execution models for processes running outside the active foreground. Attempting to implement this without a robust strategy can lead to unreliable data, missed deadlines, poor battery life, and even app rejection from stores. The consequences include diminished user experience, increased churn, reputational damage, and ultimately, lost revenue. This article addresses this critical problem head-on, providing a comprehensive guide to implementing robust, cross-platform background tasks in Flutter. We'll leverage powerful plugins like workmanager for Android and understand the concepts behind iOS background execution to ensure your app remains responsive and up-to-date, even when users are focused elsewhere. To achieve reliable background processing in Flutter, we need to bridge the gap between Flutter's Dart isolates and the native background execution contexts provided by Android (WorkManager) and iOS (BGTaskScheduler or background\_fetch\). The core idea is to establish a dedicated entry point for background tasks that operates independently of the main UI thread. Native Platform Schedulers: On Android, we'll use WorkManager, a robust and flexible API for deferrable, guaranteed background work. For iOS, we'll primarily rely on the background\_fetch\ package, which wraps BGTaskScheduler\ (iOS 13+) and older background refresh APIs. Flutter Background Isolate: When a background task is triggered by the native scheduler, it needs to execute Dart code. This happens within a separate Flutter isolate, distinct from the UI isolate. This isolate can run Dart code, access Flutter plugins (if configured correctly), and perform computations or network requests without blocking the main UI. Shared Storage for Communication: Since the background isolate and the UI isolate are separate, they cannot directly share memory. We'll use a persistent storage mechanism, like shared\_preferences\ or a local database (e.g., Isar, Hive), to pass data and state updates between the background task and the active UI. Our architecture will define a callbackDispatcher\ function. This is a top-level Dart function that the native platform invokes. Inside this dispatcher, we'll initialize necessary Flutter components (like plugin settings), perform our background logic (e.g., API calls, data processing), and then store any results for the main UI to consume when it becomes active. First, add the necessary packages to your pubspec.yaml\ file: dependencies: flutter: sdk: flutter workmanager: ^0.5.2 # For Android background tasks shared_preferences: ^2.2.3 # For persistent storage # Optional: For more robust data storage, consider isar_flutter_libs: ^3.1.0+1 AndroidManifest.xml\) WorkManager usually handles most of its setup automatically. However, ensure your application tag includes a name attribute if it's not already there, pointing to an Application\ class if you have a custom one. For workmanager\, this is generally not strictly required beyond the default setup. Info.plist\ & AppDelegate.swift\) For iOS background tasks, you need to enable specific capabilities. In Info.plist\ (as source code): <key>UIBackgroundModes</key> <array> <string>fetch</string> <string>processing</string> </array> This enables background fetch and background processing. The processing\ mode is for BGTaskScheduler\ (iOS 13+). In ios/Runner/AppDelegate.swift\: You need to register the workmanager\ plugin's background task handler. This code initializes Flutter engine in the background when a task is received. import UIKit import Flutter import workmanager @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { // Register workmanager's plugin background task handler WorkmanagerPlugin.set==FlutterPluginRegistrantCallback { registry in GeneratedPluginRegistrant.register(with: registry) } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOpt

flutterbackgroundprocessingmobiledevelopmentworkmanager
Next.js vs Flutter Web: Choosing the Right Stack
10/17 17:10

Next.js vs Flutter Web: Choosing the Right Stack

Tjvex Studio

Sooner or later, almost every web project we quote hits the same fork in the road. The client already has a Flutter mobile app — or plans to build one — and the question becomes: should the web version be built in Next.js, or in Flutter Web? The next.js vs flutter web debate looks like a simple framework comparison. It isn't. One is a way to build websites with JavaScript; the other is a way to build apps with Dart that happen to run in a browser. Get the distinction right and the choice is usually obvious. Get it wrong and you pay for it every month — in search traffic you never win back, or load times that quietly kill conversions. Next.js is a React framework, maintained by Vercel, that renders real HTML and CSS in the browser. A Next.js page is a website in the oldest and most literal sense: the browser downloads markup, styles it, and displays it. Search engines can read it. Screen readers can read it. It degrades gracefully when JavaScript is slow or disabled. It is the web, working the way the web was designed to work. Flutter Web takes a completely different road. Flutter draws every pixel of its own interface — on mobile it paints to the device's canvas, and on the web it does the same thing inside the browser. Your app is compiled from Dart to JavaScript or WebAssembly, and what the user sees is a drawing on a canvas element. The browser is essentially a frame around that canvas. Neither is a bad technology. They are built for different jobs, and most of the regret we see comes from hiring one for the other's job. If organic search matters to you — a marketing site, a content platform, a SaaS landing page, a blog that feeds your pipeline — this is where the debate usually ends. Next.js hands crawlers real HTML. Flutter Web hands them a canvas plus a JavaScript bootstrap that has to run before anything is visible. Google has improved at indexing JavaScript-heavy pages, but improved is not equal. In our experience, clients who chose Flutter Web for a public-facing site spent months building SEO workarounds — pre-rendering, meta tag hacks, separate landing pages — that Next.js would have made unnecessary from day one. Rule of thumb: if strangers are supposed to find this through Google, build it in Next.js. We have never regretted that call. A Next.js page can stream HTML to the screen before its JavaScript has finished downloading. A Flutter Web app downloads a substantial engine payload first, boots, and then draws. On a fast office connection the difference is a second or two — noticeable, not fatal. On a mid-range phone on 4G, it is the difference between someone waiting and someone leaving. We build for markets where that second connection is the norm, so this weighs heavily in our recommendations. WebAssembly compilation has narrowed the gap, but narrowed is not closed. Next.js means JavaScript and TypeScript developers — the largest hiring pool in the industry, in every market we work in. Flutter Web means Dart developers: excellent people, but a smaller and more specialized pool. If you already have a Flutter team, that cost is sunk and Flutter Web gets genuinely cheaper, because the same engineers ship both platforms. If you are hiring from scratch and the web app is the main product, Next.js gives you far more candidates to choose from in London, Berlin, Amsterdam, Dubai, or Lahore. Flutter Web's strongest selling point is sharing code with a Flutter mobile app: the same Dart code, the same widgets, the same team shipping web, iOS, and Android. For a companion web app — an admin panel, a customer dashboard, a web version of the mobile product — that reuse is real and valuable. We have shipped projects where it cut the web effort dramatically. But sharing code between a mobile app and a marketing website rarely makes sense, because the two products share almost nothing that matters: not the navigation, not the layout, and certainly not the SEO requirements. The "one codebase" argument is powerful when the products are siblings. It is a trap when they are strangers. Choose Next.js when the project is, at its heart, a website: A public marketing site, blog, documentation hub, or landing page system. Organic search or content marketing is part of the growth plan. Fast first paint on slow networks matters — this comes up constantly with our Gulf and South Asia clients. Your team is JavaScript-heavy, or you will be hiring and want the widest pool. The design follows web conventions: pages, links, forms, readable text. For these projects Next.js is not just the better choice; it is the choice that removes entire categories of future problems. Choose Flutter Web when the project is, at its heart, an app: It is the companion to a Flutter mobile app, and the same team will build and maintain both. SEO is irrelevant — logged-in dashboards, internal tools, admin panels. The interface is highly custom, animated, or interactive in ways that fight the browser's document model. Flutter's canvas rendering i

webdevflutternextjs
%100 Kaynak Kod Mülkiyeti ve Yazılım Sözleşmesi Güvencesi: Production Architecture & Best Practices 2026
10/17 16:00

%100 Kaynak Kod Mülkiyeti ve Yazılım Sözleşmesi Güvencesi: Production Architecture & Best Practices 2026

Nuh Mehmet Demirkol

%100 Kaynak Kod Mülkiyeti ve Yazılım Sözleşmesi Güvencesi Mobil uygulama ekosisteminde ölçeklenebilir ve sürdürülebilir bir sistem inşa etmek için doğru mimari ve mühendislik disiplini şarttır. Clean Architecture katmanları ile iş mantığını ve UI katmanını birbirinden ayırmak bakım maliyetlerini %60 oranında azaltır. Flutter ile tek kod tabanından iOS ve Android için 120 FPS akıcılık elde edilir. Her kurumsal projede %100 açık kaynak kod, Git deposu ve en az 1 yıllık teknik bakım garantisi sağlanmalıdır. 📌 İlgili Özel Sayfa: %100 Kaynak Kod Mülkiyeti ve Yazılım Sözleşmesi Güvencesi 🧮 Canlı Maliyet Hesaplama: Mobil Uygulama Maliyet Hesaplama 👨‍💻 Bilgisayar Mühendisi: Nuh Mehmet Demirkol 📞 WhatsApp: +90 507 823 68 11 | Ankara, Türkiye

fluttermobilearchitectureios
Flutter Geofencing Without Battery Drain
10/17 11:00

Flutter Geofencing Without Battery Drain

Muhammad Uzair

Geofencing is one of those features that sells itself. Your app notices when the user walks into the office and switches their phone to silent, then restores the ringer when they leave. No taps, no remembering — the app just knows where it is. I know this pattern well because it is the core of Smart Silent, my Android app that automatically switches phone sound profiles based on scheduled times or geographic location. Under the hood it is battery-efficient geofencing: location-based profile switching that keeps battery usage under 1.2 percent per 24 hours, backed by deep OS-level controls for calls, media, and notification volumes. The reason most geofencing implementations get deleted is not accuracy — it is battery life. A geofence feature that keeps the GPS radio hot all day is a feature users switch off, and a switched-off feature might as well not exist. Here are the five engineering rules that make geofencing in Flutter reliable and cheap enough to leave on permanently. Both mobile operating systems already solved battery-efficient geofencing, and your job as a Flutter developer is mostly to not fight them. On Android, the GeofencingClient registers geofences with the fused location provider. The OS batches location requests across every app on the device, so your 100-meter office geofence usually costs your app nothing extra — the radio wakes are shared with everything else running. Android supports up to 100 geofences per app and delivers three transition types: enter, exit, and dwell (the user has stayed inside for a configured time). On iOS, region monitoring with circular regions works the same way at a conceptual level. The system can monitor your regions even when the app is suspended or terminated, waking it in the background to deliver enter and exit events. iOS limits an app to 20 simultaneously monitored regions, so iOS designs must register only the regions near the user and re-register as they move. The single most important takeaway: never replace these native APIs with your own GPS polling loop. Polling the current position on a timer keeps the GPS radio awake and is the number one reason geofence features drain batteries. Geofence radius is not just a UX decision — it is a power decision. Large geofences (100 meters and up) can be served by the fused location provider using low-power WiFi and cell-tower positioning. Small geofences (20 meters) force the system to wake the GPS chip to get fine fixes, which is dramatically more expensive. As a rule of thumb, make 100 meters your minimum practical radius unless the use case truly demands otherwise. An office auto-mute feature does not need to know which floor the user is on — it needs to know they arrived at the office campus. If a product designer asks for a 15-meter geofence around a store entrance, push back and propose a larger zone with a dwell requirement instead. I explored how these power tradeoffs compound across a whole app in my guide on mobile battery optimization: https://www.uzairxdev.online/blog/graphql-vs-rest-mobile-battery GPS positions drift. A phone sitting on a desk near the edge of a geofence will report positions that flicker in and out of the boundary, and naive code will fire enter, exit, enter, exit in a loop. This is not just annoying — every false transition wakes your app and costs power. The fix is a small state machine with a dwell requirement: only fire a transition after the new state persists for a minimum duration. Here is a compact implementation using the geolocator package: \`dart /// Confirms geofence transitions only after the new state persists, bool _inside = false; GeofenceMonitor({ /// Returns 'enter' or 'exit' on a confirmed transition, null otherwise. if (nowInside == _inside) { _crossedAt = null; return null; } _crossedAt ??= now; if (now.difference(_crossedAt!) < dwellTime) { return null; // Still unconfirmed - wait out the drift. } _inside = nowInside; _crossedAt = null; return _inside ? 'enter' : 'exit'; } } \ Native geofence APIs have this concept built in — Android supports a loitering delay when registering a geofence, and iOS lets you require the device to be inside a region for a minimum time before notifying. Use the platform delay when registering the geofence, and keep a debounce layer in Dart for anything you compute manually. Geofencing only matters when the user is not looking at your app, which means you need background location access — the most suspicious permission an app can ask for. Getting this wrong is how geofence features ship and never get enabled. On Android 10, background location ("Allow all the time") became a separate request from foreground location. On Android 11 and later, the system deliberately refuses to show it in a dialog — the user must grant it in Settings. That means your permission flow must first request foreground access, then explain exactly why the feature needs background access, and then deep-link the user to Settings. Requesting backgr

fluttergeofencinglocationbatteryoptimization
Building an Ethiopian Calendar in Flutter
10/17 10:59

Building an Ethiopian Calendar in Flutter

Muhammad Uzair

Most date libraries pretend the world runs on one calendar. Building the Zemen App — my Ethiopian calendar and date converter on the Play Store — taught me otherwise. The app is 100% offline: it converts between the Ethiopian and Gregorian calendars, tracks national holidays like Enkutatash, Meskel, and Timkat, and carries a full database of Orthodox Tewahedo fasting days, all without a single network call. The heart of the app is a small, self-contained calendar engine I wrote in Dart. It converts dates in both directions with exact integer math, models the 13-month Ethiopian year including leap years, and is covered by anchor-based tests. This article walks through how that engine works, so you can build the same thing — or adapt the approach to any non-Gregorian calendar. The Ethiopian calendar has 13 months: twelve months of exactly 30 days each, followed by Pagume, a short 13th month with 5 days — or 6 in a leap year. A leap year is any year divisible by 4, the same alignment as the Julian calendar. The new year, Enkutatash, falls on September 11 in most years (September 12 in the year before a Gregorian leap year). The calendar runs roughly seven to eight years behind the Gregorian calendar — as I write this in October 2026, it is 2019 in Ethiopia. That regularity is what makes the calendar engine simple: every month except Pagume has a fixed length, so month arithmetic is multiplication, not lookup tables. Instead of converting directly between the two calendars, convert through a neutral pivot: the Julian Day Number (JDN), the count of days since a fixed astronomical epoch. Ethiopian date → JDN → Gregorian date, and back. Each direction is one pure function, which makes the code trivially testable. The Ethiopian epoch — 1 Meskerem 1 EE — corresponds to JDN 1724221. Days elapsed before the start of a given Ethiopian year are: \dart \ Because Ethiopian leap years are exactly the years divisible by 4, the count of leap years before year Y is (Y - 1) ~/ 4\. The forward conversion is then one line: \dart \ The reverse direction recovers the year with integer division over 4-year cycles of 1461 days (365 × 4 + 1): \dart \ For the Gregorian side, the classic pair of JDN algorithms does the job: \`dart List jdnToGregorian(int jdn) { \ All four functions use only integer arithmetic — no floating point, no DateTime, no timezone surprises. That matters on mobile: the engine behaves identically on every device, and it is fast enough to convert thousands of dates in a single frame if a calendar grid needs it. Wrap it in a tiny public API: \`dart /// Converts an Ethiopian date to [year, month, day] in the Gregorian calendar. /// Converts a Gregorian date to [year, month, day] in the Ethiopian calendar. /// True when [year] is an Ethiopian leap year (Pagume has 6 days). /// Days in [month] of Ethiopian [year]. \ For the UI, keep a simple constant list of the thirteen month names — Meskerem, Tikimt, Hidar, Tahsas, Tir, Yekatit, Megabit, Miyazya, Ginbot, Sene, Hamle, Nehase, Pagume. Because month lengths are fixed, rendering a month grid is pure arithmetic: the starting weekday plus the month length, both derived from the JDN. No per-month tables, no special cases — the only conditional in the whole engine is Pagume. The weekday itself comes free from the JDN: (jdn + 1) % 7\ gives the weekday with 0 as Sunday. That one-liner tells your grid which column the 1st of the month lands in, with no DateTime weekday lookups. There are date-conversion packages on pub.dev, but a calendar app lives or dies on correctness, and a hand-rolled engine has three advantages. First, every line is covered by your own anchor tests, so you know exactly what is verified. Second, there are no transitive dependencies to audit or keep updated. Third, the whole engine is under 60 lines — small enough to fully understand, which matters when a user reports that a holiday landed on the wrong day. For a feature this central, that understanding is worth more than the hour a package saves, and it keeps the app free of extra native date libraries and method channels. Date conversion is only half of a calendar app. The Zemen App also shows national holidays (Enkutatash, Meskel, Timkat) and the full schedule of Orthodox Tewahedo fasting days and Sabbath days. None of that can be computed from the conversion math — it is data, and in an offline-first app, data ships with the app. I bundled the holiday and fasting database as a local asset and load it once at startup. Lookups are then instant and work in airplane mode, in areas with no signal, and without costing the user a byte of mobile data. That decision shaped the whole architecture: the app has no backend at all, which means no server costs, no API to maintain, and no loading spinners anywhere in the UI. If you are building an offline-first app, I wrote a deeper guide on architecting offline-first mobile apps. Calendar code fails in the most embarrassing way possible: off-by-one errors that only s

flutterdartethiopiancalendarofflinefirst
Why We Built 2 Local-First B2B Mobile Apps Using Flutter and React 19 + Capacitor 8
10/17 04:52

Why We Built 2 Local-First B2B Mobile Apps Using Flutter and React 19 + Capacitor 8

Vanza Labs

When my co-founder and I started our product engineering studio, VanzaLabs, we faced the classic agency paradox: to win clients who need turnkey MVPs, you have to prove you can ship production-ready software from scratch. Instead of creating dribbble-style mockups or another todo app, we decided to solve two real-world workflow problems for small businesses and independent contractors—and ship two production apps to Google Play. Here is a breakdown of why we bet on a Local-First (Zero-Middleware) architecture, why we chose Flutter for one app and React 19 + Capacitor 8 for the other, and how a 2-founder team ships at startup speed using AI-assisted workflows. Most mobile productivity tools for small businesses and field workers suffer from two major friction points: Data Privacy & Trust: Contractors, freelancers, and business owners don't want their client lists, pricing tables, and financial contracts stored on a random third-party startup's database. Offline Reliability: Field work happens in basements, construction sites, and warehouses where mobile connectivity drops constantly. So we designed both products around a strict Local-First principle: the app either runs 100% offline on the device or communicates directly with the user's own cloud account (Google Drive / Sheets / Forms) with zero intermediate backend servers. The Problem: Try creating a Google Form linked to a response spreadsheet—or quickly appending a new order row to a large sheet—inside a mobile browser. The mobile web UI for Google Forms and Sheets wasn't built for fast field operations. Our Solution (FormGrid on Google Play): Tech Stack: Flutter (Dart, Material 3), Google Workspace APIs (Drive v3, Sheets v4, Forms v1), Provider, RevenueCat (purchases_flutter), qr_flutter, receive_sharing_intent. Direct Client-to-API Architecture: FormGrid connects directly from the mobile client to Google APIs using scoped OAuth access—only touching files created or opened through the app. Offline Sync Queue: When a user adds rows to a sheet without internet access, entries are queued locally on the device and automatically synced once connectivity is restored. Field-Ready Utilities: Ready-to-use business sheet templates (orders, inventory, attendance, budget), an instant custom QR code generator for newly created forms, and direct file import via the OS share sheet. The Problem: Contractors, builders, artisans, and freelancers often calculate job estimates on paper or in messy chat threads, while clients expect a clean, professional PDF estimate, invoice, or contract on the spot. Our Solution (Vanza: Invoices & Contracts on Google Play): Tech Stack: React 19, TypeScript, Vite, Tailwind CSS 4, Capacitor 8, Dexie.js (IndexedDB), jsPDF + jspdf-autotable, RevenueCat (purchases-capacitor). Why React 19 + Capacitor 8 Instead of Flutter? While Flutter was ideal for native list performance and OS intents in FormGrid, an invoicing and contract engine revolves around complex dynamic forms, line-item tables with automatic tax/discount calculations, amount-in-words formatting across 13 languages and 20+ currencies, and rendering 12 distinct PDF templates. Using React 19 and Tailwind 4 inside Capacitor 8 allowed us to iterate on complex document layouts much faster. 100% Offline via IndexedDB (Dexie.js): Client directories, service catalogs, pricing, and generated documents live entirely on the user's phone—no mandatory sign-up required. On-Screen Signatures & Stamps: Clients can sign directly on the smartphone screen with their finger upon job completion, while contractors can overlay their transparent PNG company stamp and share the final PDF via WhatsApp, Telegram, or Email in one tap. Optional Google Drive Backup: Users can optionally back up their local database directly to their own Google Drive. As a two-founder team, leveraging modern AI coding agents alongside disciplined architectural review lets us compress weeks of boilerplate UI and localization work into days. However, our biggest takeaway is simple: AI accelerates code generation, but human engineering owns the architecture. From configuring corporate Google Play Console accounts (D-U-N-S verification to bypass the 14-day / 12-tester personal account bottleneck) to wiring offline sync queues and subscription billing, shipping real products requires end-to-end engineering rigor. We are currently growing our in-house apps while helping startups and SMBs build their own products at VanzaLabs: Turnkey Web & Mobile MVPs in 3–8 weeks (Flutter, React, Next.js, TypeScript, Python) with 100% code ownership in your GitHub. AI & Workflow Automation (CRM/ERP integrations, custom AI agents, and RAG systems). We'd love your feedback on the apps and our stack choices! Have you used Flutter and Capacitor side-by-side in production? Let us know in the comments. 🌐 Website: https://vanzalabs.tech

flutterreactmobilestartup
React Native vs Flutter in 2026: a practical comparison
10/16 23:12

React Native vs Flutter in 2026: a practical comparison

Piotr Żarów

Originally published on devanddeliver.com. React Native's New Architecture has closed most of the performance gap that made Flutter the go-to for animation-heavy apps - and if your team already writes TypeScript and React, the case for switching languages has never been weaker. We cover the architecture shift, real pain points on both sides, and side-by-side code for the patterns you will actually build. Versions covered: React Native 0.85.3 · Expo SDK 56 · Flutter 3.44.0 If your team writes JavaScript or TypeScript and already knows React: React Native. The knowledge transfer is direct, the ecosystem is enormous, and the New Architecture has erased most of the performance arguments that used to favour Flutter. You are building mobile apps with the same language, the same mental model, the same tooling, and - increasingly - the same people who build your web product. If you are starting from zero with no existing React knowledge, care deeply about animation consistency at 120fps, or are building an app where pixel-perfect parity across iOS and Android is a hard requirement: Flutter. Dart is a faster learning curve than many engineers expect, and Flutter's rendering model removes an entire class of "why does this look different on Android" problems. This is not a close race decided by benchmarks. It is a question of team fit and project requirements. For most product companies and agencies building TypeScript web stacks, React Native is the natural extension. Flutter is the right call when you are specifically optimising for what it is best at. This is the one thing to understand before anything else. React Native runs your JavaScript code in a JS engine (Hermes, by default since RN 0.70) and renders actual native UI components - UIButton on iOS, android.widget.Button on Android. Your code is JavaScript. Your UI is native. The New Architecture (mandatory as of RN 0.82) replaced the old async JSON bridge with JSI - direct C++ bindings that allow JS to call native code synchronously and hold references to native objects. Flutter compiles Dart code to native ARM and x86 binaries and renders every pixel itself using the Skia/Impeller graphics engine. There are no native platform widgets involved. A Flutter Button is drawn on a canvas, not an iOS UIButton. This is why Flutter has perfect cross-platform pixel parity - and why it has to work harder to look native on each platform. Neither approach is wrong. They have different trade-offs: React Native Flutter UI layer Native platform widgets Custom-rendered canvas Cross-platform parity Close, with platform quirks Pixel-perfect "Looks native" Yes -uses actual native components Approximated (very well) Native component access Direct Via PlatformView (has overhead) Language TypeScript / JavaScript Dart Compilation JS + native modules Fully compiled to native For several years, the main argument for Flutter over React Native was performance. The async bridge at the heart of the old architecture caused frame drops during complex animations and made synchronous native access impossible. That argument is no longer valid in 2026. The timeline: RN 0.76 (October 2024): New Architecture became the default for new projects RN 0.82 (October 2025): Legacy Paper renderer fully removed - New Architecture is the only option RN 0.84 (February 2026): Hermes V1 becomes default; precompiled binaries on iOS; legacy architecture code fully deleted RN 0.85 (April 2026): Improved animation backend, DevTools improvements, Metro TLS support Expo SDK 55 (February 2026): Legacy architecture support removed from Expo The New Architecture ships four interconnected pieces: JSI (JavaScript Interface) - replaces the JSON bridge with direct C++ bindings. JS can now call native methods synchronously and hold native object references, enabling patterns that were impossible before (like react-native-reanimated's UI-thread animations and react-native-vision-camera's frame processors). Fabric - new concurrent renderer. Supports React 18/19 concurrent features: Suspense, transitions, startTransition. Layout calculations run on multiple threads instead of blocking the JS thread. TurboModules - lazy-loaded native modules. The old architecture loaded every registered native module at startup regardless of whether you used it. TurboModules load on first access, improving startup time meaningfully. Codegen - auto-generates type-safe C++ binding code from TypeScript specs. Write your native module interface in TypeScript, Codegen produces the platform glue code. The practical result: React Native's animation and interaction performance on New Architecture is genuinely close to Flutter for the vast majority of application patterns. The gap remains at the extremes - very heavy custom animations, games, frame-by-frame camera processing - but for business apps, the New Architecture is good enough to make performance a non-issue in the RN vs Flutter decision. In 2026, the right way to start a n

architecturefluttermobilereactnative
Uygulama Yaptırmak İstiyorum: Fikirden Mağaza Yayınına 2026 Rehberi: Production Architecture & Best Practices 2026
10/16 23:00

Uygulama Yaptırmak İstiyorum: Fikirden Mağaza Yayınına 2026 Rehberi: Production Architecture & Best Practices 2026

Nuh Mehmet Demirkol

Uygulama Yaptırmak İstiyorum: Fikirden Mağaza Yayınına 2026 Rehberi Mobil uygulama ekosisteminde ölçeklenebilir ve sürdürülebilir bir sistem inşa etmek için doğru mimari ve mühendislik disiplini şarttır. Clean Architecture katmanları ile iş mantığını ve UI katmanını birbirinden ayırmak bakım maliyetlerini %60 oranında azaltır. Flutter ile tek kod tabanından iOS ve Android için 120 FPS akıcılık elde edilir. Her kurumsal projede %100 açık kaynak kod, Git deposu ve en az 1 yıllık teknik bakım garantisi sağlanmalıdır. 📌 İlgili Özel Sayfa: Uygulama Yaptırmak İstiyorum: Fikirden Mağaza Yayınına 2026 Rehberi 🧮 Canlı Maliyet Hesaplama: Mobil Uygulama Maliyet Hesaplama 👨‍💻 Bilgisayar Mühendisi: Nuh Mehmet Demirkol 📞 WhatsApp: +90 507 823 68 11 | Ankara, Türkiye

fluttermobilearchitectureios
Mastering Background Tasks in Flutter: Isolates for Seamless Multi-Platform Execution
10/16 22:27

Mastering Background Tasks in Flutter: Isolates for Seamless Multi-Platform Execution

Muhammad Tahir

1. Introduction & The Problem In today's mobile-first world, users expect applications to be fast, responsive, and efficient. However, many applications face a significant challenge: performing long-running or resource-intensive tasks without freezing the user interface (UI) or draining the device's battery. Imagine a social media app that uploads a high-resolution video, a fitness tracker processing sensor data, or an e-commerce app syncing large product catalogs. If these operations run on the main UI thread, the application becomes unresponsive, leading to a frustrating user experience, often resulting in an Application Not Responding (ANR) error on Android or a frozen UI on iOS. The consequences of neglecting background processing are severe. Users quickly abandon apps that feel sluggish or crash frequently. This translates directly to lower user retention, negative app store reviews, and ultimately, a detrimental impact on business reputation and revenue. For cross-platform frameworks like Flutter, the challenge is compounded by the need to integrate with disparate native background execution mechanisms across Android and iOS, which have their own lifecycle management, scheduling APIs, and resource constraints. Solving this problem in Flutter requires a two-pronged approach: leveraging Flutter's built-in concurrency model and integrating with robust platform-specific background services. For CPU-intensive operations that would block the main UI thread, Flutter offers Isolates. An Isolate is an independent worker that runs its own event loop and memory heap, completely isolated from other Isolates. This means a heavy computation in one Isolate cannot directly block the main UI thread, ensuring responsiveness. However, Isolates alone are not sufficient for persistent background tasks that need to run when the app is closed or in the background for extended periods. For such scenarios, we need to tap into the operating system's capabilities. On Android, this means using WorkManager, a robust library for deferrable, guaranteed background execution. On iOS, we'd typically use Background Fetch or Background Tasks, though these are more restrictive. By combining Flutter Isolates with these native background execution services via platform channels or specialized plugins, we can create a powerful and efficient architecture: Main Isolate (UI Thread): Handles all UI rendering and user interactions. It triggers background tasks. Platform Background Service: A native Android (WorkManager) or iOS (Background Tasks) component that schedules and manages the execution of background work, even when the app is terminated. Background Isolate(s): Spun up by the platform background service (which invokes a Flutter entry point) to perform the actual heavy computation or data processing, isolated from the UI. This architecture ensures that heavy lifting never impacts the user's immediate interaction with the app, while critical background processes complete reliably. Let's walk through implementing robust background processing in a Flutter application. We'll focus on Android's WorkManager for guaranteed execution and Flutter Isolates for CPU-bound tasks. We'll simulate a long-running data synchronization process. First, create a new Flutter project and add the necessary dependencies. We'll use workmanager for Android background tasks. dependencies: flutter: sdk: flutter workmanager: ^0.5.1 # Or the latest version Run flutter pub get. WorkManager requires a dedicated entry point that can be invoked even when your app is not running. This is typically done in your main.dart file. We define a callbackDispatcher function that WorkManager will execute. import 'package:flutter/material.dart'; import 'package:workmanager/workmanager.dart'; import 'dart:async'; import 'dart:isolate'; @pragma('vm:entry-point') void callbackDispatcher() { Workmanager().executeTask((task, inputData) async { switch (task) { case 'heavySyncTask': print('Executing heavySyncTask in background...'); // Spin up an Isolate for the actual heavy work final receivePort = ReceivePort(); await Isolate.spawn(heavyBackgroundTaskEntryPoint, receivePort.sendPort); final result = await receivePort.first; print('Heavy background task completed with result: $result'); break; default: print('Unknown task: $task'); } return Future.value(true); }); } @pragma('vm:entry-point') void heavyBackgroundTaskEntryPoint(SendPort sendPort) async { // This is the Isolate doing the heavy computation print('Isolate started: Performing heavy data sync...'); // Simulate a long-running CPU-bound task int sum = 0; for (int i = 0; i < 1000000000; i++) { sum += 1; // Heavy computation } print('Isolate completed computation.'); sendPort.send('Data Sync Complete! Calculated sum: $sum'); } void main() async { WidgetsFlutterBinding.ensureInitialized(); await Work

flutterisolatesbackgroundprocessingmobiledevelopment

freeCodeCamp

15 条

教程、指南与实践文章

How to Build a Dart Package Analytics Tool with the pub.dev API: Beyond the 30-Day Window
09/24 05:01

How to Build a Dart Package Analytics Tool with the pub.dev API: Beyond the 30-Day Window

Oluwaseyi Fatunmole

When I published my package on pub.dev, the first few days were exciting as the number of downloads climbed. 201 downloads in a few days! Then something strange happened. The number dropped: 120, then

pub.devFluttermobileDart
How to Implement LEGO Architecture in Flutter [Full Handbook]
09/11 23:08

How to Implement LEGO Architecture in Flutter [Full Handbook]

Atuoha Anthony

Almost everyone has snapped two LEGO bricks together at some point, even without owning a single set as an adult. You press one brick down onto another, feel it click, and it holds. You likely never o

FlutterDartflutter-awarehandbook
How to Use Skills in Agentic Flutter Development: A Handbook for Devs
09/03 23:40

How to Use Skills in Agentic Flutter Development: A Handbook for Devs

Atuoha Anthony

One of the biggest misconceptions about AI-assisted development is that using AI means giving up the engineering experience you've built over the years. It doesn't. You can take the architecture patte

FlutterDartAIflutter-aware
How to Test Flutter Apps: Unit, Widget, Golden, and Integration Tests Explained
08/27 23:34

How to Test Flutter Apps: Unit, Widget, Golden, and Integration Tests Explained

Gidudu Nicholas

The first time I was asked "what's your test coverage?" in a technical interview, I didn't have a good answer. I had shipped a couple of real Flutter apps by then. They worked and users were using the

FlutterDartTestingwidget-testing
Mobile Background Execution: iOS Background Modes, Android WorkManager, and Background Services in Dart
08/25 01:45

Mobile Background Execution: iOS Background Modes, Android WorkManager, and Background Services in Dart

Oluwaseyi Fatunmole

Every mobile developer eventually hits the same wall: the app works perfectly when the user is looking at it. But the moment they press the home button, everything stops. A sync that should have compl

DartFluttermobileMobile Development
Chain of Responsibility Design Pattern: Decoupling Complex Business Rules, One Handler at a Time
08/22 04:45

Chain of Responsibility Design Pattern: Decoupling Complex Business Rules, One Handler at a Time

Oluwaseyi Fatunmole

Every system, at some point, ends up with a function that nobody wants to touch. It starts small: a simple validation check, an if statement here, another there. Then requirements grow and more condit

design patternsBehavioral Design PatternDartFlutter
How to Work with Material and Cupertino Decoupling in Flutter [Full Handbook]
08/19 00:05

How to Work with Material and Cupertino Decoupling in Flutter [Full Handbook]

Atuoha Anthony

Earlier this year, I published Decoupling Material and Cupertino in Flutter, which covered what was then a preview feature: Flutter's plan to separate the Material and Cupertino design libraries from

FlutterDartflutter-aware
How to Automate Flutter Releases with Fastlane and GitHub Actions for Firebase App Distribution, Google Play, TestFlight, and App Store Connect
08/12 00:47

How to Automate Flutter Releases with Fastlane and GitHub Actions for Firebase App Distribution, Google Play, TestFlight, and App Store Connect

Atuoha Anthony

Picture this: it's 4pm on a Friday, and your team has just merged the last feature for the sprint. But your product manager asks for a new build on TestFlight by the end of the day so the client can r

FlutterDartflutter-aware
Flutter Frontend Systems Design: How to Think Like a Senior Engineer in the AI Age
08/10 22:14

Flutter Frontend Systems Design: How to Think Like a Senior Engineer in the AI Age

Jesutoni Aderibigbe

Systems design has always been treated as a backend problem. Ask a group of Flutter engineers what systems design means, and most will describe server architecture: load balancers, databases, and micr

FlutterSystem Designmobile app developmentDart
How to Test AI Features in Flutter [Full Handbook]
08/08 00:05

How to Test AI Features in Flutter [Full Handbook]

Atuoha Anthony

You've spent two weeks building an AI assistant. The streaming chat looks beautiful, the system prompt is tight, and safety filters are configured. You demoed it to the team, and everyone was impresse

Fluttergeminiflutter-awareDart
A Deep Dive into Behavioral Patterns: The Visitor Design Pattern and its Clean Operations Across Complex Object Structures
08/07 00:11

A Deep Dive into Behavioral Patterns: The Visitor Design Pattern and its Clean Operations Across Complex Object Structures

Oluwaseyi Fatunmole

There's a problem that shows up in almost every growing software system, and most developers don't even realize they're hitting it until the damage is already done. You have a set of objects: differen

Designdesign patternsdesign principlesDart
Bluetooth Low Energy in Flutter: A Handbook for Devs
08/06 01:25

Bluetooth Low Energy in Flutter: A Handbook for Devs

Nikheel Vishwas Savant

Most Flutter tutorials stop at network calls and REST APIs. The moment you need to talk to a physical device, a heart rate monitor, a smart bulb, a fitness tracker, an industrial sensor, or your own c

bluetoothBluetooth Low EnergyFlutterFlutter SDK
From RPC to gRPC: Understanding Remote Procedure Calls, Protocol Buffers, and Modern Distributed Systems Communication
07/23 06:36

From RPC to gRPC: Understanding Remote Procedure Calls, Protocol Buffers, and Modern Distributed Systems Communication

Oluwaseyi Fatunmole

Every application, at some point, needs to talk to another system. A mobile app talks to a backend. A backend service talks to a payment gateway. An authentication service talks to a user service. A d

gRPCRPCDartFlutter
The Observer Design Pattern Handbook: Event-Driven Architecture & Domain-Driven Design in Dart
07/17 06:20

The Observer Design Pattern Handbook: Event-Driven Architecture & Domain-Driven Design in Dart

Oluwaseyi Fatunmole

Every application, at some point, has to deal with a fundamental challenge: something happens, and several other things need to react to it. A user logs in, and the app needs to save a token, cache th

#Domain-Driven-DesignDartMobile DevelopmentFlutter
How to Fix App Jank: A Practical Guide to Profiling Flutter Apps with DevTools
07/08 23:47

How to Fix App Jank: A Practical Guide to Profiling Flutter Apps with DevTools

Gidudu Nicholas

Flutter makes it fast to build beautiful UIs. That speed is one of the framework's greatest strengths, but it also creates a subtle problem: performance issues are easy to introduce and difficult to f

Flutterjankdevtoolsperformance

Hacker News

20 条

技术社区讨论与项目链接

Streaming a coding agent's UI in Flutter: what broke and how we fixed it
10/16 16:55

Streaming a coding agent's UI in Flutter: what broke and how we fixed it

narayanahari

Article URL: https://getpullrequest.com/blogs/streaming-agent-ui-in-flutter Comments URL: https://news.ycombinator.com/item?id=50115889 Points: 1 # Comments: 0

A Linux desktop environment in Flutter
10/14 21:13

A Linux desktop environment in Flutter

matthewkosarek

Article URL: https://github.com/miracle-wm-org/moonswing Comments URL: https://news.ycombinator.com/item?id=50087239 Points: 1 # Comments: 2

Genkit Dart 1.0: Build production-ready agentic apps with Dart and Flutter
10/11 09:09

Genkit Dart 1.0: Build production-ready agentic apps with Dart and Flutter

khalidkhair

Article URL: https://flutter.dev/blog/announcing-genkit-dart-1-0 Comments URL: https://news.ycombinator.com/item?id=50038795 Points: 4 # Comments: 0

Moonswing: A Linux Desktop Environment Built in Flutter
10/09 22:53

Moonswing: A Linux Desktop Environment Built in Flutter

matthewkosarek

Article URL: https://github.com/miracle-wm-org/moonswing Comments URL: https://news.ycombinator.com/item?id=50021374 Points: 2 # Comments: 1

PomoPlan – Local-first Pomodoro, task, and habit tracker in Flutter
10/08 22:22

PomoPlan – Local-first Pomodoro, task, and habit tracker in Flutter

bentamara

Article URL: https://play.google.com/store/apps/details?id=com.pomoplan.pomoplan&hl=en_US Comments URL: https://news.ycombinator.com/item?id=50006163 Points: 2 # Comments: 0

10/08 16:09

Ask HN: Preferred state management for enterprise Flutter in 2026?

nmdemirkol

When scaling Flutter mobile apps to enterprise level, what state management approach (BLoC, Riverpod, Signals, etc.) have you found most maintainable over time? Interested in experiences regarding testability and onboarding. Comments URL: https://news.ycombinator.com/item?id=50003115 Points: 2 # Comments: 0

Friday – A voice-activated personal AI companion built with Flutter
10/07 23:34

Friday – A voice-activated personal AI companion built with Flutter

ddhruv2424

Article URL: https://github.com/dj2313/jarvis_assistant Comments URL: https://news.ycombinator.com/item?id=49994302 Points: 2 # Comments: 0

Show HN: Vynody – Cross-platform music player written in Flutter and Rust
10/01 20:13

Show HN: Vynody – Cross-platform music player written in Flutter and Rust

axel10

Article URL: https://github.com/axel10/vynody Comments URL: https://news.ycombinator.com/item?id=49920648 Points: 5 # Comments: 0

09/29 01:57

Ask HN: React Native or Flutter when the back end is Node?

rearview

Really confused between React Native and Flutter. I’ve mostly worked with Flutter and a little bit with React Native, but that was quite a while back, so I’m not sure how things stand today. I’m building a project with a Node.js + tRPC backend, so React Native is looking really tempting cause of that Typescript. While researching I've seen mixed reviews about performance in React Native like people saying they've spend weeks finding and managing performance issue which does makes me worry. The app I wanna build doesn't have complex canvas work or crazy animations. For a typical production app, what’s the performance situation with React Native vs Flutter now? Are there any major concerns which I should know before looking in React Native? Comments URL: https://news.ycombinator.com/item?id=49881846 Points: 5 # Comments: 15

Show HN: I compiled FreeRDP into a Flutter app so my phone can do RDP and SSH
09/19 02:14

Show HN: I compiled FreeRDP into a Flutter app so my phone can do RDP and SSH

neil_thomas

Hi HN, I'm the developer. XConnect is an SSH/SFTP client for iOS and Android that also has a real RDP client built in, so one app covers my Linux and Windows machines when I'm away from my desk. No account needed: tap "Continue Offline" and everything stays on the phone. I built it because fixing things from my phone meant switching between an SSH app, a file app and Microsoft's RDP app, and on a small screen the switching was the worst part. What it does: - SSH and Telnet, with a key row for phone keyboards (Esc, Tab, arrows, sticky Ctrl/Alt, one-tap Ctrl-C/D/L/Z) and multiple sessions. - RDP (iOS for now). FreeRDP 3 is compiled into the app, so the phone speaks RDP directly, with no gateway or relay. Trackpad or direct-touch mode, pinch to zoom, two-finger right-click and scroll. Hardware keyboards are forwarded by scancode. - SFTP, jump hosts (ProxyJump-style, for both SSH and SFTP), and 14 built-in scripts you can run on a server with one tap. - An optional AI agent with your own API key (OpenAI-compatible endpoints, Anthropic, or Ollama on your LAN). It runs commands on the host and asks before anything that looks destructive. It does nothing until you configure it. Some technical details: the native RDP core sends Dart one event per frame (connected / bitmap / resize / error / disconnected), in the same binary format my desktop app's RDP helper uses. Dart applies the updates to an RGBA framebuffer and paints it with decodeImageFromPixels. SSH is dartssh2 and the terminal is xterm.dart. Scripts run as heredocs, because my first version joined the lines with "; " and put the whole script behind the shebang comment. Credentials: passwords and private keys are stored in the iOS Keychain / Android Keystore. Sync is optional. Records are encrypted on the device with AES-256-GCM before upload, with a key derived from your account password (PBKDF2, then scrypt per record). To be upfront: login currently sends that password to the server over TLS, so this is not zero-knowledge yet. [Switching login to a separately derived auth hash is next on my list.] The app is closed source. I know that's a hard sell for something that holds SSH keys, so ask me anything about how credentials are handled. Not there yet: RDP on Android, port forwarding on mobile (the desktop app has it), passphrase-protected keys, keyboard-interactive 2FA, and mosh. Pricing: SSH, Telnet, SFTP, scripts and one jump host are free. Pro ($8/month, $68/year, or $88 one-time) adds RDP, the AI agent, sync and unlimited jump hosts. The same account also works in the desktop app for Windows, macOS and Linux. iOS: https://apps.apple.com/us/app/xconnect-ssh-rdp-client/id6810... I'd love feedback, especially from people who manage servers from their phone. What's missing? Comments URL: https://news.ycombinator.com/item?id=49758100 Points: 4 # Comments: 0

09/18 07:27

PPPlayer – An open-source music player built with Flutter

lucasveneno

Article URL: https://ppplayer.com Comments URL: https://news.ycombinator.com/item?id=49748159 Points: 3 # Comments: 1

I ported a VB6 game to Flutter and generated all 14 art themes
09/10 21:31

I ported a VB6 game to Flutter and generated all 14 art themes

lioil

Article URL: https://apps.apple.com/cz/app/kirian/id6774868017 Comments URL: https://news.ycombinator.com/item?id=49643435 Points: 3 # Comments: 0

Kelivo: A Flutter LLM Chat Client. Support Mobile and Desktop
09/10 15:37

Kelivo: A Flutter LLM Chat Client. Support Mobile and Desktop

xbmcuser

Article URL: https://github.com/Chevey339/kelivo Comments URL: https://news.ycombinator.com/item?id=49639819 Points: 2 # Comments: 0

09/08 17:08

Arch Linux on a OnePlus 12R, Powered by Denial Wayland and Flutter Compositor

dazhbog

Article URL: https://www.reddit.com/r/mobilelinux/comments/1w80kvt/arch_linux_on_a_oneplus_12r_powered_by_the_denial/ Comments URL: https://news.ycombinator.com/item?id=49607677 Points: 1 # Comments: 0

Show HN: CocoCut – A zero-cloud, 1-second video diary engine built with Flutter
09/06 08:29

Show HN: CocoCut – A zero-cloud, 1-second video diary engine built with Flutter

xcc3641

Article URL: https://cococut.app/en Comments URL: https://news.ycombinator.com/item?id=49582167 Points: 2 # Comments: 1

09/06 02:48

DartNative: Beyond the Limits of React Native and Flutter

iosephmagno

Hi React Native and Flutter devs! We’re launching DartNative, a cross-platform framework for Dart that aims to deliver a truly native look and feel on iOS and Android. Would love to hear what you think. https://x.com/iosemagno/status/2096288716721356974?s=46 Comments URL: https://news.ycombinator.com/item?id=49579471 Points: 1 # Comments: 0

09/06 01:56

GoEven – Free, ad-free group expense splitter built with Go, gRPC, and Flutter

Xainpro

Article URL: https://goeven.app Comments URL: https://news.ycombinator.com/item?id=49578979 Points: 2 # Comments: 0

Show HN: Flutter Starter A production-ready Flutter app boilerplate
08/25 19:50

Show HN: Flutter Starter A production-ready Flutter app boilerplate

Harish_0089

Article URL: https://github.com/GeekyAnts/flutter-starter Comments URL: https://news.ycombinator.com/item?id=49432329 Points: 3 # Comments: 0

08/15 11:31

Flutter_scene 0.21.0 runs 3D apps with Flutter GPU and Impeller

chem83

Article URL: https://xcancel.com/antibot/captcha Comments URL: https://news.ycombinator.com/item?id=49307343 Points: 1 # Comments: 0

08/13 16:32

Flet: Build cross-platform apps in Python, on top of Flutter

theanonymousone

Article URL: https://flet.dev/ Comments URL: https://news.ycombinator.com/item?id=49283154 Points: 1 # Comments: 0

Medium

10 条

Flutter 相关文章精选

Running a Flutter App in GitHub Codespaces
10/18 04:25

Running a Flutter App in GitHub Codespaces

Jackie Moraa

How to set up a full Flutter development environment in the browser for workshops, codelabs, and quick experiments. Continue reading on Medium »

github-codespacescontainersflutterflutter-app-development
I’m a Solo Developer from Pakistan. Here’s How I Built an Islamic App with Flutter
10/18 03:34

I’m a Solo Developer from Pakistan. Here’s How I Built an Islamic App with Flutter

Muhammad Saim

A while ago, I decided to build one app that covered what Muslims use every day: prayer times, Quran, Hadith, Qibla, duas, tasbeeh, and… Continue reading on Medium »

mobile-app-developmentislamfluttermuslim
I Reduced Our Flutter App Size From 55 MB to 11 MB With One Small Configuration Change
10/18 00:25

I Reduced Our Flutter App Size From 55 MB to 11 MB With One Small Configuration Change

Hammad Ali Shah

When you’re building apps for multiple clients, the first solution isn’t always the one that scales. Continue reading on Medium »

mobile-app-developmentflutter-app-developmentflutteroptimization
The real difference between Flutter and native is where you pay
10/17 19:31

The real difference between Flutter and native is where you pay

Mike Salari

I build a full app in Flutter on my own. One real day of fixes showed me where the cost lands, and why it comes up in senior interviews. Continue reading on Medium »

iosswiftswiftuiflutter
Claude Solved a 25-Year-Old Crypto Mystery in Under 30 Minutes — Top 10 AI & Flutter News October…
10/17 19:06

Claude Solved a 25-Year-Old Crypto Mystery in Under 30 Minutes — Top 10 AI & Flutter News October…

Blur Brah Lab

Claude / Anthropic Continue reading on Medium »

technologyclaude-codeaiartificial-intelligence
16,326 Supabase Databases Were Wide Open. 5 Mistakes Vibe-Coded Flutter Apps Ship
10/17 18:41

16,326 Supabase Databases Were Wide Open. 5 Mistakes Vibe-Coded Flutter Apps Ship

ShipWithRathor

Your app’s key is public the day you ship. Here are 5 checks for Supabase and Firebase apps, plus the October 30 change to know about Continue reading on Medium »

mobile-app-developmentprogrammingaiflutter-app-development
Building an AI Agent in Flutter That Can Execute Real Tasks with NestJS
10/17 17:08

Building an AI Agent in Flutter That Can Execute Real Tasks with NestJS

Mosab Youssef "Khaled Abd El Fattah Youssef "

From Chatbots to Action: A Practical Guide to Building a Secure AI-Powered CRM Assistant Continue reading on Medium »

ai-agentnestjsaicrm
API Retries from a Mobile Developer’s Perspective
10/17 16:24

API Retries from a Mobile Developer’s Perspective

Abdelmohaymn Albashier

How backoff, jitter, and idempotency make mobile apps more reliable. Continue reading on Medium »

mobilefluttersystem-design-conceptsbackend-development
React Native vs Flutter in 2026: a practical comparison
10/17 14:41

React Native vs Flutter in 2026: a practical comparison

Piotr

Originally published on devanddeliver.com. Continue reading on Medium »

mobile-app-developmentreact-nativeflutter
Command Pattern in Flutter: Separate UI Actions from Business Logic
10/17 12:15

Command Pattern in Flutter: Separate UI Actions from Business Logic

Faruq Abdul Hakim

When you start building a Flutter Widget, the goal is usually simple: render the UI. Continue reading on Medium »

flutterdesign-patterns

Reddit

5 条

社区日榜讨论与资源

10/18 00:22

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

/u/Sure_Education_828

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. submitted by /u/Sure_Education_828 [link] [comments]

10/17 22:44

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.

/u/aqib_98

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. submitted by /u/aqib_98 [link] [comments]

10/18 02:22

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)

/u/LegitimateItem6658

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: 📉 Drastically Reduce App Size: Immediately locate and purge megabytes of abandoned images, fonts, and heavy dependencies before publishing to Google Play / App Store. ⚡ Faster CI/CD & Build Times: Clean up unreferenced packages and thousands of lines of dead AST syntax that the compiler compiles for nothing. 🛡️ 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). 🪶 Zero External Runtime Dependencies: Lightweight, runs natively on any Dart SDK from 2.17.0 to 3.x / 4.x. 🚦 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! 💬🚀 submitted by /u/LegitimateItem6658 [link] [comments]

10/17 15:15

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

/u/CarQuiet7350

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. submitted by /u/CarQuiet7350 [link] [comments]

10/17 13:04

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

/u/Alarming_Art2119

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 submitted by /u/Alarming_Art2119 [link] [comments]

FAQ

常见问题