24h Intel · 78 条
24小时情报 Flutter 圈正在发生什么
聚合 GitHub、Dev.to、freeCodeCamp、Hacker News、Medium、Reddit 的近期热门内容。
GitHub
20 条Dart 与 Flutter 相关仓库热度
chen08209/FlClash
更新于 07/22 06:32
localsend/localsend
更新于 07/22 06:32
spotiflacapp/SpotiFLAC-Mobile
更新于 07/22 06:09
Predidit/Kazumi
更新于 07/22 06:00
AppFlowy-IO/AppFlowy
更新于 07/22 06:25
flutter/flutter
更新于 07/22 06:46
bggRGjQaUbCoE/PiliPlus
更新于 07/22 01:32
KaringX/karing
更新于 07/22 02:48
KRTirtho/spotube
更新于 07/22 05:39
echo-loop/Echo-Loop
更新于 07/21 23:05
hiddify/hiddify-app
更新于 07/22 06:11
ente/ente
更新于 07/22 06:45
bagisto/opensource-ecommerce-mobile-app
更新于 07/22 03:36
KaringX/clashmi
更新于 07/22 06:06
ImranR98/Obtainium
更新于 07/22 03:29
Sle2p/AniCh
更新于 07/22 01:45
Chevey339/kelivo
更新于 07/22 01:42
simonoppowa/OpenNutriTracker
更新于 07/22 04:36
venera-app/venera
更新于 07/22 03:02
jiangtian616/JHenTai
更新于 07/21 22:10
Dev.to
12 条开发者文章与项目分享
I built a decision app because group chats cannot decide — here is what I learned
Minval Software
The problem I kept noticing the same pattern: six people in a group chat, twenty minutes, zero decisions. Restaurant, movie, weekend plan — the loop always ended with "I don't care, you pick" followed by everyone picking the same thing they picked last time. So I built Choozy, a free Android app whose only job is to end that loop. Spin wheel — add your own options, tap once, done. Coin flip — the classic, but with animation that actually makes you accept the result. Card swipe — swipe through options, only one survives. Group mode — everyone scans a QR, everyone adds options, one spin decides for the whole group. Voice input — say your options instead of typing them. 6 presets — Food, Movie/Series, Activity, Quick Pick, Music, Game. It works offline and ships in 5 languages (Turkish, English, German, Spanish, Portuguese). 1. I built the wheel before I built the presets. 2. Animations are the product. feel final. If the result appears instantly, people re-spin. A two-second deceleration makes the outcome feel decided, and the user accepts it. I spent more time tuning the timing curve than on any other single screen. 3. Offline is a feature, not a checkbox. 4. Group mode is the actual growth loop. Flutter, single codebase, Android first. AdMob for a free tier with an optional ad-free upgrade. No account, no signup, no data collection — which is the other reason people trust it with a group decision. If you have ever let a group chat die over dinner plans: Play Store: https://play.google.com/store/apps/details?id=com.decisionmaker.choozy Web: https://minval.tr/choozy/ Happy to answer anything about the Flutter side, the animation curve, or the QR group flow. What would you have done differently?
Creating Adaptive Flutter Screens and Widgets
Dylan Scott Mickelson
Flutter enables you to deploy a single application across phones, tablets, desktops, and the web. The challenge lies in designing an interface that feels purposeful on each platform. A phone layout stretched across a desktop window wastes space. A dense desktop dashboard squeezed onto a phone becomes hard to use. A truly adaptive interface needs more than flexible widths—it needs the ability to choose a different composition when the available space changes. Material Foundation is a lightweight Flutter package built for exactly that job. To show how it works, it provides two widgets: DynamicLayoutBuilder DynamicScaffold SafeArea and Scaffold. In this tutorial, we will use both widgets to build an interface that responds cleanly across mobile, tablet, and desktop screen sizes. Material Foundation uses the constraints supplied by Flutter's LayoutBuilder. By default, it selects layouts at these boundaries: Available width Layout Breakpoint Parameter Less than 740 px Mobile maxMobileWidth 740–1199 px Tablet maxTabletWidth 1200 px or wider Desktop minDesktopWidth When the available screen width changes, the builder runs again and displays the appropriate widget. All boundary values are customizable, so the package can follow your product's content and design system rather than forcing every app into the defaults. Add the package to pubspec.yaml: dependencies: flutter: sdk: flutter material_foundation: git: url: https://github.com/DylanScottMickelson/material_foundation.git Then fetch the dependency: flutter pub get Import the widget that best fits the level at which you want to adapt the interface: import 'package:material_foundation/dynamic_layout_builder.dart'; import 'package:material_foundation/dynamic_scaffold.dart'; DynamicScaffold The quickest way to create a full adaptive page is to supply three bodies to DynamicScaffold: import 'package:flutter/material.dart'; import 'package:material_foundation/dynamic_scaffold.dart'; void main() { runApp(const MaterialFoundationDemo()); } class MaterialFoundationDemo extends StatelessWidget { const MaterialFoundationDemo({super.key}); @override Widget build(BuildContext context) { return MaterialApp( debugShowCheckedModeBanner: false, title: 'Adaptive Dashboard', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.indigo), useMaterial3: true, ), home: const DashboardPage(), ); } } class DashboardPage extends StatelessWidget { const DashboardPage({super.key}); @override Widget build(BuildContext context) { return DynamicScaffold( backgroundColor: Theme.of(context).colorScheme.surface, mobileBody: const MobileDashboard(), tabletBody: const TabletDashboard(), desktopBody: const DesktopDashboard(), ); } } Each body is a normal Flutter widget. That keeps the adaptive decision separate from the layout details and makes each version easy to read, test, and evolve. Here is a compact mobile layout with a single-column list: class MobileDashboard extends StatelessWidget { const MobileDashboard({super.key}); @override Widget build(BuildContext context) { return ListView( padding: const EdgeInsets.all(16), children: const [ Text('Dashboard', style: TextStyle(fontSize: 28)), SizedBox(height: 16), MetricCard(label: 'Active users', value: '1,284'), MetricCard(label: 'Conversion', value: '8.6%'), MetricCard(label: 'Revenue', value: '\$24.8K'), MetricCard(label: 'Sessions', value: '9,412'), ], ); } } On tablets, the same information can use a two-column grid: class TabletDashboard extends StatelessWidget { const TabletDashboard({super.key}); @override Widget build(BuildContext context) { return GridView.count( padding: const EdgeInsets.all(24), crossAxisCount: 2, childAspectRatio: 2, children: const [ MetricCard(label: 'Active users', value: '1,284'), MetricCard(label: 'Conversion', value: '8.6%'), MetricCard(label: 'Revenue', value: '\$24.8K'), MetricCard(label: 'Sessions', value: '9,412'), ], ); } } Desktop screens have enough room for navigation beside the content: class DesktopDashboard extends StatelessWidget { const DesktopDashboard({super.key}); @override Widget build(BuildContext context) { return Row( children: [ NavigationRail( selectedIndex: 0, destinations: const [ NavigationRailDestination( icon: Icon(Icons.dashboard_outlined), selectedIcon: Icon(Icons.dashboard), label: Text('Dashboard'), ), NavigationRailDestination( icon: Icon(Icons.analytics_outlined), label: Text('Analytics'), ), ], ), const VerticalDivider(width: 1), Expanded( child
Full Disk Access Was On, and macOS Still Refused the App
K M Shahriar Hossain
A Mac app I maintain needs Full Disk Access. It measures disk usage, and most of A permission is granted to an app, and to macOS "the app" is not a name. So the $ codesign --verify --deep --strict --verbose=2 /Applications/Helm.app /Applications/Helm.app: nested code is modified or invalid file modified: /Applications/Helm.app/Contents/Frameworks/App.framework App.framework is where Flutter puts the compiled Dart. Verified on its own it An app's signature seals its contents. Contents/_CodeSignature/CodeResources App.framework, and the bundle held another: seal records Frameworks/App.framework 4ba5cc60… actually there Frameworks/App.framework c7a45621… Contents/_CodeSignature/CodeResources 15:08:47 Contents/MacOS/Helm 15:08:47 Contents/Frameworks/App.framework/…/App 15:30:38 The seal and the executable came from one build. The framework came from a build App.framework in place and never TCC, the part of macOS behind every Privacy & Security switch, does not store A bundle whose nested code does not match its own seal does not validate, and Re-signing the bundle and granting access again fixed it: the app reported Full Two things write a Flutter macOS bundle. A script phase runs macos_assemble.sh embed, which hands off to Flutter's xcode_backend.dart: it App.framework into Contents/Frameworks and signs build 1 clean verify ok seal 23:19:32 App.framework 23:19:31 build 2 one Dart change verify ok seal 23:20:06 App.framework 23:20:05 So it is not simply what an incremental build does, which is what I assumed at What reproduced it, once, was a crash. On a copy of the project, a Swift change error: unexpected service error: The Xcode build system has crashed. Build again to continue. Doing as told, with another Dart-only change: ✓ Built build/macos/Build/Products/Release/Helm.app (47.1MB) $ codesign --verify --strict Helm.app Helm.app: nested code is modified or invalid seal records App.framework dda6dabc96dd actual afaf15310e15 Contents/_CodeSignature/CodeResources 23:22:42 Contents/MacOS/Helm 23:22:42 Contents/Frameworks/App.framework/…/App 23:23:28 The build after the crash ran Flutter's embed step, skipped the app's signing, I can't prove the shipped build went through a crash. I had kept only the last (Reproduced on Flutter 3.47.3, Xcode 26.6, macOS 26.6.2. The shipped build was on Not because the check is subtle. My first theory was that only --deep compares App.framework swapped out: codesign --verify App.framework exit 0 valid on its own codesign --verify Helm.app exit 1 nested code is modified or invalid SecStaticCodeCheckValidity, flags 0 -67021 nested code is modified or invalid No flags needed. Any verification of the app fails it. The release script did not verify at all. Its signing and its verification lived if [[ -n "$SIGN_ID" ]]; then # a Developer ID certificate was found # ...sign every framework, then the app... codesign --verify --strict "$BUILD_APP" fi The app is free and deliberately has no $99-a-year Developer ID, so that branch flutter build had left behind. Sign and verify on every path, and let a failed verification fail the release: if [[ -n "$SIGN_ID" ]]; then SIGN=(--force --timestamp --options runtime --sign "$SIGN_ID") else SIGN=(--force --sign -) # ad-hoc: never notarised, so no runtime or timestamp fi # Inside-out: nested code first, then the bundle that holds it. for fw in "$APP"/Contents/Frameworks/*.framework; do codesign "${SIGN[@]}" "$fw" done codesign "${SIGN[@]}" --entitlements macos/Runner/Release.entitlements "$APP" codesign --verify --deep --strict "$APP" || { echo "signature broken" >&2; exit 1; } Sign with a loop rather than codesign --deep, which Apple advises against for --deep is fine, and with --verbose it names the file And the app now checks itself before telling anyone to relaunch. This goes /usr/bin/codesign, which import Security func bundleValidates() -> Bool { var code: SecStaticCode? guard SecStaticCodeCreateWithPath(Bundle.main.bundleURL as CFURL, [], &code) == errSecSuccess, let code else { return true } // couldn't ask: don't accuse let flags = SecCSFlags(rawValue: kSecCSCheckNestedCode | kSecCSStrictValidate) return SecStaticCodeCheckValidity(code, flags, nil) == errSecSuccess } When access reads as denied and that returns false, the banner stops saying An ad-hoc requirement is the hash of the code, so to TCC every build is a Verify the bundle you ship, on every path. Plain codesign --verify is enough. Never gate the check behind having a certificate: the path without one is the path that always runs. Don't trust ✓ Built after a build that crashed. Build clean, or verify. The build after a crash can succeed at everything except sealing the app. If your app needs a privacy permission, check its own signature before blaming the user. "Relaunch" is sometimes a loop with no
The Costs Cross-Platform Development Solves — and the Costs It Doesn't
Yukiya Nakagawa
In September 2026, Shopify Engineering published an article titled “Native is now the future of mobile at Shopify.” https://shopify.engineering/back-to-native This was significant news. In 2020, Shopify announced that React Native would be the future of mobile development at the company. Shopify has also been a major contributor to the React Native ecosystem ever since. Now, Shopify is moving back toward native development with Swift and Kotlin. Unsurprisingly, this has led to reactions along the lines of “cross-platform development with React Native or Flutter doesn't work after all” or “native is the future.” But that's not really what Shopify's article says. To me, the article is a great opportunity to reconsider a more fundamental question: What costs are we actually trying to reduce when we choose cross-platform development? React Native and Flutter are just tools. If they help, use them. If the trade-off stops making sense, stop using them. So how do we decide whether that trade-off makes sense? Let's establish this first, because it's important. Shopify explicitly looks back at its decision to adopt React Native in 2020 as the right decision for the company at the time. One of the problems Shopify wanted to solve was the cost of implementing the same feature twice for iOS and Android and then keeping those implementations in sync. React Native made it easier to deliver a feature to both platforms from a single implementation. It also made mobile development more accessible to developers whose primary experience was on the web. React Native came with costs of its own, of course: framework upgrades, boundaries between React Native and native code, dependencies on third-party libraries, performance considerations, and so on. Those costs existed in 2020, too. But the benefits of reducing the cost of maintaining two native applications outweighed them. So React Native made sense. In 2026, the equation changed. Shopify has deeply integrated coding agents into its development process. Agents can use an implementation on one platform as a reference for implementing the other, while tests and review systems help maintain behavioral parity between the two. Maintaining two native applications hasn't become free. It has simply become cheaper than it was in 2020. Meanwhile, the costs associated with React Native haven't disappeared. The balance changed. This isn't a story about React Native turning out to be bad. It's a story about the cost structure behind a technology decision changing over time. I've long thought that looking only at “what percentage of our code can we share?” is a poor way to evaluate cross-platform development. Suppose you develop iOS and Android applications independently. The obvious cost is implementation: you might have to write the same screen once in Swift and once in Kotlin. But code isn't the only thing you duplicate. You need to apply specification changes to both implementations, make sure their behavior stays consistent, and synchronize bug fixes. The duplication can even extend beyond engineering. If the UI and workflows differ between platforms, you may need separate support documentation. Customer support staff may need to learn both versions of the product. On the other hand, adopting React Native or Flutter doesn't magically eliminate all of these problems. You still have native APIs and OS updates to deal with. You now have a cross-platform framework to upgrade as well. And when an abstraction leaks, you may eventually find yourself debugging Swift or Kotlin anyway. Technology doesn't magically delete costs. A more useful mental model is: Technology moves costs from one place to another. This is the most obvious one. Instead of implementing the same business logic or UI independently for iOS and Android, you can implement it once as shared code. This is also an area where coding agents are particularly effective. If an agent can take an iOS implementation and produce the corresponding Android implementation, the relative advantage of sharing the code itself becomes smaller. But reducing the cost of producing code is not the same as reducing the cost of maintaining that code. For some projects, I think this is even more important than implementation cost. When you have two codebases, you need to continuously maintain the condition that they implement the same specification. A feature or bug fix can accidentally land on only one platform. Two developers can interpret the same requirement slightly differently. If the relevant code is shared, this class of problem becomes much smaller within the shared portion. Shopify shows us another way to reduce this cost. If you can combine coding agents, tests, reviews, and development infrastructure to maintain parity between two implementations, synchronization can become cheaper even without shared application code. But the important point is that simply introducing a coding agent does not make synchronization costs disappear. Shopify i
Architecting Real-Time Inventory & Cross-Platform Logistics in Flutter
Ebad Malik
Building modern cross-platform logistics applications requires balancing real-time state synchronization with offline resilience. When delivery fleets and warehouse teams operate in areas with intermittent connectivity, standard REST request-response cycles fail, leading to order desynchronization and cart friction. At Inventor Design Studio, our engineering team recently architected a high-throughput mobile ordering and logistics management system using Flutter and Dart. In this teardown, we analyze the architectural decisions, state management strategies, and local caching models implemented in our Bakery Faize Flutter Case Study. Logistics applications present three concurrent engineering constraints: Zero Data Loss on Disconnect: Orders created offline must persist locally and reconcile seamlessly upon reconnection. Instant UI Feedback: Warehouse dispatchers and customers expect optimistic UI state transitions without network latency spinners. Cross-Platform Parity: A single codebase powering iOS, Android, and web dashboards with native 60fps rendering performance. To isolate business logic from UI widgets, we implemented the BLoC (Business Logic Component) pattern backed by reactive Dart Streams: // Stream-driven Order State Management abstract class OrderState extends Equatable { const OrderState(); } class OrderInitial extends OrderState {} class OrderSyncing extends OrderState {} class OrderSynced extends OrderState { final List<OrderItem> orders; const OrderSynced(this.orders); } class OrderBloc extends Bloc<OrderEvent, OrderState> { final OrderRepository repository; OrderBloc({required this.repository}) : super(OrderInitial()) { on<CreateOrderEvent>((event, emit) async { emit(OrderSyncing()); try { await repository.saveOrderOptimistic(event.order); final currentOrders = await repository.getCachedOrders(); emit(OrderSynced(currentOrders)); } catch (error) { emit(OrderError(error.toString())); } }); } } By decoupling UI events from the network transport layer, the interface remains smooth and responsive even during heavy background sync operations. To guarantee data integrity across distributed delivery drivers, we established a bidirectional sync pipeline: [ User Action / New Order ] │ ▼ [ Local SQLite Database (Instant Commit) ] ──► [ Optimistic UI Update (0ms) ] │ ▼ (Background Worker) [ Connectivity Listener & WebSocket Queue ] │ ┌─────┴─────┐ ▼ ▼ (Online) (Offline) │ │ ▼ ▼ [ Push to API ] [ Retain in Pending Sync Queue ] Local SQLite Persistence: Every order transaction writes to local SQLite before triggering any network I/O. Optimistic UI Execution: The UI renders the order status as confirmed immediately. Queue Reconciliation: When the connectivity stream detects internet restoration, queued mutations are batched and pushed over secure WebSockets with idempotency keys. Maintain Single Source of Truth: Treat local storage as the primary data store and the remote API as a synchronization target. Micro-Interactions Matter: Fluid transitions and skeleton loading states dramatically improve perceived speed and operational efficiency. For the complete technical breakdown, visual UI design system, and business outcome metrics, explore our full Bakery Faize Cross-Platform Case Study on Inventor Design Studio.
Flutter's State Management and…
Norvik Tech
Originally published at norvik.tech Explore the technical underpinnings of Flutter's context management and how it enhances reactive app development. Flutter's approach to state management hinges on the concept of context. In traditional frameworks, developers often encounter what's termed as the widget builder tax, where each state change necessitates a new widget build. This can lead to performance bottlenecks, especially in larger applications. With the introduction of context.value and context.state, Flutter aims to create a more intuitive and efficient means of managing state without the overhead of extensive widget rebuilding. According to recent findings, this symmetry between containers and BuildContext is pivotal in enhancing the developer experience and app responsiveness. [INTERNAL:flutter-development|Understanding Flutter Development] Context Management: The way Flutter handles data flow within its widget tree. Reactive Programming: A paradigm centered around data streams, enhancing UI responsiveness. context.value and context.state are not just enhancements; they represent a paradigm shift in how developers build applications. The reduction of closure fatigue allows developers to manage their code more effectively, mitigating common pitfalls associated with nested closures. Faster Prototyping: Teams can develop MVPs more rapidly due to reduced boilerplate code. Error Reduction: Simplified state access leads to fewer bugs during development phases. A startup developing a real-time chat application utilized context symmetry to streamline their message rendering logic, resulting in a 30% reduction in development time. context.value and context.state can be particularly useful in scenarios involving complex UI interactions or high-frequency updates, such as dashboards or real-time data feeds. Industries such as finance, healthcare, and e-commerce can leverage these enhancements to improve user experiences and operational efficiency. Financial Dashboards: Real-time data visualization with minimal latency. Healthcare Apps: Managing patient data dynamically without cumbersome refresh cycles. E-commerce Platforms: Seamless inventory updates in a reactive manner. A healthcare app integrating patient monitoring utilized these features to ensure real-time updates without unnecessary UI flickers, enhancing user satisfaction. For companies operating in LATAM and Spain, adopting Flutter's new context management features can be transformative. The local tech ecosystem often faces challenges such as slower adoption rates and smaller team sizes. By implementing these improvements, businesses can significantly reduce their development timelines and improve their product offerings. In Colombia, the integration of efficient state management can cut down project timelines by weeks, leading to faster market entry. For Spanish companies, leveraging these tools can enhance their competitiveness against larger firms by optimizing resource allocation. Adopting these features may require initial investment in training but will yield significant ROI through reduced development costs and faster time-to-market. As your team evaluates the potential integration of Flutter's new features, consider initiating a pilot project that focuses on a specific use case relevant to your business. Norvik Tech specializes in guiding teams through this process by ensuring that hypotheses are tested rigorously before full-scale implementation. This approach not only minimizes risk but also maximizes learning outcomes. Identify a small project where context management can be applied. Establish clear metrics for success (e.g., performance improvements or reduced code complexity). Collaborate with cross-disciplinary teams to document decisions throughout the pilot phase. Evaluate outcomes before scaling up the implementation. By following these steps, your team can confidently navigate the transition to enhanced state management in Flutter. The symmetry introduced by context.value and context.state allows for faster data access without unnecessary widget rebuilds, which improves overall app responsiveness. Industries like finance, healthcare, and e-commerce gain significant advantages from enhanced context management due to their reliance on real-time data updates and user interactions. Norvik Tech builds high-impact software for businesses: development consulting 👉 Visit norvik.tech to schedule a free consultation.
I Built ai_guardrails: Local-First Safety for Dart and Flutter AI Apps
Sagar Ghag
AI features in Dart and Flutter apps usually start with a provider call. That is also where a few uncomfortable questions begin: Does a user prompt contain an email address, card number, or API key? Is retrieved RAG content trying to override the system prompt? Is streamed output about to leak a secret or produce unsafe tool-call arguments? Can we add these protections without sending user data to another service? I built ai_guardrails to make those checks a small, local layer around any LLM integration. It is a pure-Dart, provider-agnostic package for Dart and Flutter. It has no runtime dependencies and does not make network calls by itself. Use it with OpenAI, Gemini, Anthropic, a local model, or your own HTTP gateway. Create a scanner chain for input and output, then wrap the call you already have: import 'package:ai_guardrails/ai_guardrails.dart'; final guard = AiGuard( inputScanners: [ PiiScanner(action: GuardAction.redact), SecretScanner(), PromptInjectionScanner(threshold: 0.5), InvisibleTextScanner(), ], outputScanners: [ RepetitionScanner(), SchemaValidator({ 'type': 'object', 'required': ['answer'], 'properties': { 'answer': {'type': 'string'}, }, }), ], ); final outcome = await guard.run( input: userMessage, llmCall: (sanitizedInput) => myLlm.complete(sanitizedInput), ); if (outcome.blocked) { print('Blocked at ${outcome.blockedStage}: ${outcome.blockReason}'); return; } print(outcome.output); Redacting scanners run in order, so the model receives the final sanitized input. If an input scanner blocks, the provider call never happens. ai_guardrails includes local heuristic scanners for common LLM-risk surfaces: PII detection and redaction across US, EU, India, Brazil, Mexico, Japan, South Korea, Canada, and Australia Secret detection for API keys, tokens, JWTs, and private-key blocks Prompt-injection, Unicode-smuggling, suspicious URL, and padding-attack detection Generated-code, SQL, HTML, JSON, URL, numeric-range, and choice validation Tool-call validation and tool-output scanning for agentic workflows RAG retrieval scanning, streaming response scanning, multi-turn escalation, and declarative conversation flows Policy profiles, JSON configuration, audit logs, metrics, OpenTelemetry-compatible tracing, benchmarking, and red-team probing The package also supports optional async scanners. Semantic checks such as fact checking, topic safety, hallucination checking, and embedding grounding use callbacks you provide, so the core package stays provider-neutral. For many chat experiences, redacting PII before it leaves the device is the safe choice—but users still expect a natural response. ai_guardrails supports a round trip for that case: final guard = AiGuard( inputScanners: [PiiScanner(action: GuardAction.redact)], ); final outcome = await guard.run( input: 'Email alice@example.com about the release.', llmCall: myLlm.complete, ); // The model sees: "Email [EMAIL_1] about the release." // outcome.output can restore the placeholder for the app. // outcome.rawOutput preserves the model's pre-rehydration response. That behavior is deliberate and should be used only where returning the original value to the user is appropriate. The redaction map and raw output remain available when an application needs tighter control. LLM safety does not end at a chat textbox. The package has first-class stages for the inputs an application assembles around a model call: // Drop poisoned or unsafe RAG chunks before prompt assembly. final retrieval = await guard.runRetrievalStage(retrievedChunks); // Scan untrusted tool results before returning them to the model. final toolResults = await guard.runToolOutputStage([ ToolOutput(toolName: 'search', content: untrustedSearchResult), ]); For streaming applications, StreamingAiGuard scans complete response segments as they arrive and ends the stream when a scanner blocks. For whole-document rules such as JSON schema validation, run a final full-output pass after the stream completes. The built-in local scanners are deterministic heuristics. They are intentionally fast, offline, and inexpensive, but they do not understand every meaning, evasion, or cultural context. Treat them as defense in depth, not as a compliance certification or a substitute for application authorization. For semantic checks, the package exposes callback boundaries rather than embedding a provider SDK. Your app decides whether to use an on-device model, a private endpoint, or a cloud model—and owns the associated privacy and cost choices. dart pub add ai_guardrails The package is open source under Apache-2.0. The README includes provider examples, configuration-driven policies, and a full scanner reference. Package on pub.dev Source code and issue tracker I would especially love feedback from teams building Flutter copilots, RAG search, local-model experiences, and agentic tools. What safety checks are you current
iOS Development IDEs: Xcode and KXApp Lightweight Alternatives
ObjC_Coder
I used to think Xcode was the only path for iOS development — until a colleague on the Flutter team complained about how heavy Xcode is: a single install eats up tens of gigabytes, and most of its features go unused when you're just writing Flutter code day to day. That's when I realized how much IDE needs vary across project types and development scenarios. Here's a comparison of the two approaches. Xcode is Apple's official iOS IDE, covering the entire workflow: coding, debugging, performance analysis, packaging and App Store submission, and certificate management. It's undeniably powerful, but it comes with several clear pain points: The installer is over ten gigabytes, and every major version update means re-downloading the full package from the App Store — painful when you're short on disk space. Sometimes you just want to change a few lines of code and still have to wait for it to finish loading. Configuring certificates and provisioning profiles before real-device debugging is not beginner-friendly: just understanding Provisioning Profiles and code signing takes a lot of time, and going from registering an account to running your first app on a real device can take a day or two. In cross-platform projects (Flutter, uni-app), most Xcode features go unused while writing Dart, yet the disk footprint and IDE load time are no smaller. For teams doing pure native Swift or ObjC development on Macs, Xcode is the natural choice — its integration of performance and debugging tools genuinely has no replacement today. But for cross-platform work, or for beginners still learning Swift, Xcode's learning curve is a bit steep. KXApp positions itself as a lightweight iOS IDE: no need to install Xcode or the Command Line Tools, since it ships with a complete compilation toolchain. When creating a project, pick Swift, Objective-C, or Flutter, and it generates a standardized project structure in one click — no manual template setup. The VS Code–based coding interface feels familiar and smooth, with intelligent completion and an AI coding assistant available out of the box. Real-device debugging is where KXApp shines: connect your iPhone to the computer, click Build and Install, and the tool compiles, signs, and installs the app on the phone directly. No need to configure certificates and provisioning profiles yourself, and no need to open Xcode's Organizer to set up signing. For newcomers to iOS development, or for people who mainly write code on Windows, this workflow saves a lot of detours. It also supports Flutter projects, so cross-platform developers can manage both the native layer and the Flutter layer in a single iOS IDE without opening Xcode separately just to debug the iOS side. Build and packaging are built in too, so no extra tools are needed. When the project is done, build an IPA in one click for test distribution or App Store submission. No single iOS IDE does everything. Xcode suits deep native development, scenarios requiring Instruments tuning, or team workflows that rely on Apple ecosystem services such as Xcode Cloud. KXApp suits getting started quickly, lightweight development, cross-platform projects, or situations where you don't want to burn energy on toolchain configuration. Keeping both around is no conflict — just switch based on project type. Open Xcode when writing native Swift code or doing in-depth performance analysis, using Instruments to pinpoint problems. Use KXApp when maintaining Flutter projects, quickly validating an idea, or writing small day-to-day tools, since startup and compilation are faster. Playing to each one's strengths is far more flexible — and far more practical — than fixating on a single iOS IDE.
Offline-First Flutter Architecture
ROCI
Deep dive into offline caching with Hive and SQLite.
Flutter AI waste classification app: On-Device for bank-sampah
Umair Bilal
This article was originally published on BuildZn. Everyone talks about integrating AI, but nobody explains how to actually get an on-device model into a real-world Flutter app without blowing up the bundle size or draining the battery. I spent a week trying to get decent performance with a cloud API for a similar project, and honestly, the latency and recurring costs were a nightmare. Here's what actually worked, specifically for adding a Flutter AI waste classification app feature to bank-sampah. bank-sampah Needs a Flutter AI Waste Classification App Look, bank-sampah is a solid open-source project. It tackles a real problem: local waste management and recycling incentives. But here’s the thing — manually identifying and categorizing waste? That's a bottleneck. Users gotta know what's recyclable, what's not, and which bin it goes into. That's where a Flutter AI waste classification app feature becomes a game-changer. We're not just adding a shiny new button. We're solving a core user experience issue. Users can snap a pic, and boom, instant classification. This increases engagement, reduces errors, and makes the whole system more efficient. It's about empowering the user, not just collecting data. And for clients, this means higher adoption and clearer ROI. bank-sampah Forget hitting a server for every classification. For this type of problem, low latency is critical. Waiting 500ms for a round trip to identify a plastic bottle is just bad UX. Honestly, relying solely on cloud-based CV APIs for basic waste classification is overkill and expensive for a project like bank-sampah. On-device TFLite models, even if slightly less accurate out-of-the-box, offer superior latency and cost savings for this specific use case, especially with a targeted dataset. Here's the architectural blueprint for integrating an on-device AI Flutter example into bank-sampah: Image Capture/Selection: Use image_picker to let users take a photo or select from their gallery. bank-sampah already has image handling, so we're just extending it. TFLite Model Integration: We'll use tflite_flutter for running our pre-trained model. The model itself will be a mobilenet_v3_small_1.0_224_1_metadata_1.tflite model (or similar, fine-tuned for specific waste categories). I found this variant strikes a good balance between size and accuracy for mobile. Labels (labels.txt) mapping model output indices to actual waste categories (e.g., "Plastic", "Paper", "Organic"). Image Pre-processing: Before feeding to the model, the image needs to be resized to the model's input dimensions (typically 224x224 pixels) and normalized. The image package in Dart is great for this. Inference: Run the pre-processed image through the TFLite model. Post-processing & UI: Interpret the model's output, display the classification, and suggest the appropriate bank-sampah category. This on-device AI Flutter example keeps inference local, fast, and doesn't hammer your backend or your AWS bill. It’s a crucial aspect for any Flutter open source AI initiative. bank-sampah AI Feature: Step-by-Step Let's get into the code. We'll focus on the core AI integration logic. Assume bank-sampah already handles user authentication and basic data storage with Firebase. 1. Add Dependencies First, crack open pubspec.yaml and add these: dependencies: flutter: sdk: flutter image_picker: ^1.0.4 # For picking images tflite_flutter: ^0.10.4 # Core TFLite integration tflite_flutter_helper: ^0.3.1 # Handy for image processing and model input path_provider: ^2.1.1 # To get app's local directory for models logger: ^2.0.2 # For better logging during debugging Run flutter pub get. 2. Prepare Your Model and Labels Download a suitable TFLite model. For waste classification, you'd typically fine-tune a pre-existing image classification model like MobileNetV3 or EfficientNet Lite on a dataset of waste images (e.g., TrashNet). For this bank-sampah AI feature, let's assume you have: assets/models/waste_classifier_v1.tflite assets/models/waste_labels.txt Add these to your pubspec.yaml assets section: flutter: uses-material-design: true assets: - assets/models/waste_classifier_v1.tflite - assets/models/waste_labels.txt 3. The WasteClassifier Class This class will encapsulate all our TFLite logic. import 'dart:io'; import 'dart:typed_data'; import 'package:flutter/services.dart'; import 'package:image/image.dart' as img; import 'package:tflite_flutter/tflite_flutter.dart'; import 'package:tflite_flutter_helper/tflite_flutter_helper.dart'; import 'package:logger/logger.dart'; class WasteClassifier { Interpreter? _interpreter; List<String>? _labels; final Logger _logger = Logger(); // Model input/output details static const int inputSize = 224; // e.g., 224x224 static const int outputSize = 6; // Number of waste categories // Initialize the classifier Future<void> loadModel() async { try { _interpreter = await Interpreter.fromAsse
The Symmetry of State: Why Flutter Deserves context.value and context.state
Randal L. Schwartz
The State Access Dilemma in Flutter Executive Summary: For more than six years, Flutter developers have wrestled with how to cleanly read state from the widget tree. Teams were forced to choose between the indentation tax of the "Builder Pyramid" (BlocBuilder nesting) and BuildContext extensions (context.watch, context.select) that carried subtle whole-tree rebuild traps or heavy closure boilerplate. By establishing an elegant 1:1 architectural symmetry between state containers and the widget tree—introducing context.value, context.state, and zero-closure provider tearoffs—BlocSignal eliminates the ceremony. Here is why Flutter state consumption should have always worked this way. Every Flutter developer knows the feeling of writing a clean business logic component, only to watch the presentation layer devolve into nested boilerplate: // The classic Flutter BLoC indentation tax: class CartSummaryCard extends StatelessWidget { const CartSummaryCard({super.key}); @override Widget build(BuildContext context) { return BlocBuilder<UserCubit, UserState>( builder: (context, userState) { return BlocBuilder<CartCubit, CartState>( builder: (context, cartState) { final discount = userState.isVip ? cartState.subtotal * 0.20 : 0.0; final total = cartState.subtotal - discount; return Card( child: Padding( padding: const EdgeInsets.all(16), child: Text('Total: \$${total.toStringAsFixed(2)}'), ), ); }, ); }, ); } } What is conceptually a simple read of two state values turns into two layers of widget indentation, two anonymous builder closures, and two context shadowing levels. To avoid this "Builder Pyramid," the community turned to BuildContext extensions. But as teams adopted context.watch and context.select, they encountered an entirely new class of performance pitfalls and developer confusion. To appreciate the modern solution, we must examine the three distinct pain points that have plagued contextual state consumption in Flutter. BlocBuilder BlocBuilder works by inserting an internal StatefulWidget into the element tree that subscribes to the BLoC's underlying Dart Stream. While reliable, it forces every state-dependent piece of UI into an explicit builder closure. When a screen depends on multiple state containers (for example, user authentication, shopping cart items, theme preferences, and localized settings), nesting builders produces severe "pyramid of doom" indentation. Refactoring a widget to depend on one additional piece of state requires wrapping large chunks of widget hierarchy, causing noisy git diffs and fragile layout structures. context.watch Mental Model Trap To escape BlocBuilder, classic flutter_bloc introduced context.watch<B>(). But context.watch introduces a dangerous performance trap: it rebuilds the entire enclosing widget whenever any state emits from the BLoC. @override Widget build(BuildContext context) { // ⚠️ TRAP: Subscribes the ENTIRE widget to every CartState emission: final cart = context.watch<CartCubit>().state; return Scaffold( appBar: AppBar(title: const Text('Store')), body: Column( children: [ const HeavyDashboardHeader(), // Rebuilds unnecessarily! const PromotionalBanner(), // Rebuilds unnecessarily! Text('Cart Items: ${cart.items.length}'), const ProductListView(), // Rebuilds unnecessarily! ], ), ); } Even if you only needed cart.items.length in a single Text widget, the entire Scaffold, its AppBar, and every heavy child widget rebuild on every emission. When reactive signal engines emerged, this trap became even more confusing. In bloc_signals_flutter, state updates propagate synchronously via fine-grained signals rather than Stream-backed InheritedWidget mutations. Consequently, context.watch<B>() was implemented to track container instance swapping only (ensuring inherited dependencies update when a parent widget swaps container instances), not state emissions. Developers coming from classic flutter_bloc who wrote: final count = context.watch<CounterCubit>().stateValue; walked straight into an architectural trap: their UI never rebuilt on state emissions. Because context.watch only checks container instance identity (bloc != oldWidget.bloc), state mutations were silently ignored by the widget element. context.select To solve whole-widget rebuilds, libraries introduced context.select: final count = context.select<CounterCubit, int>( (cubit) => cubit.stateValue.count, ); While context.select provides surgical, fine-grained rebuilds, it imposes heavy syntax friction. For every single value you want to display, you must provide: The container type generic (CounterCubit). The return type generic (int). An anonymous extraction lambda (cubit) => cubit.stateValue.count. When writing modern Flutter code, writing (c) => c.
Automate Flutter Releases with Shorebird + GitHub Actions (Skip App Store Review)
Samuel Adekunle
A real pain point for mobile apps is waiting days or weeks for App Store and Play Store reviews whenever you need to ship a fix or a small update to users. That exact problem is what we are solving in this article. I’ll show you exactly how to automate your Flutter releases and patches using Shorebird and GitHub Actions, so you can push updates to users in minutes instead of waiting for store review. We are going to create a clean, production-ready CI pipeline for both full releases and instant code-push updates. Before we start, here’s what you need: A Shorebird account and an app already set up with Shorebird Shorebird CLI installed and logged in on your machine A Flutter project that already has Shorebird initialized A GitHub repository Basic understanding of GitHub Actions If you haven’t set up Shorebird in your Flutter app yet, check out my video on YouTube on how to set up Shorebird. This article assumes that’s already done. The first thing we need is authentication so GitHub Actions can talk to Shorebird. Go to the Shorebird Console → Account → API Keys → Create API Key. Give it a clear name, e.g “GitHub Actions”, choose an expiration, and set the required permissions. Copy the key immediately because you won’t see it again. Now go to your GitHub repository → Settings → Secrets and variables → Actions → New repository secret. Name it exactly: SHOREBIRD_TOKEN Paste the key and save. This token will be available in all your workflows as ${{ secrets.SHOREBIRD_TOKEN }}. That’s the only authentication step you need. Shorebird provides three official GitHub Actions that make life much easier: shorebirdtech/setup-shorebird@v1 — installs Shorebird on the runner shorebirdtech/shorebird-release@v1 — creates a release shorebirdtech/shorebird-patch@v1 — creates a patch I strongly recommend using these instead of calling the CLI manually. They’re cleaner and maintained by the Shorebird team. Let’s build the release workflow first. Create a new file in your project: .github/workflows/shorebird-release.yml Here’s the structure: Trigger on version tags: v1.0.0, v1.2.3, etc. or manually trigger the workflow Set the SHOREBIRD_TOKEN as an environment variable Pin your Flutter version (very important) Checkout the code Set up Java for Android (or Xcode signing for iOS) Set up Shorebird with caching Decode your keystore/certificates from secrets Run the official shorebird-release action Upload the APK, AAB, or IPA as artifacts I’ll show both Android and iOS versions. For Android, the key steps are decoding the keystore and creating the key.properties file from secrets. GitHub Secrets You Need to Add for Android Go to GitHub → repo → Settings → Secrets and variables → Actions → New repository secret Secret name - Value ANDROID_KEY_ALIAS - your_key_alias ANDROID_KEY_PASSWORD - your_key_password ANDROID_STORE_PASSWORD - your_store_password ANDROID_KEYSTORE_BASE64 - run `base64 -i ~/path/to/upload.jks | tr -d '\n' | pbcopy` The keystore base64 will be copied to your clipboard; paste it into GitHub Secrets GitHub Secrets You Need to Add for iOS Go to GitHub → repo → Settings → Secrets and variables → Actions → New repository secret Secret name - Value IOS_CERTIFICATE_BASE64 - base64 of your .p12 IOS_CERTIFICATE_PASSWORD - Password you set when exporting the .p12 IOS_PROVISIONING_PROFILE_BASE64 - base64 of com.example.app profile For iOS, you need to import the certificate and provisioning profile into a temporary keychain. # IOS_CERTIFICATE_BASE64 - export your .p12 from Keychain Access first, then: base64 -i ~/path/to/distribution.p12 | tr -d '\n' | pbcopy # IOS_PROVISIONING_PROFILE_BASE64 - download from Apple Developer Portal base64 -i ~/path/to/YourApp_AppStore.mobileprovision | tr -d '\n' | pbcopy You can check out this document on how to create an Apple Distribution Certificate. Once this workflow finishes, you get signed artifacts ready to upload to the stores. This is your normal full release path. name: Shorebird Release on: workflow_dispatch: inputs: platform: description: 'Target platform' required: true default: 'both' type: choice options: - android - ios - both jobs: release_android: name: Release Android if: ${{ github.event.inputs.platform == 'android' || github.event.inputs.platform == 'both' }} runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Setup Java uses: actions/setup-java@v4 with: distribution: 'temurin' java-version: '17' - name: Setup Android Keystore run: | echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 --decode > android/app/keystore.jks cat > android/key.properties <<EOF storePassword=${{ secrets.ANDROID_STORE_PASSWORD }} keyPassword=${{ secrets.ANDROID_KEY_PASSWORD }} keyAlias=${{ secrets.ANDROID_KEY_ALIAS }}
freeCodeCamp
15 条教程、指南与实践文章
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
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
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
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
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
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
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
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
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
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
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
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
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
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
How to Use Claude Code to Build Flutter Apps Faster — Best Practices for 2026
Jesutoni Aderibigbe
In early 2023, I was interning at a US-based company, long before agentic AI became part of everyday development. We had tools like ChatGPT, Gemini, and Copilot, but they were mostly chat interfaces:
Hacker News
20 条技术社区讨论与项目链接
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: 1 # Comments: 0
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
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
xcc3641
Article URL: https://cococut.app/en Comments URL: https://news.ycombinator.com/item?id=49582167 Points: 2 # Comments: 1
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
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
Harish_0089
Article URL: https://github.com/GeekyAnts/flutter-starter Comments URL: https://news.ycombinator.com/item?id=49432329 Points: 3 # Comments: 0
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
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
Flutter 3.47
gumby271
Article URL: https://flutter.dev/blog/whats-new-in-flutter-3-47 Comments URL: https://news.ycombinator.com/item?id=49280061 Points: 207 # Comments: 214
I built a local 3D marketplace with pizza-style tracking in Flutter
Nearnook_dev
Article URL: https://play.google.com/store/apps/details?id=com.lahoucintiyar.nearnook&hl=en_US Comments URL: https://news.ycombinator.com/item?id=49277267 Points: 1 # Comments: 0
Openhare: AI-powered desktop SQL client. Cross-platform. Built with Flutter
thunderbong
Article URL: https://github.com/sjjian/openhare Comments URL: https://news.ycombinator.com/item?id=49276189 Points: 4 # Comments: 0
FieldFleet – self-hostable field operations built with Flutter and Supabase
iguardo
Article URL: https://taskfleetai.github.io/fieldfleet/ Comments URL: https://news.ycombinator.com/item?id=49262555 Points: 3 # Comments: 0
Flutter desktop apps can draw to multiple windows now
matthewkosarek
Article URL: https://www.youtube.com/watch?v=yXj6HGTgKX0 Comments URL: https://news.ycombinator.com/item?id=49243250 Points: 2 # Comments: 0
Denial WM: New Wayland Compositor with Flutter Directly Embedded
mikece
Article URL: https://www.phoronix.com/news/Denial-WM-Compositor Comments URL: https://news.ycombinator.com/item?id=49184965 Points: 4 # Comments: 0
Rejourney Flutter Analytics in Beta: Session Replay for Flutter GPU and Impeller
mrr7337
Article URL: https://rejourney.co/engineering/2026-08-01/flutter-sdk-open-beta Comments URL: https://news.ycombinator.com/item?id=49162055 Points: 1 # Comments: 0
I made Squirrel game with Flutter and Flame
dmvvilela
Article URL: https://danvilela.com/squirrel-up Comments URL: https://news.ycombinator.com/item?id=49137413 Points: 5 # Comments: 0
Kaisel – Routes as Values. Dart 3 Native Router for Flutter
TheWiggles
Article URL: https://kaisel.dev/ Comments URL: https://news.ycombinator.com/item?id=49135985 Points: 58 # Comments: 11
A LangGraph pipeline that generates compiling Flutter apps (with a repair loop)
m2magents
Article URL: https://github.com/carlosge492/app-generation-microservice Comments URL: https://news.ycombinator.com/item?id=49130994 Points: 1 # Comments: 0
Built a household organizer in Flutter – what would you improve?
mladenConcept
Article URL: https://apps.apple.com/us/app/roomli-shared-home-organizer/id6761788107 Comments URL: https://news.ycombinator.com/item?id=49102118 Points: 1 # Comments: 0
Medium
10 条Flutter 相关文章精选
Superwall + Flutter: From UI to Code A Complete Setup Guide
Erandajayasinghe
Superwall lets you build paywalls and onboarding screens remotely and update them without shipping a new app release. Continue reading on Medium »
AEC, Half-Duplex Behavior, and Timing: Why You Don’t Hear Your Own Voice Coming Back During a Call
Waleed Ashraf
What a Debian smart panel + intercom bug taught me about Acoustic Echo Cancellation, reference signals, and why the same bitrate can still… Continue reading on Medium »
Time Ring Picker for Beginners: Build a Clock-Style Time Range Picker Without Writing the Angle…
Ravi Vithani
Ever needed a “from X to Y” time picker — a sleep schedule, quiet hours, a shift start/end — and wished it looked like a clock dial… Continue reading on Medium »
The Cross-Platform Bargain Just Expired
Zain ul Abe Din
Every cross-platform framework sells the same deal, and on paper it’s a good one: one codebase instead of two, at roughly half the cost… Continue reading on Medium »
Anthropicの脅威レポートが国家支援の兵器研究を暴露 ― AIとFlutterに関するトップ10ニュース(2026年9月12日)
Blur Brah Lab
クロード / アントロピック Continue reading on Medium »
The Future of Dart After 3.13: Where the Language Is Really Headed
Nicolas
Primary constructors just went stable — here’s what that says about Dart’s next few years, and why Flutter devs should pay attention now. Continue reading on Medium »
Flutter’s Future Is Agentic: How AI Is Actually Changing App Development
Nicolas
It’s not about AI writing your widgets for you — it’s about AI agents that understand your entire Flutter project. Continue reading on Medium »
How Kids Can Build Their First Mobile App with Flutter: A Beginner’s Guide
Roshan Chaturvedi
Have you ever seen a child using a mobile app and asking, “How did they make this?” Continue reading on Medium »
I Built the Same App 4 Ways — Here’s What Actually Happened
Sixtin - Mobile App Developer
SwiftUI vs Jetpack Compose vs Flutter vs React Native, measured with real numbers, not vibes Continue reading on Medium »
I Let My AI Agent Hot Reload My Flutter App by Itself. Here’s What That Actually Looks Like.
Akhil Gite | AI Trends
Dart 3.12 shipped a feature that removes one specific piece of friction: your coding agent no longer has to ask you for a connection URI… Continue reading on Medium »
社区日榜讨论与资源