24h Intel · 81 条
Flutter 24小时情报 GitHub 热门仓库与技术资讯
每日汇总 Flutter / Dart GitHub 热门仓库,以及 Dev.to、freeCodeCamp、Hacker News、Medium、Reddit 的近期技术资讯,跟踪 24 小时 Stars 增量与社区讨论。
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 条开发者文章与项目分享
Your Flutter desktop app won't start: one corrupt preferences file
Frank Milvus
The report was short: the desktop build opens and closes immediately. No window, no error dialog, nothing to click. On the terminal, the process printed a stack trace and quit before anything appeared on screen. The cause was not a broken build, a missing library, or a failed update. It was one settings file with a missing bracket. This post is about that failure and the fix: how a single corrupt JSON file can stop a Flutter desktop app before its first frame, why wrapping the read in try/catch does not save you, and how the app now repairs itself at launch without throwing away the evidence. The terminal showed this: Unhandled Exception: FormatException: Unexpected character (at character 31943) ...notif_suppressed_136":1793799452696}"flutter.keystore_durability_expecte... Look closely at the quoted fragment. There is a closing } after a timestamp, and then another key starts immediately: …2696}"flutter…. That is not a value the app wrote. It is two JSON objects glued together — the remains of an interrupted write. The exception happened inside an awaited call in main(), before runApp(). An async main without a top-level catch lets that exception escape, and the Flutter engine never gets a route to render. From the user's side, the app silently refuses to start. There is no error boundary for this class of bug. The crash reporting tool had not finished starting either, so there was no report to read. The only evidence was the terminal output and the file on disk. On mobile, shared_preferences is backed by platform-native storage. On Linux and Windows, the plugins are different: both keep the entire preferences store in a single file called shared_preferences.json in the app's support directory. On Linux that is: ~/.local/share/com.folcadi.app/shared_preferences.json Every key the app saves lives in that one JSON object. The plugin does not read keys lazily; it decodes the whole file once, inside SharedPreferences.getInstance(), and hands you a map. That design is fine for settings. It becomes a critical path when the first thing your app does is read a setting. Folcadi restores the user's appearance preferences before runApp() so the first frame is already in the right theme. That means launch order is: Flutter bindings initialize. The app asks for preferences. The plugin reads and decodes the JSON file. Only then does the app build its first widget. If step 3 throws, steps 4 onward never happen. This is also why the bug was invisible in development. A fresh profile has a valid file. Tests that mock preferences never see the real decoder. The failure needs a file that was damaged outside the app's control — a power loss, a forced shutdown, a full disk during a write, or a sync tool touching the profile directory. We cannot point to the exact event that damaged this one, and that is the point: the app must survive a damaged file regardless of how it happened. try/catch around the read is too late The obvious fix is to catch the exception where preferences are read: try { final prefs = await SharedPreferences.getInstance(); // ... } catch (e) { // use defaults } That helps the call site you wrapped, and it is worth doing — the app now has exactly that guard around its startup restores. But it does not repair the store. Every other call to getInstance() in the app still hits the same file and throws the same error. A settings screen opened ten minutes later fails in a different place, with a different stack trace, and the app looks broken in a new way. Worse, the failed read leaves the file untouched. The next launch repeats the failure. A one-time catch turns a hard crash into a permanent, scattered malfunction. The real problem is that the file is untrusted input. Treat it that way: inspect it before the plugin ever opens it, and remove it from the plugin's path when it is unusable. The repair runs immediately after WidgetsFlutterBinding.ensureInitialized() and before any code touches SharedPreferences: void main() async { WidgetsFlutterBinding.ensureInitialized(); await repairCorruptSharedPreferences(); // ...the rest of startup } The function has a simple contract. It returns true if a corrupt file was moved aside, and false if there was nothing to do — on web, on mobile, when the file is missing, or when the file is healthy. Inside, the checks are deliberately narrow: if (!await target.exists()) return false; final raw = await target.readAsString(); if (raw.trim().isEmpty) return false; try { final decoded = jsonDecode(raw); // The plugin expects a JSON object; anything else is not a usable store. if (decoded is Map) return false; } on FormatException catch (e) { debugPrint('PrefsRepair: corrupt preferences file: $e'); } Three details matter here. Whitespace-only is not corruption. An empty file is what a fresh install or a cleared profile looks like. Renaming it would create noise and a pointless backup on every clean launch. Valid JSON is not automatically valid preferenc
Offline-First Flutter for Robot Operators and Field Technicians
vmodal_ai
The problem Robots and edge devices may operate in warehouses, factories, outdoors, This tutorial focuses on practical architecture and performance Local cache and command outbox → connectivity-aware repository → Classify actions as read-only, safely retryable, or time-sensitive/non-replayable. Cache non-sensitive reference data and show when each value was last refreshed. Use idempotency keys for retryable operations and explicit user confirmation for commands that cannot be safely queued. On reconnect, refresh authoritative device state before enabling actions. Test airplane mode, DNS failure, gateway reboot, and long-lived stale sessions. enum RetryPolicy { safeToRetry, refreshBeforeRetry, neverReplay }\n\nclass PendingOperation {\n const PendingOperation({required this.id, required this.policy});\n final String id;\n final RetryPolicy policy;\n} The snippets are illustrative starting points, not drop-in integrations. Measure end-to-end latency, not only one function or model invocation. Report p50 and p95/p99 latency alongside throughput, memory use, and dropped work. Bound queues and define what happens when consumers fall behind. Avoid repeated frame copies and expensive work on Flutter's UI isolate. Test sustained workloads after the device reaches thermal equilibrium. Keep UI state, device state, and robot state distinct. Add timeouts, cancellation, reconnection, and explicit stale-data indicators. Profile on the actual target hardware using a reproducible build. Never replay motion commands simply because connectivity returned. Do not present cached telemetry as live without a freshness indicator. Avoid unlimited local outboxes that can grow during long outages. Disconnect the phone during a mock robot task. Verify the app shows Flutter performance best practices Flutter DevTools Android Developers NVIDIA Developer ROS 2 documentation Useful Links Website: www.v-modal.com SDK Flutter: https://github.com/v-modal/vmodal_sdk_flutter SDK Android: https://github.com/v-modal/vmodal_sdk_android Discord: https://discord.gg/K72z28KUx Reddit: https://www.reddit.com/r/v_modal/
Advanced Flutter Profiling for Smart Glasses and Robotics
vmodal_ai
This advanced tutorial treats Flutter as the operator-facing presentation layer while wearable SDKs, Jetson services, ROS 2 nodes, and NVIDIA-accelerated inference handle device-specific or compute-heavy work. The goal is predictable latency, bounded memory, useful observability, and graceful degradation—not simply maximizing message throughput. Architecture note: Keep safety-critical control loops on the robot. A Flutter app is not a hard real-time controller and must not be the sole safety mechanism. Track freshness, event-to-display latency, throughput, frame pacing, CPU, memory, network use, battery, thermal state, dropped messages, reconnect time, and command acknowledgements. Do not use a single FPS number to represent the entire system: a smooth screen can still display stale data. sensor capture -> native/ROS processing -> gateway publish -> Flutter receive -> state accepted -> widget build -> frame rendered Record source and receive timestamps separately. Use monotonic clocks for elapsed durations within a process. When comparing devices, account for clock offset and uncertainty. Profile on a physical target in profile mode and inspect Flutter DevTools' Performance view. Debug-mode timing is not a reliable production baseline. See https://docs.flutter.dev/tools/devtools/performance Start from a clean launch. Connect to the robot or replay a fixed trace. Run a representative scenario for several minutes. Record frame times, memory, CPU, message rates, stale-data counts, and reconnects. Change one variable at a time. Compare p50, p95, and p99 latency, not just averages. class PipelineMetrics { int received = 0; int accepted = 0; int dropped = 0; int stale = 0; int uiPublishes = 0; } Use bounded metric windows or histograms; do not store every sample forever. High-rate sources should not directly trigger widget rebuilds. Use a latest-value cache for state-like data, bounded queues for events that must be preserved, and a controlled presentation cadence. class LatestValue<T> { T? _value; int _version = 0; void put(T value) { _value = value; _version++; } T? get value => _value; int get version => _version; } Replacing an older pending value may be acceptable for battery, pose, or temperature. Commands, alarms, and audit events need a separate reliable path and explicit acknowledgement semantics. Every queue needs a maximum capacity, an overflow policy, a drop/replacement counter, and an owner responsible for recovery. Latest wins: pose, preview frames, current detections. Drop old items: display-oriented streams where freshness matters. Persist: events that must survive disconnection. Reject with feedback: commands that cannot safely be queued. An unbounded telemetry or log list turns overload into memory growth rather than a visible, measurable condition. Keep parsing, filtering, and transformations out of build(). Split screens into independently updating sections and avoid rebuilding camera or map widgets for unrelated state changes. For CPU-heavy pure Dart work, benchmark compute or a dedicated isolate with realistic payload sizes. Isolates have startup and message-transfer costs. For hardware acceleration or platform APIs, prefer a native service designed for that workload. Sensors -> ROS 2 / accelerated nodes -> Jetson gateway | compact UI-facing state | WebSocket / MQTT / gRPC | Flutter client NVIDIA Isaac ROS provides accelerated, low-latency ROS 2 packages for Jetson and other NVIDIA platforms. Keep image processing, inference, and robot control on the compute side; send Flutter only the information needed for visualization and operator decisions. See https://nvidia-isaac-ros.github.io/ Carry source timestamp, receive timestamp, sequence number/version, source identity, and optional confidence or quality. The UI must distinguish zero from unknown, disconnected, and stale. Do not show a green health indicator just because the last payload was healthy. Simulate network delay and packet loss, bursts, robot process restarts, wearable permission loss, camera interruptions, inference slowdown, low memory, and thermal throttling. Under pressure, reduce preview resolution or update frequency and pause nonessential charts—but preserve command and safety status visibility. [ ] Frame-time baseline captured on physical hardware [ ] p50/p95/p99 event-to-display latency measured [ ] Queues bounded and overflow observable [ ] High-frequency state coalesced before UI updates [ ] Commands and alarms use reliable semantics [ ] Clock domains and stale-data rules documented [ ] Network and reconnect behavior tested [ ] Thermal and memory pressure scenarios tested [ ] Robot safety remains independent of the mobile app [ ] Performance budgets enforced in repeatable test
Flutter + Jetson: Thermal and Memory Pressure-Aware Operator UI
vmodal_ai
This advanced tutorial treats Flutter as the operator-facing presentation layer while wearable SDKs, Jetson services, ROS 2 nodes, and NVIDIA-accelerated inference handle device-specific or compute-heavy work. The goal is predictable latency, bounded memory, useful observability, and graceful degradation—not simply maximizing message throughput. Architecture note: Keep safety-critical control loops on the robot. A Flutter app is not a hard real-time controller and must not be the sole safety mechanism. Track freshness, event-to-display latency, throughput, frame pacing, CPU, memory, network use, battery, thermal state, dropped messages, reconnect time, and command acknowledgements. Do not use a single FPS number to represent the entire system: a smooth screen can still display stale data. sensor capture -> native/ROS processing -> gateway publish -> Flutter receive -> state accepted -> widget build -> frame rendered Record source and receive timestamps separately. Use monotonic clocks for elapsed durations within a process. When comparing devices, account for clock offset and uncertainty. Profile on a physical target in profile mode and inspect Flutter DevTools' Performance view. Debug-mode timing is not a reliable production baseline. See https://docs.flutter.dev/tools/devtools/performance Start from a clean launch. Connect to the robot or replay a fixed trace. Run a representative scenario for several minutes. Record frame times, memory, CPU, message rates, stale-data counts, and reconnects. Change one variable at a time. Compare p50, p95, and p99 latency, not just averages. class PipelineMetrics { int received = 0; int accepted = 0; int dropped = 0; int stale = 0; int uiPublishes = 0; } Use bounded metric windows or histograms; do not store every sample forever. High-rate sources should not directly trigger widget rebuilds. Use a latest-value cache for state-like data, bounded queues for events that must be preserved, and a controlled presentation cadence. class LatestValue<T> { T? _value; int _version = 0; void put(T value) { _value = value; _version++; } T? get value => _value; int get version => _version; } Replacing an older pending value may be acceptable for battery, pose, or temperature. Commands, alarms, and audit events need a separate reliable path and explicit acknowledgement semantics. Every queue needs a maximum capacity, an overflow policy, a drop/replacement counter, and an owner responsible for recovery. Latest wins: pose, preview frames, current detections. Drop old items: display-oriented streams where freshness matters. Persist: events that must survive disconnection. Reject with feedback: commands that cannot safely be queued. An unbounded telemetry or log list turns overload into memory growth rather than a visible, measurable condition. Keep parsing, filtering, and transformations out of build(). Split screens into independently updating sections and avoid rebuilding camera or map widgets for unrelated state changes. For CPU-heavy pure Dart work, benchmark compute or a dedicated isolate with realistic payload sizes. Isolates have startup and message-transfer costs. For hardware acceleration or platform APIs, prefer a native service designed for that workload. Sensors -> ROS 2 / accelerated nodes -> Jetson gateway | compact UI-facing state | WebSocket / MQTT / gRPC | Flutter client NVIDIA Isaac ROS provides accelerated, low-latency ROS 2 packages for Jetson and other NVIDIA platforms. Keep image processing, inference, and robot control on the compute side; send Flutter only the information needed for visualization and operator decisions. See https://nvidia-isaac-ros.github.io/ Carry source timestamp, receive timestamp, sequence number/version, source identity, and optional confidence or quality. The UI must distinguish zero from unknown, disconnected, and stale. Do not show a green health indicator just because the last payload was healthy. Simulate network delay and packet loss, bursts, robot process restarts, wearable permission loss, camera interruptions, inference slowdown, low memory, and thermal throttling. Under pressure, reduce preview resolution or update frequency and pause nonessential charts—but preserve command and safety status visibility. [ ] Frame-time baseline captured on physical hardware [ ] p50/p95/p99 event-to-display latency measured [ ] Queues bounded and overflow observable [ ] High-frequency state coalesced before UI updates [ ] Commands and alarms use reliable semantics [ ] Clock domains and stale-data rules documented [ ] Network and reconnect behavior tested [ ] Thermal and memory pressure scenarios tested [ ] Robot safety remains independent of the mobile app [ ] Performance budgets enforced in repeatable test
Flutter Robotics: Bounded Queues, Load Shedding, and Priority Channels
vmodal_ai
This advanced tutorial treats Flutter as the operator-facing presentation layer while wearable SDKs, Jetson services, ROS 2 nodes, and NVIDIA-accelerated inference handle device-specific or compute-heavy work. The goal is predictable latency, bounded memory, useful observability, and graceful degradation—not simply maximizing message throughput. Architecture note: Keep safety-critical control loops on the robot. A Flutter app is not a hard real-time controller and must not be the sole safety mechanism. Track freshness, event-to-display latency, throughput, frame pacing, CPU, memory, network use, battery, thermal state, dropped messages, reconnect time, and command acknowledgements. Do not use a single FPS number to represent the entire system: a smooth screen can still display stale data. sensor capture -> native/ROS processing -> gateway publish -> Flutter receive -> state accepted -> widget build -> frame rendered Record source and receive timestamps separately. Use monotonic clocks for elapsed durations within a process. When comparing devices, account for clock offset and uncertainty. Profile on a physical target in profile mode and inspect Flutter DevTools' Performance view. Debug-mode timing is not a reliable production baseline. See https://docs.flutter.dev/tools/devtools/performance Start from a clean launch. Connect to the robot or replay a fixed trace. Run a representative scenario for several minutes. Record frame times, memory, CPU, message rates, stale-data counts, and reconnects. Change one variable at a time. Compare p50, p95, and p99 latency, not just averages. class PipelineMetrics { int received = 0; int accepted = 0; int dropped = 0; int stale = 0; int uiPublishes = 0; } Use bounded metric windows or histograms; do not store every sample forever. High-rate sources should not directly trigger widget rebuilds. Use a latest-value cache for state-like data, bounded queues for events that must be preserved, and a controlled presentation cadence. class LatestValue<T> { T? _value; int _version = 0; void put(T value) { _value = value; _version++; } T? get value => _value; int get version => _version; } Replacing an older pending value may be acceptable for battery, pose, or temperature. Commands, alarms, and audit events need a separate reliable path and explicit acknowledgement semantics. Every queue needs a maximum capacity, an overflow policy, a drop/replacement counter, and an owner responsible for recovery. Latest wins: pose, preview frames, current detections. Drop old items: display-oriented streams where freshness matters. Persist: events that must survive disconnection. Reject with feedback: commands that cannot safely be queued. An unbounded telemetry or log list turns overload into memory growth rather than a visible, measurable condition. Keep parsing, filtering, and transformations out of build(). Split screens into independently updating sections and avoid rebuilding camera or map widgets for unrelated state changes. For CPU-heavy pure Dart work, benchmark compute or a dedicated isolate with realistic payload sizes. Isolates have startup and message-transfer costs. For hardware acceleration or platform APIs, prefer a native service designed for that workload. Sensors -> ROS 2 / accelerated nodes -> Jetson gateway | compact UI-facing state | WebSocket / MQTT / gRPC | Flutter client NVIDIA Isaac ROS provides accelerated, low-latency ROS 2 packages for Jetson and other NVIDIA platforms. Keep image processing, inference, and robot control on the compute side; send Flutter only the information needed for visualization and operator decisions. See https://nvidia-isaac-ros.github.io/ Carry source timestamp, receive timestamp, sequence number/version, source identity, and optional confidence or quality. The UI must distinguish zero from unknown, disconnected, and stale. Do not show a green health indicator just because the last payload was healthy. Simulate network delay and packet loss, bursts, robot process restarts, wearable permission loss, camera interruptions, inference slowdown, low memory, and thermal throttling. Under pressure, reduce preview resolution or update frequency and pause nonessential charts—but preserve command and safety status visibility. [ ] Frame-time baseline captured on physical hardware [ ] p50/p95/p99 event-to-display latency measured [ ] Queues bounded and overflow observable [ ] High-frequency state coalesced before UI updates [ ] Commands and alarms use reliable semantics [ ] Clock domains and stale-data rules documented [ ] Network and reconnect behavior tested [ ] Thermal and memory pressure scenarios tested [ ] Robot safety remains independent of the mobile app [ ] Performance budgets enforced in repeatable test
Flutter + NVIDIA Jetson: Designing a Low-Latency Robotics Gateway
vmodal_ai
Flutter + NVIDIA Jetson: Designing a Low-Latency Robotics Gateway This advanced tutorial treats Flutter as the operator-facing presentation layer while wearable SDKs, Jetson services, ROS 2 nodes, and NVIDIA-accelerated inference handle device-specific or compute-heavy work. The goal is predictable latency, bounded memory, useful observability, and graceful degradation—not simply maximizing message throughput. Architecture note: Keep safety-critical control loops on the robot. A Flutter app is not a hard real-time controller and must not be the sole safety mechanism. Track freshness, event-to-display latency, throughput, frame pacing, CPU, memory, network use, battery, thermal state, dropped messages, reconnect time, and command acknowledgements. Do not use a single FPS number to represent the entire system: a smooth screen can still display stale data. sensor capture -> native/ROS processing -> gateway publish -> Flutter receive -> state accepted -> widget build -> frame rendered Record source and receive timestamps separately. Use monotonic clocks for elapsed durations within a process. When comparing devices, account for clock offset and uncertainty. Profile on a physical target in profile mode and inspect Flutter DevTools' Performance view. Debug-mode timing is not a reliable production baseline. See https://docs.flutter.dev/tools/devtools/performance Start from a clean launch. Connect to the robot or replay a fixed trace. Run a representative scenario for several minutes. Record frame times, memory, CPU, message rates, stale-data counts, and reconnects. Change one variable at a time. Compare p50, p95, and p99 latency, not just averages. class PipelineMetrics { int received = 0; int accepted = 0; int dropped = 0; int stale = 0; int uiPublishes = 0; } Use bounded metric windows or histograms; do not store every sample forever. High-rate sources should not directly trigger widget rebuilds. Use a latest-value cache for state-like data, bounded queues for events that must be preserved, and a controlled presentation cadence. class LatestValue<T> { T? _value; int _version = 0; void put(T value) { _value = value; _version++; } T? get value => _value; int get version => _version; } Replacing an older pending value may be acceptable for battery, pose, or temperature. Commands, alarms, and audit events need a separate reliable path and explicit acknowledgement semantics. Every queue needs a maximum capacity, an overflow policy, a drop/replacement counter, and an owner responsible for recovery. Latest wins: pose, preview frames, current detections. Drop old items: display-oriented streams where freshness matters. Persist: events that must survive disconnection. Reject with feedback: commands that cannot safely be queued. An unbounded telemetry or log list turns overload into memory growth rather than a visible, measurable condition. Keep parsing, filtering, and transformations out of build(). Split screens into independently updating sections and avoid rebuilding camera or map widgets for unrelated state changes. For CPU-heavy pure Dart work, benchmark compute or a dedicated isolate with realistic payload sizes. Isolates have startup and message-transfer costs. For hardware acceleration or platform APIs, prefer a native service designed for that workload. Sensors -> ROS 2 / accelerated nodes -> Jetson gateway | compact UI-facing state | WebSocket / MQTT / gRPC | Flutter client NVIDIA Isaac ROS provides accelerated, low-latency ROS 2 packages for Jetson and other NVIDIA platforms. Keep image processing, inference, and robot control on the compute side; send Flutter only the information needed for visualization and operator decisions. See https://nvidia-isaac-ros.github.io/ Carry source timestamp, receive timestamp, sequence number/version, source identity, and optional confidence or quality. The UI must distinguish zero from unknown, disconnected, and stale. Do not show a green health indicator just because the last payload was healthy. Simulate network delay and packet loss, bursts, robot process restarts, wearable permission loss, camera interruptions, inference slowdown, low memory, and thermal throttling. Under pressure, reduce preview resolution or update frequency and pause nonessential charts—but preserve command and safety status visibility. [ ] Frame-time baseline captured on physical hardware [ ] p50/p95/p99 event-to-display latency measured [ ] Queues bounded and overflow observable [ ] High-frequency state coalesced before UI updates [ ] Commands and alarms use reliable semantics [ ] Clock domains and stale-data rules documented [ ] Network and reconnect behavior tested [ ] Thermal and memory pressure scenarios tested [ ] Robot safety remains independent o
Mobil Uygulama Yaptırmak İsteyenler İçin 2026 Kılavuzu & Teklif: Production Architecture & Best Practices 2026 (06.11.2026)
Nuh Mehmet Demirkol
Mobil Uygulama Yaptırmak İsteyenler İçin 2026 Kılavuzu & Teklif Mobil uygulama ekosisteminde ölçeklenebilir ve sürdürülebilir bir sistem inşa etmek için doğru mimari ve mühendislik disiplini şarttır. Clean Architecture katmanları ile iş mantığını ve UI katmanını birbirinden ayırmak bakım maliyetlerini %60 oranında azaltır. Flutter ile tek kod tabanından iOS ve Android için 120 FPS akıcılık elde edilir. Her kurumsal projede %100 açık kaynak kod, Git deposu ve en az 1 yıllık teknik bakım garantisi sağlanmalıdır. 📌 İlgili Özel Sayfa: Mobil Uygulama Yaptırmak İsteyenler İçin 2026 Kılavuzu & Teklif 🧮 Canlı Maliyet Hesaplama: Mobil Uygulama Maliyet Hesaplama 👨💻 Bilgisayar Mühendisi: Nuh Mehmet Demirkol 📞 WhatsApp: +90 507 823 68 11 | Ankara, Türkiye
Google Play's closed test rule: 12 testers, 14 days, no gaps
Stacklyn Labs
If you publish your first app with a new personal Google Play developer account, your launch date is not "the day the code is done". It is at least 14 days later, and it depends on other people. Personal developer accounts created after 13 November 2023 must run a closed test with at least 12 testers opted in, continuously, for at least 14 days before they can apply for production access. After that, Google reviews the production access application. Google says this usually takes seven days or less. Organization accounts don't have this requirement, though they need a D-U-N-S number to register. The 14 days are counted with at least 12 testers opted in the whole time. If testers drop out and the count falls below 12, you are not meeting the condition. Recruit a few more than 12, so one person leaving doesn't put you under. Each tester has to: Be added to your closed test (for example through an email list or Google Group in Play Console) Open the opt-in link and accept it Being on the list is not the same as being opted in. Check the opt-in count in Play Console rather than counting the emails you added, and ask testers to install the app so the test produces real feedback. Say the app is feature-complete on day 0. Day What happens 0 Upload the first build to a closed testing track 0-2 Testers opt in and install. The clock only helps you once you have 12 14+ 14 continuous days with 12+ testers reached 14+ Apply for production access up to ~21 Google's review, usually seven days or less after approval Promote a build to production So "done on day 0" means "live on Google Play around three weeks later", if nothing slips. Recruit testers while you are still building. Friends, colleagues, a user group, early customers. Have their emails before the first upload. Upload a closed test build early. It doesn't have to be the final version. You can keep uploading new builds to the same track during the 14 days. Use the test. Twelve real people on real devices is free QA. Ask them for feedback, and fix what they find before production. Check your account type first. If your app belongs to a company, an organization account avoids this rule entirely, but registration needs the D-U-N-S number, which can take time to get. The 14 days are a good window to finish the rest of the listing work: store screenshots, the data safety form, content rating, privacy policy URL and app signing. All of it has to be done before production anyway. Further reading: the full submission checklist for both Google Play and the App Store is in our help center: App store submission checklist. How did you find your 12 testers?
Google Play In-App Review API: why the card won't show
ExtensionBooster
Originally published on AppRanker. You wired up the Google Play In-App Review API, the task completes without an error, and no rating card ever appears. Usually nothing is broken: the card is quota-limited, the API never tells you what happened, and only one of Google's three test methods shows the real flow. This post gives you a working setup for Kotlin, Expo and Flutter, a rule for when to call it, and a table of the usual reasons the card stays hidden. The flow is two calls. requestReviewFlow() fetches a ReviewInfo object from Google Play, and launchReviewFlow(activity, reviewInfo) shows a native Play card over your app where the user picks 1 to 5 stars and can add a comment. It runs on Android 5.0 (API 21) and later, including tablets and Google TV, plus ChromeOS, but only where the Google Play Store is installed. Three facts shape everything else: You get no result. The completion callback fires whether the user rated, dismissed the card, or never saw it. Your code must carry on the same way in every case. There is a quota. Google limits how often one user sees the card. Its own example is that calling it more than once in "less than a month" may display nothing, and the exact limit can change without notice. The rules are strict. No "Do you like the app?" question before or during the card, no reshaping or overlaying it, and no rewards for ratings. Play's ratings policy bans incentivized feedback outright. The quota is why Google says not to put the flow behind a button. A user who has used up their quota taps it and sees nothing. Since each user gets roughly one shot per period, your trigger logic matters more than the integration. Aim for a moment right after the user succeeded at something, while they are between tasks, once they have used the app enough to judge it. App type Ask here Never here Productivity After the 3rd completed export or project First launch, mid-typing Fitness Workout summary screen During a workout, after a missed goal Game After a level win, before the next level Mid-game, after a loss Utility After the tool has worked several times After an error or crash recovery A small eligibility gate keeps calls rare. The thresholds below are an example to tune, not a Google requirement: private const val DAY_MS = 86_400_000L fun reviewEligible(prefs: SharedPreferences, now: Long = System.currentTimeMillis()): Boolean = prefs.getInt("core_action_count", 0) >= 3 && now - prefs.getLong("first_open_at", now) >= 3 * DAY_MS && now - prefs.getLong("review_last_asked_at", 0L) >= 90 * DAY_MS Save review_last_asked_at at the moment you launch the flow. You will never learn whether a rating was left, so launch time is the only timestamp you can trust. Kotlin. Add com.google.android.play:review:2.0.2 (and review-ktx with the same version for Kotlin extensions). Fetch ReviewInfo shortly before the success moment, since it expires after a while: class RatingAsk(private val activity: Activity) { private val manager = ReviewManagerFactory.create(activity) private var info: ReviewInfo? = null fun warmUp() = manager.requestReviewFlow().addOnCompleteListener { t -> info = if (t.isSuccessful) t.result else null if (!t.isSuccessful) Log.w("RatingAsk", "code=${(t.exception as? ReviewException)?.errorCode}") } fun show(next: () -> Unit) { val ready = info ?: return next() manager.launchReviewFlow(activity, ready).addOnCompleteListener { info = null next() // runs no matter what the user did } } } Errors you may log: PLAY_STORE_NOT_FOUND (-1), INVALID_REQUEST (-2) and INTERNAL_ERROR (-100). Log them, never show them to the user, and wait for the flow to finish before moving to the next screen. Expo. npx expo install expo-store-review, then check StoreReview.hasAction() before calling StoreReview.requestReview(). Bare React Native apps can use react-native-in-app-review. Flutter. The in_app_review package gives you both sides: final review = InAppReview.instance; Future<void> askIfEligible(bool eligible) async { if (eligible && await review.isAvailable()) await review.requestReview(); } // Settings "Rate us" item: not quota-limited Future<void> rateUs() => review.openStoreListing(); For a permanent "Rate us" menu entry on Android, link to https://play.google.com/store/apps/details?id=<your.app.id>&showAllReviews=true (or the market:// form) instead of calling the API. Most "it's broken" reports come from testing in a setup that cannot show a working card. Method Use it for Catch Internal test track Real end-to-end card None; quota is not applied here Internal app sharing Quick build checks Submit button is disabled FakeReviewManager Unit and integration tests No UI, always succeeds For the internal test track, all four must hold: the account is on the track, it is the primary account selected in the Play Store, it installed the app from Play, and it has not reviewed the
Flutter app with a Laravel backend (2026 guide)
Qihu Zhang
Short answer: install Laravel Sanctum, give the app a handful of JSON routes under /api, and have Flutter send Authorization: Bearer <token> on every call after sign-in. Keep the token in flutter_secure_storage. Firebase stays only where Apple and Google make you use it: push delivery goes through FCM either way. Most Flutter tutorials assume Firebase for everything. That is quick to start, but your users, their data and your bill end up in someone else's console. A small Laravel app gives you the same building blocks on a server you control, plus an admin panel. This guide covers the six things a typical app needs from it, in the order you usually build them, and then how to set the project up so a coding agent can keep building it with you. Firebase Your own Laravel backend Accounts Firebase Auth Sanctum tokens, your own users table Data Firestore rules Routes and policies in PHP Admin view of your users Firebase console An admin panel you build (Filament) Pricing Per read, write and sign-in One server, from a few dollars a month Push to phones FCM Still FCM, sent from your server Leaving later Export and rewrite It is already yours Pick Firebase if you want zero servers. Pick Laravel if you already know PHP, want one place to see and edit your users, or need data to stay on infrastructure you choose. A complete first version is about a dozen routes: Route Auth What it does POST /api/auth/register public Sends a 6-digit code, creates nothing yet POST /api/auth/verify public Code + password → account + token POST /api/auth/login public Email + password → token POST /api/auth/social public Google or Apple id token → token POST /api/auth/password/forgot public Sends a reset code GET /api/auth/me token The signed-in user POST /api/auth/logout token Revokes this token DELETE /api/auth/me token Deletes the account and its data PUT /api/backup token Stores a snapshot of the app's data GET /api/backup token Latest snapshot, for restore GET /api/version public Latest and minimum app version Put the public auth routes behind a rate limiter (throttle:) so nobody can use them to send thousands of emails. In a new Laravel app: php artisan install:api That installs Sanctum and creates routes/api.php. Add the HasApiTokens trait to User, then return a token from every route that signs someone in: public function login(Request $req) { $data = $req->validate(['email' => 'required|email', 'password' => 'required|string']); $user = User::where('email', $data['email'])->first(); if (! $user || ! Hash::check($data['password'], $user->password)) { throw ValidationException::withMessages(['email' => ['Invalid credentials.']]); } return [ 'token' => $user->createToken('mobile')->plainTextToken, 'user' => ['id' => $user->id, 'name' => $user->name, 'email' => $user->email], ]; } Everything private goes in one group: Route::middleware('auth:sanctum')->group(function () { Route::get('auth/me', [AuthController::class, 'me']); Route::post('auth/logout', [AuthController::class, 'logout']); }); Sanctum tokens do not expire unless you set expiration in config/sanctum.php. For a phone app that is usually what you want: sign-out deletes the token with $req->user()->currentAccessToken()->delete(). A code typed into the app works better on a phone than a link in an email, which opens the browser instead of the app. Split sign-up into two calls: register validates name, email and password, stores a hashed password next to a 6-digit code, emails the code and answers 202. No user row exists yet. verify takes the email, the code and the same password, creates the user with email_verified_at set and answers with a token. Two details matter. Answer register the same way whether or not the address already has an account, and email the existing owner a note instead of a code, so the route cannot be used to find out who is signed up. And keep codes short-lived (10–15 minutes) with a limit on attempts. One small client handles the base URL, the headers and the token: class Api { Api(this.baseUrl); final String baseUrl; final _storage = const FlutterSecureStorage(); Future<Map<String, String>> _headers() async { final token = await _storage.read(key: 'api_token'); return { 'Accept': 'application/json', 'Content-Type': 'application/json', if (token != null) 'Authorization': 'Bearer $token', }; } Future<Map<String, dynamic>> post(String path, Map<String, dynamic> body) async { final res = await http .post(Uri.parse('$baseUrl/api/$path'), headers: await _headers(), body: jsonEncode(body)) .timeout(const Duration(seconds: 30)); final json = res.body.isEmpty ? <String, dynamic>{} : jsonDecode(res.body) as Map<String, dynamic>; if (res.statusCode == 401) await _storage.delete(key: 'api_token'); if (res.statusCode >= 400) throw ApiException(json['message'] as String? ?? 'Erro
Hello DEV: We’re the Devs Behind MyMotor, a Flutter App for Indian Vehicle Owners
MyMotor India
Hi DEV! 👋 We are the devs of MyMotor (A vehicle owner app for India, plain flutter). We help owners check and pay traffic challans, search for RC & vehicle details, store your documents in a virtual glove box, and more. Tech used: Flutter + Riverpod, GoRouter, Dio, Hive, Go backend Vehicle & challan information can be slow or unreliable. A big part of what we have done is make sure we can read data whilst offline and cache data. We will talk about how we have done this and lessons learned while keeping a large flutter app consistent. Things we hope to learn Other devs using flutter and riverpod. Other devs making data heavy apps within India. General feedback on what we have done. If you have had issues with unreliable APIs in a mobile app, we would love to know how you got around this issue. Say hello in the comments below! Website:- https://www.mymotor.in/e-challan-check https://play.google.com/store/apps/details?id=info.vehicle.rto.car&listing=challan-check-pay https://apps.apple.com/in/app/mymotor-challan-ev-rto-info/id6752399714
Show an "update ready" banner in your Flutter app (OTA updates)
Overpush
When you ship over-the-air (OTA) updates to a Flutter app, the update downloads in the background and runs at the next launch. By default users see nothing, which is usually what you want. But sometimes you do want to tell them, for example: "New update downloaded. Restart the app to apply it." OverPush doesn't draw any UI itself. It sends events, and your app shows them in its own design. Here's a small banner you can drop into any app. OverPush.events is a stream. The ones you'll care about: OverPushPatchFound: a new update exists OverPushDownloading: download progress (percent, progress) OverPushPatchReady: downloaded, will run at next launch OverPushFailed: something went wrong; nothing changed on the device import 'dart:async'; import 'package:flutter/material.dart'; import 'package:overpush/overpush.dart'; class UpdateBanner extends StatefulWidget { const UpdateBanner({super.key}); @override State<UpdateBanner> createState() => _UpdateBannerState(); } class _UpdateBannerState extends State<UpdateBanner> { StreamSubscription<OverPushEvent>? _subscription; Timer? _hideTimer; String? _message; @override void initState() { super.initState(); _subscription = OverPush.events.listen(_onEvent); } void _onEvent(OverPushEvent event) { _hideTimer?.cancel(); switch (event) { case OverPushPatchFound(): _show('New update found…'); case OverPushDownloading(:final percent): _show(percent == null ? 'Downloading update…' : 'Downloading update · $percent%'); case OverPushPatchReady(): _show('Update downloaded. Restart the app to apply it.'); _hideTimer = Timer(const Duration(seconds: 6), () => _show(null)); case OverPushFailed(): _show(null); // nothing changed; stay quiet default: break; } } void _show(String? message) { if (mounted) setState(() => _message = message); } @override void dispose() { _subscription?.cancel(); _hideTimer?.cancel(); super.dispose(); } @override Widget build(BuildContext context) { final message = _message; return Positioned( left: 16, right: 16, bottom: MediaQuery.paddingOf(context).bottom + 24, child: IgnorePointer( child: AnimatedSwitcher( duration: const Duration(milliseconds: 250), child: message == null ? const SizedBox.shrink() : Material( key: const ValueKey('update-banner'), color: const Color(0xFF1F2430), borderRadius: BorderRadius.circular(12), elevation: 6, child: Padding( padding: const EdgeInsets.all(14), child: Text( message, style: const TextStyle(color: Colors.white, fontWeight: FontWeight.w600), ), ), ), ), ), ); } } MaterialApp( builder: (context, child) => Stack( children: [child!, const UpdateBanner()], ), home: const HomePage(), ); That's it. It's your own widget, so restyle it however you like: a snackbar, a dialog with a "Restart now" button, or a small dot in the settings screen. Getting started: https://docs.overpush.in/getting-started.html Full banner with a progress bar: https://docs.overpush.in/update-ui.html https://overpush.in (free for 5,000 patch installs a month)
freeCodeCamp
15 条教程、指南与实践文章
How to Build a Dart Package Analytics Tool with the pub.dev API: Beyond the 30-Day Window
Oluwaseyi Fatunmole
When I published my package on pub.dev, the first few days were exciting as the number of downloads climbed. 201 downloads in a few days! Then something strange happened. The number dropped: 120, then
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
Hacker News
20 条技术社区讨论与项目链接
Wing: Port Forwarding Tool with Built-In Flutter Build and Forwarding Support
gerenahudev
Article URL: https://wingserver.vercel.app Comments URL: https://news.ycombinator.com/item?id=50393852 Points: 3 # Comments: 0
Flutter updates required to remediate the eMudhra certificate compromise
bitneuker
Article URL: https://firebase.google.com/support/guides/compromised-emudhra-intermediate-ca Comments URL: https://news.ycombinator.com/item?id=50363013 Points: 2 # Comments: 1
Show HN: Detox Mode – A Flutter app to help reduce smartphone distractions
saurabh_yagyik
Article URL: https://play.google.com/store/apps/details?id=com.saurabh.detox&hl=en_US Comments URL: https://news.ycombinator.com/item?id=50324483 Points: 1 # Comments: 0
A Flutter game holds 60 FPS on a $100 Android phone
bjornhoj
Article URL: https://upsling.space/blog/60-fps-flutter-physics-on-a-100-dollar-phone/ Comments URL: https://news.ycombinator.com/item?id=50307586 Points: 1 # Comments: 0
Building a Flutter IoT app for real-time hydration monitoring in football teams [video]
Harish_0089
Article URL: https://www.youtube.com/watch?v=FBWaoS4QXsw Comments URL: https://news.ycombinator.com/item?id=50272231 Points: 1 # Comments: 0
Build a Flutter Phone Dialer with Call History
lautarolobo
Article URL: https://lautarolobo.xyz/blog/flutter-phone-dialer-call-history/ Comments URL: https://news.ycombinator.com/item?id=50181804 Points: 1 # Comments: 0
Show HN: TutorLoom, an open-source multi-tenant LMS (Django, React, Flutter)
madhukarah
Article URL: https://github.com/pacewisdomhq/TutorLoom Comments URL: https://news.ycombinator.com/item?id=50181517 Points: 2 # Comments: 0
Moonswing – A Desktop Environment for Linux in Flutter
matthewkosarek
Article URL: https://github.com/miracle-wm-org/moonswing Comments URL: https://news.ycombinator.com/item?id=50157418 Points: 1 # Comments: 0
Streaming a coding agent's UI in Flutter: what broke and how we fixed it
narayanahari
Article URL: https://getpullrequest.com/blogs/streaming-agent-ui-in-flutter Comments URL: https://news.ycombinator.com/item?id=50115889 Points: 1 # Comments: 0
A Linux desktop environment in Flutter
matthewkosarek
Article URL: https://github.com/miracle-wm-org/moonswing Comments URL: https://news.ycombinator.com/item?id=50087239 Points: 1 # Comments: 2
Genkit Dart 1.0: Build production-ready agentic apps with Dart and Flutter
khalidkhair
Article URL: https://flutter.dev/blog/announcing-genkit-dart-1-0 Comments URL: https://news.ycombinator.com/item?id=50038795 Points: 4 # Comments: 0
Moonswing: A Linux Desktop Environment Built in Flutter
matthewkosarek
Article URL: https://github.com/miracle-wm-org/moonswing Comments URL: https://news.ycombinator.com/item?id=50021374 Points: 2 # Comments: 1
PomoPlan – Local-first Pomodoro, task, and habit tracker in Flutter
bentamara
Article URL: https://play.google.com/store/apps/details?id=com.pomoplan.pomoplan&hl=en_US Comments URL: https://news.ycombinator.com/item?id=50006163 Points: 2 # Comments: 0
Ask HN: Preferred state management for enterprise Flutter in 2026?
nmdemirkol
When scaling Flutter mobile apps to enterprise level, what state management approach (BLoC, Riverpod, Signals, etc.) have you found most maintainable over time? Interested in experiences regarding testability and onboarding. Comments URL: https://news.ycombinator.com/item?id=50003115 Points: 2 # Comments: 0
Friday – A voice-activated personal AI companion built with Flutter
ddhruv2424
Article URL: https://github.com/dj2313/jarvis_assistant Comments URL: https://news.ycombinator.com/item?id=49994302 Points: 2 # Comments: 0
Show HN: Vynody – Cross-platform music player written in Flutter and Rust
axel10
Article URL: https://github.com/axel10/vynody Comments URL: https://news.ycombinator.com/item?id=49920648 Points: 5 # Comments: 0
Ask HN: React Native or Flutter when the back end is Node?
rearview
Really confused between React Native and Flutter. I’ve mostly worked with Flutter and a little bit with React Native, but that was quite a while back, so I’m not sure how things stand today. I’m building a project with a Node.js + tRPC backend, so React Native is looking really tempting cause of that Typescript. While researching I've seen mixed reviews about performance in React Native like people saying they've spend weeks finding and managing performance issue which does makes me worry. The app I wanna build doesn't have complex canvas work or crazy animations. For a typical production app, what’s the performance situation with React Native vs Flutter now? Are there any major concerns which I should know before looking in React Native? Comments URL: https://news.ycombinator.com/item?id=49881846 Points: 5 # Comments: 15
Show HN: I compiled FreeRDP into a Flutter app so my phone can do RDP and SSH
neil_thomas
Hi HN, I'm the developer. XConnect is an SSH/SFTP client for iOS and Android that also has a real RDP client built in, so one app covers my Linux and Windows machines when I'm away from my desk. No account needed: tap "Continue Offline" and everything stays on the phone. I built it because fixing things from my phone meant switching between an SSH app, a file app and Microsoft's RDP app, and on a small screen the switching was the worst part. What it does: - SSH and Telnet, with a key row for phone keyboards (Esc, Tab, arrows, sticky Ctrl/Alt, one-tap Ctrl-C/D/L/Z) and multiple sessions. - RDP (iOS for now). FreeRDP 3 is compiled into the app, so the phone speaks RDP directly, with no gateway or relay. Trackpad or direct-touch mode, pinch to zoom, two-finger right-click and scroll. Hardware keyboards are forwarded by scancode. - SFTP, jump hosts (ProxyJump-style, for both SSH and SFTP), and 14 built-in scripts you can run on a server with one tap. - An optional AI agent with your own API key (OpenAI-compatible endpoints, Anthropic, or Ollama on your LAN). It runs commands on the host and asks before anything that looks destructive. It does nothing until you configure it. Some technical details: the native RDP core sends Dart one event per frame (connected / bitmap / resize / error / disconnected), in the same binary format my desktop app's RDP helper uses. Dart applies the updates to an RGBA framebuffer and paints it with decodeImageFromPixels. SSH is dartssh2 and the terminal is xterm.dart. Scripts run as heredocs, because my first version joined the lines with "; " and put the whole script behind the shebang comment. Credentials: passwords and private keys are stored in the iOS Keychain / Android Keystore. Sync is optional. Records are encrypted on the device with AES-256-GCM before upload, with a key derived from your account password (PBKDF2, then scrypt per record). To be upfront: login currently sends that password to the server over TLS, so this is not zero-knowledge yet. [Switching login to a separately derived auth hash is next on my list.] The app is closed source. I know that's a hard sell for something that holds SSH keys, so ask me anything about how credentials are handled. Not there yet: RDP on Android, port forwarding on mobile (the desktop app has it), passphrase-protected keys, keyboard-interactive 2FA, and mosh. Pricing: SSH, Telnet, SFTP, scripts and one jump host are free. Pro ($8/month, $68/year, or $88 one-time) adds RDP, the AI agent, sync and unlimited jump hosts. The same account also works in the desktop app for Windows, macOS and Linux. iOS: https://apps.apple.com/us/app/xconnect-ssh-rdp-client/id6810... I'd love feedback, especially from people who manage servers from their phone. What's missing? Comments URL: https://news.ycombinator.com/item?id=49758100 Points: 4 # Comments: 0
PPPlayer – An open-source music player built with Flutter
lucasveneno
Article URL: https://ppplayer.com Comments URL: https://news.ycombinator.com/item?id=49748159 Points: 3 # Comments: 1
I ported a VB6 game to Flutter and generated all 14 art themes
lioil
Article URL: https://apps.apple.com/cz/app/kirian/id6774868017 Comments URL: https://news.ycombinator.com/item?id=49643435 Points: 3 # Comments: 0
Medium
10 条Flutter 相关文章精选
How to Add Native In-App Update Prompts in Flutter for Android and iOS
Pulkit Agarwal
How in_app_update_flutter brings Google Play’s immediate and flexible updates and an in-app App Store update sheet to Flutter, Continue reading on Medium »
Companies Want to Cut Android and iOS Development Costs. Is Cross-Platform the Answer?
Kavya Sri
One Mobile Team Instead of Two: Why Companies Are Cutting Android and iOS Development Costs Continue reading on Medium »
Building MeetMind AI: Live Transcription from Chrome to Android
Charitha Adikari
Continue reading on Medium »
How to Build a Recently Searched Feature Like Flipkart in Flutter
Ankit Mehra
We use shopping applications like Flipkart or Amazon, we often search for products, explore different categories and move between multiple… Continue reading on Medium »
Flutter iOS 27 Compatibility: What Developers Need to Fix
Ravi Savaliya
Understand Apple’s UIScene migration, check your AppDelegate, and avoid unexpected launch failures. Continue reading on Medium »
Flutter’s GenUI Is Coming to A2UI 1.0: Build Your Widget Catalogue Now
Nicolas
This is still an alpha feature that allows agents to create screens using your widgets. This article covers what the prompt first approach… Continue reading on Medium »
Flutter Testing Explained: Testing Pyramid, Strategy & Best Practices
Nisarg Ratani
Testing is one of the most important parts of building a reliable Flutter application. Continue reading on Medium »
Dart Unit Testing: Writing Reliable Tests for Business Logic
Nisarg Ratani
Business logic is the foundation of most applications. Continue reading on Medium »
The Ghost in the Detail Panel: a Flutter Lifecycle Bug and Its Fix
Wartelski.
A detail panel keeps showing the last record’s live status after you’ve switched to a new one. The cause is one of Flutter’s most useful… Continue reading on Medium »
Claude Org IP Allowlist Is Live in Beta, Up to 1,000 Ranges — Top 10 AI & Flutter News November 6…
Blur Brah Lab
Today’s Must-Know: Claude’s Organization IP Allowlist Can Now Block Your Own CI Continue reading on Medium »
社区日榜讨论与资源
Hive CE is now faster than Hive v2. IsolatedHive is even faster.
/u/Rexios80
See the new benchmarks. Thanks to some optimizations, Hive CE is now faster than Hive v2 ever was. Since IsolatedHive can call the sync read/write methods due to being on a separate isolate, it can be even faster in some cases. I also fixed some memory/resource leaks in IsolatedHive. Happy Fluttering! submitted by /u/Rexios80 [link] [comments]
Dart equivalent of C pre-processor's #ifdef
/u/driftwood_studio
Dart's compiler provides no mechanism for excluding code from compilation. Dart has: const bool isEnabled = bool.fromEnvironment('env-var-name'); to pull in defined constants if (const-false-value) { removed statements } to remove a block from compilation Tree shaking to remove unreferenced symbols By combining those I can achieve a somewhat similar effect to the C pre-processor, with a few limitations (and less clarity). It works. It does so, though, with less of a guaranteed straightforward effect than #ifdef due to complexity of rules about how tree shaking works, and without the ability to simply exclude the entire definition of a function (since you can't wrap if (const) { } around a function declaration, only the function body). So... Has anyone else run into a situation where this was an issue? Did you do/find something that's a more straightforward approach than dart's "combine several default behaviors together to produce an effect" system to address this? Edit: context: for excluding "test functions I don't want to even theoretically be accessible in a patched binary". submitted by /u/driftwood_studio [link] [comments]
We built a Flutter feedback package that asks users for missing details
/u/After-Base-8368
“The button doesn’t work.” Which button, on which screen, and what were they trying to do? We built Bopmigo for that conversation. Users describe the problem, answer a short follow-up, and send a report with their screenshot and app/device details. Your team can reply, and they can answer inside the app. The Flutter package works on iOS and Android and connects to Bopmigo’s hosted inbox or email delivery. You can open it from your own feedback button. Private widgets can be masked in screenshots. Source and example app https://github.com/bopmigo/bopmigo-flutter Package https://pub.dev/packages/bopmigo Would this help your team’s reporting flow? submitted by /u/After-Base-8368 [link] [comments]
Can Claude Code run and test Flutter apps using an emulator?
/u/stevenreyes20
I see that Claude can run React Native iOS apps using an emulator. I can't do that on android as far I know, I use my phone. Does Claude support a Flutter emulator too, or is there some kind of MCP server or connector that would allow it to run and test Flutter apps in an emulator? submitted by /u/stevenreyes20 [link] [comments]
FAQ