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

Flutter Trending

Flutter 趋势

汇总 GitHub、Dev.to、freeCodeCamp、Hacker News、Medium、Reddit 的近期热门内容。

更新时间
06/19 01:24
收录条目
83

GitHub

20 条

Dart 与 Flutter 相关仓库热度

更新于 06/19 01:24

Dev.to

12 条

开发者文章与项目分享

更新于 06/19 01:24
I Built Kalaam: An Arabic Tutor Whose UI Gemini Assembles at Runtime
06/18 23:46

I Built Kalaam: An Arabic Tutor Whose UI Gemini Assembles at Runtime

Sayed Ali Alkamel

TL;DR What it is: Kalaam is an open-source Flutter app where a Gemini model composes each Arabic lesson screen at runtime from a combined catalog of 13 custom Arabic widgets and 14 genui SDK primitives. No fixed screens. No hardcoded lesson flow. Who it is for: Flutter developers building AI-native apps who want a real, runnable reference implementation, not another chatbot wrapper. Run it now (no Firebase, no API key, ~30 seconds): git clone https://github.com/sayed3li97/kalaam.git cd kalaam && flutter pub get dart run build_runner build --delete-conflicting-outputs flutter run --dart-define=KALAAM_DEMO=true Full source: https://github.com/sayed3li97/kalaam Maturity: Alpha. Demo Mode is stable. Live Mode (Gemini calling your Firebase project in real time) requires a setup step documented in the README. What Problem This Actually Solves What Kalaam Is Key Features in Depth How Kalaam Compares The Honest Objection Getting Started in Under 5 Minutes How to Contribute What This Means for Flutter Development Questions developers are actually asking about Kalaam What Comes Next The Catalog Is the New Source of Truth References About the Author Arabic morphology operates on a principle with no real equivalent in English. Almost every word in the language descends from a three-letter root through predictable morphological patterns. The root ك-ت-ب (k-t-b, the concept of writing) produces كَتَبَ (he wrote), كِتَاب (book), كَاتِب (writer), مَكْتَب (office), مَكْتُوب (written). Classical Arab grammarians built complete transformation tables for these patterns. Modern linguists write dissertations about them. The system is elegant, generative, and genuinely hard to teach with a flashcard. Every Arabic learning app I have reviewed responds to this complexity the same way: fixed screens, hardcoded vocabulary lists, a multiple-choice grid that never changes shape, and a next button the AI model has no opinion about. The model, when it appears at all, generates text that lands in a Text widget inside a layout the developer wired months before knowing what the learner would need. The interface is not part of what the model controls. Kalaam takes a different position. Rather than asking a language model to fill in a predetermined form, Kalaam gives Gemini a catalog of real Flutter widgets and lets it decide what to compose. The model reads a JSON schema describing 13 custom Arabic teaching widgets plus 14 genui built-in primitives, then streams an A2UI surface that the GenUI SDK materializes into an actual widget tree on the device. Tap a word node in the root diagram, and the interaction goes back to Gemini as a UserActionEvent. The model then writes whatever surface comes next. The standard architecture for AI-assisted Flutter apps produces code that looks like this: // What most "AI-powered" learning apps actually do final response = await model.generateContent([Content.text(prompt)]); return Text(response.text ?? ''); The model generates text. A fixed UI the developer designed wraps it. The model has no knowledge of what a conjugation table looks like, cannot decide to show a vocabulary carousel instead of a fill-in-the-blank when the learner already knows the words, and cannot react to a tapped word by composing a triliteral root diagram for that specific word. Every state transition was decided at compile time. The architectural gap: A model that only fills Strings into fixed widgets can generate better content. It cannot generate better teaching. Those are different things. The genui Flutter package (A2UI v0.9) addresses this by giving the model a catalog schema and a structured transport protocol. The model emits JSON messages like createSurface and updateComponents that describe a widget tree using catalog item names. The SDK parses those messages and calls each widget's registered widgetBuilder. The developer defines the catalog. The model decides which items to use, with what data, and in what order. Kalaam is a complete, open-source implementation of this pattern for Arabic instruction, with 13 custom CatalogItem widgets covering morphology, vocabulary, phonetics, dialogue, cultural context, and progress tracking. The full source is at https://github.com/sayed3li97/kalaam. Kalaam is a Flutter application where Gemini assembles each Arabic lesson interface at runtime. Pick a scenario (Ordering Coffee, a Cairo market negotiation, a formal business letter), and the model composes a lesson surface: a scene-setter first, then vocabulary cards, a triliteral root diagram, a conjugation table, a quiz, depending on what the learner does and how they answer. The widget sequence is not scripted. The model chooses it. Scenario picker · Root System (ش-ر-ب) · Tap a node to reveal its morphological pattern — every screen composed live by Gemini. I (Sayed Ali Alkamel, @sayed3li97) made one architectural decision early that shaped everything else: representing the entire model-facing contract as typed Dart Cata

flutterdartaiopensource
The biometric authentication loop that took me a while to figure out
06/18 18:40

The biometric authentication loop that took me a while to figure out

Shehabin Sinad S

