github AverageConsumer/R-Shop v0.9.8-beta
🚀 v0.9.8 Beta — The "Stability" Update

latest releases: v1.7.0, v1.6.0, v1.5.2...
pre-release4 months ago

Note: This release focuses on stability, crash diagnostics, and eliminating runtime errors. Upgrading from <= 0.9.3 still requires a fresh install.

Highlights

  • Crash Log Service — Local ring-buffer error log (~500KB) captures all uncaught errors with timestamps and stack traces. Persists across sessions in app cache for post-mortem debugging.
  • Export Error Log — New Settings entry shares the crash log via the system share sheet for easy bug reporting. Only visible when the log contains data.
  • Overlay Priority Fix — All overlay scope classes now defer token release via Future(), eliminating the Riverpod "cannot modify provider during widget tree build" crash that occurred on screen transitions.
  • Zone Alignment — Binding initialization and runApp now execute in the same runZonedGuarded zone, eliminating the "Zone mismatch" startup warning.

Change Log

Added:

  • Crash log service — local ring-buffer log file (~500KB) captures all uncaught errors with timestamps and stack traces; persists across sessions in app cache.
  • Export Error Log — new Settings entry (under System) shares the crash log via the system share sheet for easy bug reporting; only visible when log contains data.
  • Disk space pre-check — downloads are rejected with a clear error when device storage drops below 1 GB.

Improved:

  • HTTP download depth guard — the resume-restart path now enforces a single-retry limit, preventing infinite recursion if the server keeps returning mismatched content lengths.
  • FocusSyncManager index safety — ensureFocusNodes() clamps _selectedIndex after pruning disposed nodes; validateState() clamps _targetColumn when column count changes.
  • Zone alignment — WidgetsFlutterBinding.ensureInitialized() and runApp() now execute inside the same runZonedGuarded zone.
  • Overlay priority release — all scope classes defer release() via Future() in dispose(), fixing the Riverpod state modification crash.
  • Detail screen layout — system name badge wrapped in Flexible with ellipsis overflow, fixing RenderFlex overflow on narrow screens.
  • ConfigModeScreen dispose — audio manager cached in initState to avoid ref.read() after widget is disposed.
  • Download queue lookup — getDownloadById() uses a simple loop instead of firstWhere + try/catch, eliminating noisy log spam during queue restore.

Bug Fixes:

  • Overlay priority crash — releasing overlay tokens during widget unmount no longer throws Riverpod state modification errors.
  • FocusSyncManager focus loss — selected index could point to a disposed FocusNode after the item count decreased.
  • RenderFlex overflow — system badge Row on game detail screen no longer overflows on narrow layouts.
  • Zone mismatch warning — binding and app now share the same error zone.
  • ConfigModeScreen "ref after disposed" — no longer crashes when navigating away quickly.

Technical Internal:

  • New CrashLogService singleton with log(), logError(), getLogFile(), clearLog(), getLogContent().
  • crashLogServiceProvider in app_providers.dart, overridden in main.dart.
  • Global error handlers now write to crash log in addition to debugPrint.
  • Removed spammy debugPrint in FocusSyncManager._enforceFocus() for deferred focus.

Don't miss a new R-Shop release

NewReleases is sending notifications on new releases.