A Flutter edge case in ChainCare — a blockchain-based medical records system When we added biometric authentication to ChainCare, the basic flow worked fine. User opens the app, fingerprint prompt appears, they authenticate, they're in. Simple enough. The requirement we had was a bit more than that though. We wanted the app to lock whenever the user leaves it — like a banking app would — and require biometric re-authentication when they come back. That's when things got weird. The loop looked like this: User is in the app Fingerprint prompt appears User authenticates successfully Prompt dismisses Another fingerprint prompt immediately appears again Repeat forever The authentication was succeeding — it just kept re-triggering itself. One successful fingerprint scan produced another prompt, indefinitely. The code was straightforward — listen to the app lifecycle, and when the app resumes, authenticate: @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { _authenticate(); // this causes the loop } } Looks reasonable. The problem is in what AppLifecycleState.paused actually means. I assumed paused meant "the user pressed the home button and left the app." That's not what it means. paused fires any time another native layer takes full focus over the Flutter surface. Including the system biometric prompt. So here's what was actually happening: Fingerprint prompt appears → OS takes focus → Flutter fires paused User authenticates → prompt dismisses → Flutter fires resumed The resumed handler fires _authenticate() again New fingerprint prompt appears → loop restarts From Flutter's perspective, there's no difference between the user leaving the app for 10 minutes and the biometric prompt appearing for 2 seconds. Both produce the same paused → resumed sequence. The fix came from a simple observation: a biometric prompt takes 1–5 seconds. A genuine background session — user switches away, checks something, comes back — is almost always longer than that. So instead of re-locking on every resume, we only re-lock if the app was backgrounded for longer than 60 seconds. Anything shorter is treated as a transient OS pause — like the biometric prompt — and ignored. The implementation records a timestamp when the app pauses, and checks elapsed time on resume: static DateTime? _pausedAt; @override void didChangeAppLifecycleState(AppLifecycleState state) { switch (state) { case AppLifecycleState.paused: _pausedAt = DateTime.now(); break; case AppLifecycleState.resumed: _handleResume(); break; default: break; } } Future<void> _handleResume() async { if (_pausedAt != null) { final seconds = DateTime.now().difference(_pausedAt!).inSeconds; if (seconds > 60) { // user genuinely left — re-lock setState(() => _showLockScreen = true); await _authenticate(); } // under 60s — probably the biometric prompt, do nothing } _pausedAt = null; } That's the core of it. Once we added the threshold check, the loop stopped completely. Successful authentication stays successful. The main thing: AppLifecycleState.paused doesn't mean "user left the app." It means "another native layer has focus." If you're building anything that hooks into the lifecycle — lock screens, background timers, session expiry — that distinction matters a lot. The second thing: measuring elapsed time is a lot more reliable than trying to track intent with flags. Setting a _isShowingBiometricPrompt flag before calling local_auth sounds reasonable, but async gaps and exceptions can corrupt it. A timestamp is just a fact — it doesn't depend on your code running in a specific order. This came up during ChainCare, our final-year project — a blockchain-based medical records system. My part was the authentication and session management module. Hitting this bug and finding the fix was probably the most interesting technical problem I worked through during the whole project. If you've hit this loop or something similar, the full ChainCare codebase is on GitHub.

fluttermobilesoftwareprogramming
How I Fixed a Firestore Stream Race Condition That Reverted Task Toggles
06/18 16:56

How I Fixed a Firestore Stream Race Condition That Reverted Task Toggles

Roee Ilouz

I'm building an Android task manager (ROCIs Tasks) with Flutter. The app uses an offline-first architecture: tasks live in Hive locally and sync to Firestore when online. Updates the local Hive store immediately Fires notifyListeners() so the UI updates Sends the write to Firestore asynchronously The problem: the Firestore query filters isCompleted == false. The moment the write reaches Firestore, the task disappears from the stream — which emits a removed event. Meanwhile, the Firestore write hasn't fully propagated, so the snapshot data is stale. The listener processes the stale snapshot, overwrites the local state, and the UI reverts. Here's the timeline: User taps "complete" → Local Hive: isCompleted = true ✓ → UI updates ✓ → Firestore write sent (async) → Firestore stream emits: task removed from "active" query → Listener processes stale snapshot: isCompleted = false → Overwrites local Hive with false ✗ → UI reverts ✗ The entire round-trip happens in milliseconds. The user sees a flash of completion followed by an instant revert. The Fix: _pendingLocalWrites Guard I added a map that tracks recently toggled tasks and their intended state: final Map _pendingLocalWrites = {}; When a task is toggled, I record the intended state before writing to Firestore: Future toggleTaskCompletion(Task task) async { task.isCompleted = !task.isCompleted; task.completedAt = task.isCompleted ? DateTime.now() : null; // Record the intended state so the Firestore stream doesn't revert it _pendingLocalWrites[task.id] = task.isCompleted; notifyListeners(); await _source.addTask(task); _firestoreService.updateTask(task).catchError((e, s) { _errorHandlingService.logError(e, s, reason: 'Background cloud updateTask failed'); }).whenComplete(() { // Allow stream to handle this task again after Firestore write settles Future.delayed(const Duration(seconds: 3), () { _pendingLocalWrites.remove(task.id); }); }); } In the stream listener, I check the guard before processing each event: final pendingState = _pendingLocalWrites[cloudTask.id]; if (pendingState != null) { // We recently toggled this task — don't let stale data revert it if (event.type == SyncEventType.removed && pendingState) { // We just completed this task — the removed event is expected. // Update Hive to reflect completion from the latest snapshot. final (latestTask, isMissing) = await _firestoreService.fetchTaskById(cloudTask.id); if (latestTask != null && latestTask.isCompleted) { await _source.addTask(latestTask); await _cancelTaskNotificationsById(latestTask.id); needsUpdate = true; } continue; } if (event.type != SyncEventType.removed && !pendingState) { // We just uncompleted this task — ignore the stale cloud event. continue; } } After 3 seconds (enough for Firestore to propagate), the guard is removed and normal stream processing resumes. Why 3 Seconds? Firestore writes typically propagate in 100-500ms. I used 3 seconds as a conservative buffer that covers: Slow network connections Firestore replication lag under load The stream batching multiple events It's a tradeoff — during those 3 seconds, genuine cloud updates to that task from other devices are also suppressed. For a single-user task manager, that's acceptable. For a collaborative app, you'd want a more sophisticated conflict resolution strategy. Key Takeaways Firestore streams are great, but they're not instant. The gap between a local write and the stream reflecting it is a race condition window. Offline-first needs local-first UI updates. Updating Hive before sending to Firestore ensures the UI never feels laggy. The stream is for background sync, not for driving the UI. Simple guard maps work. You don't need a full state machine or optimistic concurrency control for most cases. A Map with a TTL is enough. If you have an idea on how to optimize the process, I would love to know!

flutterfirebasearchitecturetutorial
Legacy .ICNS conflict with my Open Source project.
06/18 15:16

Legacy .ICNS conflict with my Open Source project.

Alish Giri

MacOS legacy icon (the AppIcon.icns file) is causing a huge headache on my side! I created flutter_app_icons_generator package with the support for generating app flavors with just one single Dart CLI command. For a new Flutter project the package currently on pub.dev works great. But trying to support the latest industry standard MacOS app icons by replacing the old implementation is getting way over my head. However, changing native Xcode project/build settings has its own set of challenges as they have to be internally wired correctly and I have circumvented most that I encountered with the help of my own old Flutter projects. But the abyss still remains. The problem. Learning the Xcode project files and not the Swift code. As you know, we use the Xcode's user interface to configure Apple related projects (iOS, MacOS, iPads, etc) but we never have to learn the underlying files that is generated and modified under the hood. That's the learning curve I am trying to overcome 🤯. So yeah this is a day in life of an Open Source project.

flutterdart
🚀 Flutter State Management 101: Building an Interactive Counter
06/18 14:18

🚀 Flutter State Management 101: Building an Interactive Counter

Flutter Sensei

Ever wondered why updating a variable in your Flutter code doesn't automatically update the screen? It's a classic roadblock for beginners. Let's break down the fundamentals of State and setState() by looking at a minimal, interactive counter application. If you directly update a private variable inside a button's onPressed block like this: onPressed: () { _counter++; // Quietly changes the value in memory print(_counter); // Prints 1, 2, 3... in the console } The data changes in the phone's memory, but your screen stays frozen at 0. Why? Because Flutter has no idea a change occurred, so it never re-runs the build() method to redraw the UI. setState() To sync your data with your UI, you must use setState(). This built-in function acts as an explicit alarm system for a StatefulWidget, instructing Flutter to immediately repaint the screen with the fresh data. Here is how you implement it cleanly across your interaction controls: ElevatedButton.icon( onPressed: () { setState(() => _counter++); }, icon: const Icon(Icons.add), label: const Text('Increment'), ) ElevatedButton.icon( onPressed: () { if (_counter > 0) { setState(() => _counter--); } }, icon: const Icon(Icons.remove), label: const Text('Decrement'), ) ElevatedButton.icon( onPressed: () { setState(() => _counter = 0); }, icon: const Icon(Icons.refresh), label: const Text('Reset'), ) State is any live data in your app that can change over time while a user interacts with it. setState() is mandatory whenever you change a state variable that the user interface depends on. Performance Tip: Always use the const keyword on static layouts (Padding, SizedBox, static Text) to prevent unnecessary UI redraws and keep your application executing at a smooth 60 or 120 FPS. This is just the surface! Want to see the complete, performance-optimized layout files, folder structures, and step-by-step widget configurations? Read the Full Step-by-Step Tutorial! Flutter State Management Basics | Flutter Sensei Learn Flutter State Management for beginners by building a simple Counter App and understanding how setState updates the UI. fluttersensei.com

flutterdartbeginnersdevelopment
Flutter File Uploads Made Easy: Working with Multipart APIs
06/18 13:00

Flutter File Uploads Made Easy: Working with Multipart APIs

Codexlancers

File uploads are one of the most common requirements in real-world Flutter applications-whether it's uploading profile images, documents, or media files. At our company, we've implemented file upload systems across multiple production apps, and one thing is clear: Most developers don't struggle with the concept-they struggle with clean implementation. In this article, we'll break down Multipart file uploads in Flutter using the latest stable packages in a simple, production-ready way. When sending data to APIs: JSON works for text data Files (images, PDFs, videos) require multipart/form-data This format allows sending: Normal fields (userId, email, etc.) Files (binary data) in a single request. We've used multipart uploads in: Profile image uploads KYC verification documents E-commerce product images Chat attachments Resume uploads dependencies: http: ^1.6.0 image_picker: ^1.2.1 path: ^1.9.1 With the latest image_picker, the API remains stable while ensuring null safety + proper typing. import 'package:image_picker/image_picker.dart'; final ImagePicker _picker = ImagePicker(); Future<XFile?> pickImage() async { try { final XFile? image = await _picker.pickImage( source: ImageSource.gallery, imageQuality: 80, ); return image; } catch (e) { print("Error picking image: $e"); return null; } } The http ^1.6.0 package still uses MultipartRequest, but we'll structure it more cleanly and safely. import 'dart:io'; import 'package:http/http.dart' as http; import 'package:path/path.dart' as path; Future<void> uploadFile(XFile file) async { try { var uri = Uri.parse("https://yourapi.com/upload"); var request = http.MultipartRequest("POST", uri); // Optional fields request.fields['userId'] = "12345"; // File name handling String fileName = path.basename(file.path); // Attach file request.files.add( await http.MultipartFile.fromPath( 'file', file.path, filename: fileName, ), ); // Send request var streamedResponse = await request.send(); // Convert response stream var response = await http.Response.fromStream(streamedResponse); if (response.statusCode == 200) { print("Upload successful"); print("Response: ${response.body}"); } else { print("Upload failed: ${response.statusCode}"); print("Response: ${response.body}"); } } catch (e) { print("Upload error: $e"); } } ElevatedButton( onPressed: () async { final file = await pickImage(); if (file != null) { await uploadFile(file); } }, child: const Text("Upload File"), ) Always validate file size before uploading: if (file.lengthSync() > 10 * 1024 * 1024) { print("File too large (Max 10MB allowed)"); return; } With updated packages, best-practice improvements include: http.Response.fromStream(streamedResponse) path.basename(file.path) Multipart responses come as streams. Ignoring this often results in unreadable output. Some servers reject files without explicit filenames. Image selection can fail or be cancelled by the user. Always validate file size before sending requests. At scale, we always ensure: Validate files before upload Use proper filename handling Convert response streams properly Handle cancelled selections gracefully Keep upload logic separated from UI Use HTTPS only File uploads in Flutter aren't complicated—but implementing them correctly makes a huge difference in production applications. Once you understand how multipart requests work, the workflow becomes straightforward: Pick a file Attach it to a request Send it securely to the server With Flutter's latest stable packages like http, image_picker, and path, it's possible to build a clean and reliable upload system without unnecessary complexity. At our company, this exact approach is used across multiple production apps where performance, maintainability, and reliability are critical.

flutterapi
Cara mengganti icon app di Flutter
06/18 02:33

Cara mengganti icon app di Flutter

Awan

Ada dua cara untuk mengganti icon app: Siapkan file icon (1 gambar PNG minimal 1024×1024px, simpan misalnya di assets/icon.png) Tambahkan package ke pubspec.yaml: dev_dependencies: flutter_launcher_icons: ^0.14.3 flutter_launcher_icons: android: true ios: true image_path: "assets/icon.png" Jalankan: flutter pub get flutter pub run flutter_launcher_icons Selesai, icon otomatis ter-generate untuk semua ukuran. Ganti file PNG di 5 folder ini, harus sesuai ukuran: Folder Ukuran android/app/src/main/res/mipmap-mdpi/ 48×48 px Nama file harus tetap ic_launcher.png.

fluttericonappicon
Stop Watching Random Flutter Tutorials. Follow This Roadmap Instead.
06/18 01:00

Stop Watching Random Flutter Tutorials. Follow This Roadmap Instead.

Flutter Sensei

If you've been learning Flutter for a few weeks—or even a few months—and still don't feel confident building apps on your own, you're not alone. One of the most common patterns I see among Flutter beginners is this: They work hard. Yet when it's time to build something independently, they still feel stuck. Not because they aren't capable. Usually because they're trying to learn too many things at the same time. Flutter has an incredible ecosystem, but that can create a new problem for beginners. Everyone seems to have a different opinion about what you should learn next. State management. None of these topics are bad. The challenge is knowing what matters right now and what can wait until later. Without a roadmap, it's easy to spend months consuming content while making very little progress toward the thing you actually want: Building real apps with confidence. After helping Flutter developers and answering the same questions over and over, I've noticed something interesting. Most beginners don't need more content. They need more clarity. That's what this article is about. One of the biggest traps beginners fall into is believing they need to learn everything before they can start building. That's impossible. Flutter is constantly evolving. Even experienced Flutter developers don't know everything. The goal isn't to learn everything. Once you understand that distinction, your learning process becomes dramatically simpler. Instead of asking: What should I learn next? Ask: What is the minimum I need to learn before I can build something useful? That single question removes a surprising amount of noise. If someone asked me how to learn Flutter from scratch today, this is the roadmap I would recommend. Most beginners want to start with widgets immediately. That's understandable. Flutter is exciting because you can see visual results quickly. However, Flutter becomes much easier when Dart feels natural. Before spending too much time on Flutter itself, become comfortable with: Variables and data types Functions Classes and objects Collections Null safety Async programming You don't need to become a language expert. You simply want to reach the point where reading and writing Dart code feels comfortable. When that happens, Flutter becomes significantly easier to learn because you're no longer trying to learn two things at once. Once Dart feels familiar, focus on understanding how Flutter works. This is where many beginners accidentally slow their own progress. They jump toward advanced topics before fully understanding the fundamentals. Instead, spend time learning: Widgets Widget trees Stateless widgets Stateful widgets Build methods Navigation Project structure These concepts may not feel exciting compared to advanced architecture discussions, but they form the foundation of everything else you'll build. The stronger your foundations, the easier every advanced topic becomes later. If there's one topic I consistently see beginners struggle with, it's layouts. In fact, many developers believe they're struggling with Flutter when they're actually struggling with layout concepts. Questions like: Why is this overflowing? Why isn't this centered? Why does this work on one screen size but not another? Usually point to the same root cause. A weak understanding of Flutter's layout system. Spend time learning: Row Column Expanded Flexible Stack Alignment Constraints Especially constraints. Once constraints click, many of Flutter's most confusing layout behaviors suddenly make sense. And once layouts become comfortable, building UIs becomes dramatically more enjoyable. This is where real learning begins. Tutorials are useful. Projects are transformational. A tutorial shows you what someone else already knows. A project forces you to think through problems yourself. Start small. Build a notes app. Don't focus on building something impressive. Focus on finishing. Every completed project teaches lessons that are difficult to learn from tutorials alone. Provider. One of the most common beginner questions is: Which state management solution should I learn? My answer is usually: Not yet. State management exists to solve a problem. If you haven't experienced the problem yet, the solution often feels unnecessarily complicated. Build a few projects first. As your applications become larger, you'll naturally encounter situations where state becomes difficult to manage. That's the moment to start exploring state management. And when you do, the concepts will make much more sense because you'll understand the problem they're solving. Whenever you're unsure whether to learn something, ask yourself: Will this help me build an app on my own? If the answer is yes, prioritize it. If the answer is no, it can probably wait. It's not a perfect rule. But it's one of the simplest ways to stay focused and avoid getting overwhelmed. Over the years, I've seen the same pattern repeat itself. Talented developers put in the work. They spend the time.

flutterbeginnerslearningmobile
How to Capture HTTPS Traffic on iPhone Without a Mac
06/18 00:59

How to Capture HTTPS Traffic on iPhone Without a Mac

Anh Vu

As a mobile developer, I spend a lot of time debugging API requests. Most of the time, the workflow looks something like this: Open Charles Proxy or Proxyman on a Mac Configure proxy settings Install certificates Connect devices to the same network Start inspecting traffic These tools are excellent and have become essential parts of many developers’ workflows. But recently I found myself in a situation where I only had my iPhone with me. No MacBook. No desktop setup. I simply wanted to inspect HTTPS traffic from a mobile app. That raised a simple question: Why is mobile network debugging still so dependent on desktop tools? ⸻ The Problem Modern mobile applications communicate with dozens of APIs. When something goes wrong, developers often need to inspect: Request headers Authentication tokens Request payloads Response bodies HTTP status codes For years, desktop proxy tools have been the standard solution. The problem is that they assume you always have access to a computer. For quick testing, QA validation, or debugging on the go, that assumption doesn’t always hold true. ⸻ Existing Solutions Today, many developers rely on tools such as: Charles Proxy Proxyman HTTP Toolkit They’re powerful and battle-tested. However, they are primarily designed around a desktop-first workflow. I started wondering what a mobile-first debugging experience would look like. ⸻ Building a Mobile-First Workflow That curiosity eventually led me to build Moni Proxy. The goal wasn’t to replace existing tools. The goal was simply to make network debugging easier when working directly from mobile devices. The core requirements were straightforward: ✅ Capture HTTPS traffic ✅ Inspect requests and responses ✅ Remote debugging support ✅ Minimal setup ✅ Native mobile experience The ideal workflow became: Open Moni Proxy Start a session Connect a device Inspect traffic in real time No desktop required. ⸻ A Typical Debugging Scenario Imagine you’re testing a mobile application and an API call suddenly fails. Without traffic inspection, you’re often guessing: Was the request sent? Did the token expire? Did the backend return an error? Was the payload malformed? Being able to inspect raw requests and responses immediately answers those questions. For mobile developers and QA engineers, this can save a surprising amount of time. ⸻ Lessons Learned Building developer tools is interesting because developers already have good solutions. The challenge isn’t creating another tool. The challenge is improving a specific workflow. In my case, I focused on one question: How can network debugging feel native on mobile devices instead of being an extension of desktop software? The answer is still evolving, but the journey has been incredibly rewarding. ⸻ Looking for Feedback Moni Proxy is now available on iOS and macOS. I’m actively looking for feedback from: iOS Developers Android Developers Flutter Developers React Native Developers QA Engineers What does your current network debugging workflow look like? If you regularly inspect HTTPS traffic, what is the biggest pain point in your setup today? Website: https://moniproxy.com I’d love to hear your thoughts.

aiiosflutterwebdev
Want to Know a QR Code's Error Correction Level? I Built an App That Makes It Easy
06/17 22:08

Want to Know a QR Code's Error Correction Level? I Built an App That Makes It Easy

Ken Kubomi

When creating QR codes, have you ever wondered whether you should use error correction level Q or H for better reliability? Or perhaps you've thought that level L might produce a smaller QR code that's easier to scan. You may also have encountered situations where someone asked you to match the settings of an existing QR code or make it compatible with one generated by another company's software. However, when I actually tried to find out which error correction level an existing QR code was using, I realized there wasn't a simple way to do it. As both a learning project and a practical tool, I decided to build an app that lets you scan a QR code and instantly view its detailed internal information. Simply scanning a QR code reveals information such as: Error correction level (L / M / Q / H) The app also makes decoded text easier to inspect by visualizing ASCII characters and spaces correctly, allowing you to understand the exact contents of the QR code and copy any selected range directly. The app also includes a feature that lets you visually inspect the bit stream stored inside a QR code. You can clearly see how the QR code is structured, including the mode indicator, character count indicator, encoded data, and other bit sequences. This makes it much easier to understand how QR codes are actually encoded internally. Another feature allows you to regenerate a clean PNG or SVG image with exactly the same module layout as the scanned QR code. Even if the original image has become blurry due to printing, JPEG compression, or repeated editing, as long as the app can successfully decode the QR code, it can recreate a clean image with the identical module arrangement. After exporting the image, you are free to change its colors or make the background transparent. Even QR codes with poor image quality like this can be restored, as long as they remain readable. If you'd like to try the app, you can download it here. iOS https://apps.apple.com/app/id6749790356 Android https://play.google.com/store/apps/details?id=jp.samustream.qrparser The app was designed with professional use in mind and does not collect any usage analytics or personal data. Because of this, I have no way of knowing how people are using it. If you have any suggestions, ideas for improvements, or feedback, I'd be delighted to hear from you. Reviews on the app stores are also greatly appreciated. Thank you for reading!

flutteriosandroidmobile
Wind 1.1.0: a Flutter text field with no MaterialApp
06/17 22:03

Wind 1.1.0: a Flutter text field with no MaterialApp

Anılcan Çakır

I was building a screen inside a CupertinoApp last week and dropped a Wind text field into it. It crashed. Wind is utility-first styling for Flutter: you write className strings like p-3 border rounded-lg instead of nesting six widgets by hand. But WInput, the one input widget, still leaned on Material under the hood. Outside a MaterialApp it threw. The workaround was ugly: wrap a Cupertino screen in a MaterialApp just to render one field. So in Wind 1.1.0 I rebuilt it. WInput is now Material-free. WInput used to wrap Material's TextField, which needs a Material ancestor for its theme and ink. Drop it under a CupertinoApp or a bare WidgetsApp and you got a layout exception, not a text field. For a utility-first library that is supposed to style anything, depending on Material to render an input was the wrong shape. // Before 1.1.0: a Wind input outside MaterialApp threw. // The workaround was to nest a MaterialApp just to render one field. CupertinoApp( home: MaterialApp( home: WInput(value: email, onChanged: (v) => email = v), ), ); WInput now renders on EditableText with a plain BoxDecoration border. No Material ancestor required. It works under MaterialApp, CupertinoApp, or a bare WidgetsApp. // After 1.1.0: works directly under CupertinoApp, no MaterialApp. CupertinoApp( home: WInput( value: email, onChanged: (v) => setState(() => email = v), type: InputType.email, placeholder: 'you@example.com', className: 'p-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-sky-500', ), ); One honest caveat: the long-press selection toolbar and handles need an Overlay in the tree. CupertinoApp and MaterialApp both provide one. Under a bare WidgetsApp with no Overlay, typing, cursor movement, and focus all work; only the selection toolbar is suppressed, instead of crashing like before. The other change I am happy with is aliases. Wind ships a token catalog, but every project has shorthands that are not in it. Before, an unknown token was a silent no-op (issue #101): you wrote a class, saw nothing, and could not tell why. Now you register your own shortcuts once, on the theme: WindTheme( data: WindThemeData( aliases: { 'btn': 'px-4 py-2 rounded-lg bg-sky-600 text-white', 'btn-lg': 'btn px-6 py-4 text-lg', // aliases expand recursively }, ), child: const MyApp(), ); Then a bare btn works in any widget, including WDynamic (the server-driven renderer), with no extra wiring: WDiv(className: 'btn', child: WText('Save')); Expansion is bounded three ways (a per-chain cycle guard, a depth cap, and a total-output budget), so a circular or fan-out alias map can never hang the parser. WIcon.foregroundColor: a runtime-dynamic icon color that overrides the text-* class, for state-driven UI. It stays out of the parser cache key, so dynamic colors do not bloat the cache. WInput polish: a readonly state (so readonly: prefixed classes style it), signed-decimal number input that holds on web too, Cupertino-style selection on every platform, dark-mode label pairs on the form widgets, and a disabled field that is genuinely non-interactive. flutter pub add fluttersdk_wind Docs: https://fluttersdk.com/wind https://github.com/fluttersdk/wind/blob/master/CHANGELOG.md If you try it, tell me what breaks in the comments.

flutterdartshowdevui
Building a Real-Time Flutter SDUI Architecture with Stac and Cloud Firestore
06/17 20:00

Building a Real-Time Flutter SDUI Architecture with Stac and Cloud Firestore

Codexlancers

Imagine shipping a major UI redesign, fixing a broken layout, or launching an A/B test on your mobile application instantly - without waiting for App Store or Play Store approvals. In traditional mobile development, the presentation layer is tightly coupled with the client application. If you need to change a button color, adjust padding, or reorganize a screen, you must modify the codebase, compile a new binary, submit it to the stores, and wait hours or days for approval. Server-Driven UI (SDUI) flips this paradigm completely. By moving the presentation structure to the cloud, the backend dictates what to render, while the client app simply focuses on how to render it natively. In this article, we'll explore how to build a production-ready, dynamic interface using Stac (a powerful, open-source SDUI framework for Flutter) backed by the real-time capabilities of Cloud Firestore. Server-Driven UI isn't web-view wrapping. When implemented correctly, it leverages native components driven entirely by lightweight configuration files (typically JSON). Stac (formerly Mirai) bridges the gap between server configurations and Flutter. It allows you to define your layout using an intuitive Dart DSL on the server or raw JSON schemas that map directly to native Flutter widgets like Scaffold, Column, ListView, and ElevatedButton. While Stac manages the transformation from JSON to native Flutter widgets, it needs a fast, scalable delivery mechanism. Cloud Firestore is uniquely suited for this role because: Real-time Synchronization: Firestore can stream layout changes to active clients instantly via listeners. Document-Based Hierarchy: Layout payloads match Firestore's document format perfectly. Robust Caching: Out-of-the-box offline support guarantees that your application remains functional even on unstable networks. Let's walk through implementing a dynamic home screen that updates in real time whenever the Firestore database updates. First, we need to store our layout JSON inside a Firestore collection. Let's create a collection called screens and a document named home_page. Inside the home_page document, add a field called layout of type Map. Here is the Stac-compliant JSON layout structure to insert: { "type": "scaffold", "appBar": { "type": "appBar", "title": { "type": "text", "data": "Dynamic Dashboard" }, "backgroundColor": "#FF6200EE" }, "body": { "type": "center", "child": { "type": "column", "mainAxisAlignment": "center", "children": [ { "type": "text", "data": "Welcome back, Developer!", "style": { "fontSize": 20, "fontWeight": "bold" } }, { "type": "padding", "padding": { "top": 16 }, "child": { "type": "filledButton", "child": { "type": "text", "data": "Explore Offers" } } } ] } } } Add the required dependencies to your pubspec.yaml file: dependencies: flutter: sdk: flutter firebase_core: ^3.0.0 # Use up-to-date compatible versions cloud_firestore: ^5.0.0 stac: ^1.4.0 Initialize both frameworks within your application's entry point (main.dart): import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:stac/stac.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); // Initialize Firebase Ecosystem await Firebase.initializeApp(); // Initialize Stac Configuration Engine await Stac.initialize(); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Stac SDUI', theme: ThemeData(primarySwatch: Colors.deepPurple), home: const ServerDrivenHomeScreen(), ); } } Now, create a widget that listens to the Firestore document stream and passes the data payload directly to Stac's parsing engine. StreamBuilder connected to Firestore, feeding into Stac.fromJson() to parse and generate native components on the fly. import 'package:flutter/material.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:stac/stac.dart'; class ServerDrivenHomeScreen extends StatelessWidget { const ServerDrivenHomeScreen({super.key}); @override Widget build(BuildContext context) { return StreamBuilder<DocumentSnapshot>( stream: FirebaseFirestore.instance .collection('screens') .doc('home_page') .snapshots(), builder: (context, snapshot) { // Handle loading state if (snapshot.connectionState == ConnectionState.waiting) { return const Scaffold( body: Center(child: CircularProgressIndicator()), ); } // Handle errors or missing layout documents gracefully if (snapshot.hasError ||

flutterserverdrivenuifirebase

freeCodeCamp

15 条

教程、指南与实践文章

更新于 06/19 01:24
How to Use DartExceptor: A Lighter Way to Handle Errors in Dart 3
06/18 03:17

How to Use DartExceptor: A Lighter Way to Handle Errors in Dart 3

Oluwaseyi Fatunmole

If you've worked with Flutter for any meaningful length of time, you've likely written this: try { final user = await repo.getUser(); print(user.name); } catch (e) { print('Something went wrong:

DartFluttererror handling
From Flutter to Backend: How to Build Production-Grade REST APIs with Dart and Dart Frog
06/12 08:39

From Flutter to Backend: How to Build Production-Grade REST APIs with Dart and Dart Frog

Oluwaseyi Fatunmole

Dart backend frameworks exist on a spectrum. At the minimal end sits Shelf, with raw primitives and full control. You wire everything yourself. At the maximal end sits Serverpod. It's a full framework

dart_frogFlutterDartbackend
What “Production-Ready” Actually Means in Flutter
06/04 02:02

What “Production-Ready” Actually Means in Flutter

Gidudu Nicholas

I've been building Flutter apps for a few years now, and I still remember the first time I shipped something I was genuinely proud of. It had a clean UI, smooth animations, and every flow worked exact

FlutterDartMobile DevelopmentAndroid
From Flutter to Backend: How to Build and Ship Production REST APIs with Dart and Shelf
06/01 22:11

From Flutter to Backend: How to Build and Ship Production REST APIs with Dart and Shelf

Oluwaseyi Fatunmole

As a Flutter engineer, you already know Dart. You understand async/await, you work with models and repositories, you think in clean architecture, and you have shipped real applications. The gap betwee

Dartbackend developmentsFluttersoftware development
Advanced Error Handling in Dart: Records, Result Types, Monads, and Freezed Exceptions
05/28 05:43

Advanced Error Handling in Dart: Records, Result Types, Monads, and Freezed Exceptions

Oluwaseyi Fatunmole

Every Dart developer has written this at some point: try { final user = await repository.getUser(id); // do something with user } catch (e) { // what is e? who knows. print(e.toString()); } I

DartFluttererror handlingexception
How to Use Dart Cloud Functions and the Firebase Admin SDK: A Handbook for Developers
05/23 02:07

How to Use Dart Cloud Functions and the Firebase Admin SDK: A Handbook for Developers

Atuoha Anthony

There is a specific kind of friction that every Flutter developer who has tried to write a backend has felt. You spend your days writing expressive, null-safe, strongly typed Dart code on the frontend

FlutterDartcloud functionsFirebase
How to Build Production-Ready AI Features with Flutter [Full Handbook for Devs]
05/12 06:38

How to Build Production-Ready AI Features with Flutter [Full Handbook for Devs]

Atuoha Anthony

You've probably seen the demos. A Flutter app, a text field, and a few lines calling the Gemini API – and out comes something that feels like magic. The audience applauds. Your product manager is alre

AIFlutterDarthandbook
Learn Command Line Interface (CLI) Development with Dart: From Zero to a Fully Published Developer Tool
05/09 02:54

Learn Command Line Interface (CLI) Development with Dart: From Zero to a Fully Published Developer Tool

Oluwaseyi Fatunmole

Most developers spend a significant portion of their day in the terminal. They run flutter build, push with git, manage packages with dart pub, and orchestrate pipelines from the command line. Every o

FlutterDartclicommand line
How to Use Mixins in Flutter [Full Handbook]
04/14 05:53

How to Use Mixins in Flutter [Full Handbook]

Atuoha Anthony

There's a moment in every Flutter developer's journey where the inheritance model starts to crack. You have a StatefulWidget for a screen that plays animations. You write the animation logic carefully

FlutterDartflutter-aware
How to Use GraphQL in Flutter: A Handbook for Developers
04/06 22:12

How to Use GraphQL in Flutter: A Handbook for Developers

Atuoha Anthony

There's a moment that most Flutter developers experience at some point in their careers. You're building a screen that needs a user's name, their latest five posts, and the like count on each post. Se

FlutterDartGraphQLhandbook
How to Build AI-Powered Flutter Applications with Genkit Dart – Full Handbook for Devs
04/01 07:21

How to Build AI-Powered Flutter Applications with Genkit Dart – Full Handbook for Devs

Atuoha Anthony

There's a particular kind of frustration that every mobile developer has felt at some point. You're building a Flutter application, and you want to add an AI feature. Perhaps it's something that reads

genkit-dartgenkitAIFlutter
Efficient State Management in Flutter Using IndexedStack
03/31 07:29

Efficient State Management in Flutter Using IndexedStack

Atuoha Anthony

When you're building Flutter applications that have multiple tabs or screens, one of the most common challenges you'll face is maintaining state across navigation without breaking the user experience.

FlutterDartflutter-aware
How to Build a Complete Flutter CI/CD Pipeline with Codemagic: From PR Quality Gates to Automated Store Releases
03/24 08:37

How to Build a Complete Flutter CI/CD Pipeline with Codemagic: From PR Quality Gates to Automated Store Releases

Oluwaseyi Fatunmole

If you've spent any time shipping Flutter apps manually, you already know the drill. Someone on the team finishes a feature, builds the APK locally, signs it (hopefully with the right keystore), uploa

code magicci-cdMobile Developmentmobile app
How to Build a Production-Ready Flutter CI/CD Pipeline with GitHub Actions: Quality Gates, Environments, and Store Deployment
03/19 06:58

How to Build a Production-Ready Flutter CI/CD Pipeline with GitHub Actions: Quality Gates, Environments, and Store Deployment

Oluwaseyi Fatunmole

Mobile application development has evolved over the years. The processes, structure, and syntax we use has changed, as well as the quality and flexibility of the apps we build. One of the major improv

ci-cdFlutterMobile Developmentgithub-actions
Learn How AI Agents Are Changing Software Development by Building a Flutter App Using Antigravity and Stitch
03/12 05:55

Learn How AI Agents Are Changing Software Development by Building a Flutter App Using Antigravity and Stitch

Atuoha Anthony

Software development has always evolved alongside the tools we build. There was a time when developers wrote everything in assembly language. Then higher-level languages arrived and made it possible t

FlutterDartAIGoogle Antigravity

Hacker News

20 条

技术社区讨论与项目链接

更新于 06/19 01:24
Flutter OTA Code Push, Shorebird Alternative Open Source Flutter Patcher
06/08 11:38

Flutter OTA Code Push, Shorebird Alternative Open Source Flutter Patcher

faangguyindia

Article URL: https://github.com/xuelinger2333/flutter_patcher Comments URL: https://news.ycombinator.com/item?id=48441068 Points: 2 # Comments: 1

Flutter: macOS Malvertising Campaign Spreads New FlutterShell Backdoor
06/05 06:55

Flutter: macOS Malvertising Campaign Spreads New FlutterShell Backdoor

brazukadev

Article URL: https://unit42.paloaltonetworks.com/flutterbridge-new-fluttershell-backdoor/ Comments URL: https://news.ycombinator.com/item?id=48405793 Points: 3 # Comments: 0

Shorebird in Anger: A Production Flutter Code Push Integration
06/02 22:57

Shorebird in Anger: A Production Flutter Code Push Integration

mooreds

Article URL: https://about.kikoff.com/build/shorebird-in-anger-a-production-flutter-code-push-integration Comments URL: https://news.ycombinator.com/item?id=48371130 Points: 2 # Comments: 0

I Built the Same App with Five GUI Frameworks: Tauri Slint Egui Dioxus Flutter
06/01 08:59

I Built the Same App with Five GUI Frameworks: Tauri Slint Egui Dioxus Flutter

zero-ground-445

Article URL: https://medium.com/@yalovoy/i-built-the-same-app-with-five-gui-frameworks-tauri-slint-egui-dioxus-and-flutter-for-linux-31bd6f59ff6a Comments URL: https://news.ycombinator.com/item?id=48351490 Points: 4 # Comments: 1

Canonical takes over Flutter desktop maintenance and roadmap
05/31 22:27

Canonical takes over Flutter desktop maintenance and roadmap

redbell

Article URL: https://www.omgubuntu.co.uk/2026/05/flutter-desktop-canonical-maintained Comments URL: https://news.ycombinator.com/item?id=48345927 Points: 4 # Comments: 0

Canonical takes over Flutter desktop maintenance
05/30 22:45

Canonical takes over Flutter desktop maintenance

maxloh

Article URL: https://www.omgubuntu.co.uk/2026/05/flutter-desktop-canonical-maintained Comments URL: https://news.ycombinator.com/item?id=48336823 Points: 5 # Comments: 1

Canonical takes over Flutter desktop maintenance
05/30 03:15

Canonical takes over Flutter desktop maintenance

chrisb

Article URL: https://www.omgubuntu.co.uk/2026/05/flutter-desktop-canonical-maintained Comments URL: https://news.ycombinator.com/item?id=48327937 Points: 7 # Comments: 0

What's New in Flutter 3.44
05/22 16:13

What's New in Flutter 3.44

divan

Article URL: https://blog.flutter.dev/whats-new-in-flutter-3-44-b0cc1ad3c527 Comments URL: https://news.ycombinator.com/item?id=48233274 Points: 2 # Comments: 0

Convert between 30 color formats in one tool (HEX, RGB, Tailwind, Flutter, etc)
05/22 09:06

Convert between 30 color formats in one tool (HEX, RGB, Tailwind, Flutter, etc)

hkdb

Article URL: https://colorcx.com/ Comments URL: https://news.ycombinator.com/item?id=48230724 Points: 2 # Comments: 0

A Firebase Mistake Led to a €3,167 AI Bill Overnight in My Flutter App
05/13 18:56

A Firebase Mistake Led to a €3,167 AI Bill Overnight in My Flutter App

serial_dev

Article URL: https://ulusoyca.medium.com/how-a-two-year-old-firebase-mistake-led-to-a-3-167-ai-bill-overnight-89adfab1dad3 Comments URL: https://news.ycombinator.com/item?id=48120294 Points: 3 # Comments: 1

Show HN: Mathfinity – Mental arithmetic drills against the clock (Flutter)
05/05 18:50

Show HN: Mathfinity – Mental arithmetic drills against the clock (Flutter)

heliskyr2

Article URL: https://github.com/p32929/mathfinity Comments URL: https://news.ycombinator.com/item?id=48020681 Points: 1 # Comments: 0

04/15 17:21

Riches List: Flutter App for Smart Expense Management

freakypoison

Riches List — a modern Flutter-based expense management app designed to simplify how users track spending, manage transactions, shop smarter, and make seamless digital payments. I’m currently looking for support, contributions, and collaboration to help improve the project further. If you’re interested in mobile development, Flutter, UI improvements, feature ideas, or open-source collaboration, your contribution would be highly appreciated. https://github.com/shubham-gaur/riches-list Comments URL: https://news.ycombinator.com/item?id=47776650 Points: 2 # Comments: 0

Popular Flutter GetX repo disappeared briefly
04/15 13:28

Popular Flutter GetX repo disappeared briefly

nativeforks

Article URL: https://github.com/jonataslaw/getx Comments URL: https://news.ycombinator.com/item?id=47775020 Points: 1 # Comments: 0

04/04 04:31

Show HN: Lustre – MCP server giving AI tools premium Flutter components

deltaops

Article URL: https://www.npmjs.com/package/lustre-mcp Comments URL: https://news.ycombinator.com/item?id=47631865 Points: 1 # Comments: 0

What's New in Flutter 3.41
03/31 07:22

What's New in Flutter 3.41

doctaj

Article URL: https://blog.flutter.dev/whats-new-in-flutter-3-41-302ec140e632 Comments URL: https://news.ycombinator.com/item?id=47580930 Points: 2 # Comments: 0

03/16 05:10

Show HN: Flutterby, an App for Flutter Developers

DavidCanHelp

Article URL: https://flutterby.app/ Comments URL: https://news.ycombinator.com/item?id=47391966 Points: 6 # Comments: 1

Google Announces Genkit (Gen AI Library) for Dart and Flutter
03/11 21:06

Google Announces Genkit (Gen AI Library) for Dart and Flutter

pavelgj

Article URL: https://blog.dart.dev/announcing-genkit-dart-build-full-stack-ai-apps-with-dart-and-flutter-2a5c90a27aab Comments URL: https://news.ycombinator.com/item?id=47335067 Points: 3 # Comments: 0

02/28 15:39

Show HN: Can we have Flutter-like portability without the bloated web binaries?

io_eric

I’ve been spending the last few months building Coi, a type-safe language that compiles to WebAssembly. The initial goal was just a fast, reactive web language, but as I refine the core, I’ve started mapping out how to take this multi-platform, mobile, desktop, and server, without falling into the traps that other frameworks have. The plan is to use C++ as the intermediate layer. For desktop and mobile, I want to use Skia combined with a layout library to translate HTML/CSS sizing and transformations into something Skia can draw. This ensures the UI stays pixel-perfect across platforms. However, the "Flutter approach" to the web has always bothered me. Shipping a 2MB+ Skia binary just to render a basic landing page feels redundant when the browser already has a world-class rendering engine. It results in massive bundles and a canvas-only UI that breaks basic browser expectations like SEO, text selection, and accessibility. With Coi, I want to split the strategy: on the web, it stays lean by using the browser’s native HTML/CSS and JS glue. On native platforms, it uses the C++/Skia stack. You get the same codebase and the same visual output, but the web build doesn't suffer from "canvas bloat". Right now, I’m still focused on the web target and refining the core language specs, but the server target is next on the roadmap. I'm curious if this "hybrid rendering" approach, native elements for web, Skia for desktop/mobile, is something others have found success with, or if I'm underestimating the difficulty of keeping the layout engines perfectly synced. I'd love some feedback on the language design or the architectural plan. https://github.com/coi Comments URL: https://news.ycombinator.com/item?id=47191782 Points: 1 # Comments: 4

Show HN: I rebuilt my 13-year-old budgeting app from scratch in Flutter
02/23 16:04

Show HN: I rebuilt my 13-year-old budgeting app from scratch in Flutter

sfluecki-dev

I built BUDGT in 2013 as a broke student who needed one answer: "how much can I spend today without going broke this month?" It divides your monthly budget into a daily allowance — one number, updated in real time as you log expenses. 13 years and thousands of users later, I rebuilt the whole thing from scratch. The original Objective-C app couldn't support what users were asking for (analytics, category budgets), so I moved to Flutter and rewrote every screen. What's different: - Full redesign with a modern UI - Analytics: spending pace, month-over-month, day-of-week patterns, top expenses - Category targets: set limits per category, not just an overall budget - Category drill-down: see exactly where money goes within each category What hasn't changed: - 100% offline. No account, no cloud, no bank connection, no tracking. - All data stays on the device. I literally cannot see your data. - Same daily budget concept — one number, color-coded feedback. The hardest part was migrating existing users' Core Data (SQLite) to the new Drift database without losing any records. Existing users get the update automatically and see a migration flow that moves their entire history. Happy to discuss the technical side (Flutter architecture, Core Data migration, App Store continuity with a full rewrite) or the product side. iOS only: https://apps.apple.com/app/id580812126 Comments URL: https://news.ycombinator.com/item?id=47119396 Points: 2 # Comments: 0

Show HN: A stream-based Flutter audio module with CarPlay/Android Auto
02/23 13:53

Show HN: A stream-based Flutter audio module with CarPlay/Android Auto

paweljanda

Hi! We open-sourced mt_audio, a stream-based audio module for Flutter that wraps just_audio + audio_service behind a single facade. We built this because in multiple production apps (podcast/radio/audiobook-like flows) we kept re-implementing the same glue: background playback, notifications, queue handling, stream/state wiring, and integration edge cases. The goal is a small dependency that gives a consistent API and reduces app-level complexity (no required external state management). Key features: background playback + system notifications queue management (playlist-first workflows) Android Auto & Apple CarPlay support behind the same facade example app + ready UI widgets (Now Playing / controls) Feedback welcome — especially on API shape, missing edge cases, and docs/examples. Comments URL: https://news.ycombinator.com/item?id=47118611 Points: 2 # Comments: 1

Medium

10 条

Flutter 相关文章精选

更新于 06/19 01:24
Why Australian Businesses Are Investing in Custom Mobile Apps in 2026
06/19 01:20

Why Australian Businesses Are Investing in Custom Mobile Apps in 2026

Muhammad Rizwan

In today’s digital-first economy, Australian businesses are rapidly embracing mobile technology to improve customer engagement, streamline… Continue reading on Medium »

flutterartificial-intelligencebusiness-automationsoftware-development
Push a Git Tag. Ship to Google Play. No Human Required.
06/18 23:26

Push a Git Tag. Ship to Google Play. No Human Required.

Muhammad Usman

A complete GitHub Actions workflow for Flutter Android releases: signing, building an AAB, and uploading to the Play Console — automated… Continue reading on Medium »

ciflutterandroidautomation
AGP 9 Ships Kotlin Built-In. Half of Flutter Plugins on pub.dev Will Break When You Upgrade.
06/18 23:01

AGP 9 Ships Kotlin Built-In. Half of Flutter Plugins on pub.dev Will Break When You Upgrade.

Simra Husain

Android Gradle Plugin 9.0 removed the need to apply the kotlin-android plugin. Continue reading on Medium »

programmingsoftware-developmentandroidsoftware-engineering
Becoming an AI Developer: Going Beyond Just Writing Code to Make Effective Use of Artificial…
06/18 21:54

Becoming an AI Developer: Going Beyond Just Writing Code to Make Effective Use of Artificial…

Selin Namak

Over the past few years, a quiet but significant shift has taken place in the world of software development. Continue reading on Stackademic »

flutterdeveloperaimobile-app-development
Flutter 3.44 Is Finally Growing Up — And It’s Bringing Your Apps With It
06/18 21:41

Flutter 3.44 Is Finally Growing Up — And It’s Bringing Your Apps With It

Nicolas

Flutter 3.44 just shipped features developers have been quietly begging for. Here’s the honest breakdown of what’s new, what actually… Continue reading on Medium »

dartflutteriosflutter-app-development
Flutter 3.44 Just Quietly Rewrote the Rules of Cross-Platform Development
06/18 21:36

Flutter 3.44 Just Quietly Rewrote the Rules of Cross-Platform Development

Nicolas

Google’s latest Flutter drop isn’t just an update — it’s a signal. Here’s why developers, CTOs, and startup founders should pay close… Continue reading on Medium »

cross-platformflutterflutter-app-developmentflutter-widget
Flutter. Web-first responsive design
06/18 19:02

Flutter. Web-first responsive design

Yuri Novicow

On desktop — sidebar with all destinations. On phone — bottom navigation bar. On tablet — navigation rail. Continue reading on Easy Flutter »

flutterflutter-navigationflutter-architectureflutter-web
AI’s Big Three Meet World Leaders at G7 — Top 10 AI & Flutter News June 18, 2026
06/18 19:01

AI’s Big Three Meet World Leaders at G7 — Top 10 AI & Flutter News June 18, 2026

Blur Brah Lab

Claude / Anthropic Continue reading on Medium »

artificial-intelligencetechnologyaiclaude-code
The biometric authentication loop that took me a while to figure out
06/18 18:06

The biometric authentication loop that took me a while to figure out

Shehabin Sinad S

A Flutter edge case in ChainCare — a blockchain-based medical records system Continue reading on Medium »

software-engineeringprogrammingmobile-developmentflutter
Becoming Useful in a Bitcoin Open Source Community
06/18 17:22

Becoming Useful in a Bitcoin Open Source Community

Jeremiah Jacob

Code, reviews, tests, and the work behind contributing to Bitcoin open source Continue reading on Medium »

dartrustbitcoinflutter

Reddit

6 条

社区日榜讨论与资源

更新于 06/19 01:24
06/18 12:42

Android has native in-app updates, iOS doesn't - so I built one plugin for both. Just crossed 11k downloads.

/u/buildwithpulkit

TL;DR: Android has a native in-app update flow, iOS has nothing equivalent. I built one Flutter plugin that handles both - native updates on Android, in-app App Store page on iOS - so you don't need two code paths. Just crossed 11k downloads. GitHub: https://github.com/axions-org/in_app_update_flutter Pub Dev: https://pub.dev/packages/in_app_update_flutter Discord (for contributions): https://discord.gg/DCJW88MwdH (this is newly setup, for ease of communication) If you've ever wanted to nudge users to update your Flutter app, you've probably hit this wall: Android has a proper in-app update flow (via Play Core), iOS has nothing equivalent. So on iOS most apps fall back to one of two bad options: A "please update" dialog that deep-links to the App Store, yanking the user completely out of your app. Nothing at all, and just hoping people update eventually. The piece I didn't know for a long time: iOS does let you render the App Store product page inside your own app (via the StoreKit product view). The user can see the listing and tap Update, without ever leaving your app. It's about as close to Android's in-app update experience as iOS allows. It just crossed 11k downloads, which honestly surprised me - so I figured I'd share a few things I learned along the way: You still have to detect that a newer version exists yourself (compare the installed version against your App Store version) - the OS won't tell you - This issue is something I am working on currently, so may be available in future versions. The in-app store view is presentation-only; you decide when and how aggressively to prompt, which matters a lot for not annoying users. Keeping the whole thing inside the app noticeably helped update adoption versus bouncing people to the App Store. I ended up wrapping all of this into a small open-source Flutter plugin so I didn't have to rebuild it per project - it handles the iOS side of the prompt. Happy to share the link in the comments if anyone wants it. Would love feedback from anyone who's solved iOS update prompts differently - curious if there's a cleaner approach I missed. submitted by /u/buildwithpulkit [link] [comments]

06/18 16:12

Relatively new to Flutter and Dart, wondering about limitations

/u/RevdSeymourDollars

Hello, I'm fairly new to this arena; have been in .NET land for decades and recently moved and started working in this to build game ideas I've been sitting on while looking for a job. Flutter seems rather straightforward to develop for and I've been slowly learning more as I just got my first game published on Android...still trying to get all the setup for iOS done but that will hopefully follow soon. So for the one I just built, it didn't really require assets of any sort as it's a music based puzzle game that I managed state with mostly using painters and the regular UI layout kind of stuff. I am wondering how far game development can be pushed with Flutter and Flame, though. The next puzzle game I'm working on does utilize some assets but it's still a puzzle game so not really anything super involved game engine wise. I have a couple more ideas that I want to try though, one being a twist on the Vampire Survivors type of massive enemy wave game and another being a tower defense spin. Are those types of games something that can be done through Flutter/Flame, or would I be better off trying to learn something like Godot to do them? Ideally I want to eventually push them out to both mobile and PC so I like Flutter being able to cover all those, but just don't know at what point it just won't be able to handle what I've got envisioned. Thanks! submitted by /u/RevdSeymourDollars [link] [comments]

06/18 22:15

I built a Flutter roulette wheel package that fixes what bugged me about existing ones

/u/Busy-Cry9256

I recently published my first Flutter package and wanted to share it here. English isn't my first language so sorry if anything reads weirdly! I was building a roulette wheel for a project and tried a few existing packages, but kept running into the same frustrations: Packages that change section width to reflect probability (I wanted equal-sized sections with weighted odds) No control over whether icons/text rotate with the wheel or stay upright Pointer always stuck inside the wheel with no way to adjust its position So I built my own: flutter_custom_roulette What it does differently: Equal section widths with weight-based probability — or optionally proportional widths, your call (weightedSections) rotateWithWheel per item — content can spin with the wheel or always face the user pointerOffset to place the pointer tip anywhere inside or outside the wheel border Drop in any Flutter widget as section content (SVG, Image, Icon, whatever) Built-in RouletteButton with gradient, spin-lock, and custom label support Full border theming with gradient support pub.dev: https://pub.dev/packages/flutter_custom_roulette GitHub: https://github.com/leejia324/flutter_custom_roulette This is my first published package so feedback is very welcome — bugs, missing features, API design thoughts, anything. Thanks for checking it out! submitted by /u/Busy-Cry9256 [link] [comments]

06/18 01:39

From Figma to Typed Dart: Building a DTCG Token Pipeline That Won’t Silently Drift

/u/Small-Lobster

I put together a quick guide on automating our Figma-to-Dart token pipeline to stop manual transcription errors and structural drift. It uses three CI gates to ensure our generated code never falls out of sync. Would love your thoughts: https://medium.com/@farwa/from-figma-to-typed-dart-building-a-dtcg-token-pipeline-that-wont-silently-drift-9e3c6d186d46 submitted by /u/Small-Lobster [link] [comments]

06/18 21:23

AI tools for generating quick UI designs

/u/caffeinatedshots

I’m a developer who is not very good with UI design. I can implement pixel-perfect designs, however I’m not good at generating designs from scratch. I’ve used stitch. Their web designs are nice. But their app designs are based on HTML/css and it shows. I’m looking for something exactly like stitch but based on flutter. Or if there’s something better maybe? I don’t care about the quality of the generated files since I won’t be using them. All code will be handwritten. I just want to generate designs quickly to show clients rough ideas on how their apps might look like and iterate on them quickly before the final design is set. Any suggestions? submitted by /u/caffeinatedshots [link] [comments]

06/18 17:32

I asked AI to build a taglib call for me. flutter_taglib

/u/zgmf300

https://pub.dev/packages/flutter_taglib It helps you read and write music metadata and simplifies permission handling on Android and iOS. It's entirely written in AI (gemini, chatgpt). If you use it for metadata processing, you can save some effort or tokens. Before this plugin, reading and writing music metadata in Flutter was a cumbersome process. Whether using pure Dart or Rust, errors were easily caused by non-standard metadata formats. To address this, I built this taglib plugin, which directly calls the mature metadata reading and writing library taglib, and includes methods to simplify permission management for Android and iOS. Here's a player that uses flutter_taglib; its performance is satisfactory. https://github.com/axel10/vynody submitted by /u/zgmf300 [link] [comments]