From 54cec166b4e398935a668abb4c2054f5ec503364 Mon Sep 17 00:00:00 2001 From: Irene Date: Sun, 23 Aug 2026 23:26:03 +0900 Subject: [PATCH] fix: add SettingsProvider to SpeedometerViewModel and fix ProviderNotFoundException - SpeedometerViewModel now requires both LocationRepository and SettingsProvider - SpeedometerView uses SettingsProvider.currentTheme instead of non-existent Theme provider - main.dart: SettingsProvider created before SpeedometerViewModel in provider hierarchy - Restores proper DI wiring after layered architecture refactor --- lib/main.dart | 17 +++++++++-------- .../features/speedometer/speedometer_view.dart | 6 +++--- .../speedometer/speedometer_view_model.dart | 13 +++---------- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 5b2732d..ae7d772 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -33,19 +33,20 @@ void main() async { }, ), // UI layer — ViewModels subscribe to repositories - ChangeNotifierProvider( - create: (context) => SpeedometerViewModel( - context.read(), - ), - ), - ChangeNotifierProvider( - create: (_) => OverlayViewModel(), - ), ChangeNotifierProvider( create: (context) => SettingsProvider( context.read(), ), ), + ChangeNotifierProvider( + create: (context) => SpeedometerViewModel( + context.read(), + context.read(), + ), + ), + ChangeNotifierProvider( + create: (_) => OverlayViewModel(), + ), ], child: const SpeedoApp(), ), diff --git a/lib/ui/features/speedometer/speedometer_view.dart b/lib/ui/features/speedometer/speedometer_view.dart index fae6233..68e0bd9 100644 --- a/lib/ui/features/speedometer/speedometer_view.dart +++ b/lib/ui/features/speedometer/speedometer_view.dart @@ -5,6 +5,7 @@ import 'package:provider/provider.dart'; import '../../../core/constants/overlay_constants.dart'; import '../../../core/theme/color_themes.dart'; import '../../shared/speed_display.dart'; +import '../../../providers/settings_provider.dart'; import 'speedometer_view_model.dart'; /// Thin UI view for the speedometer — renders speed and compass. @@ -19,9 +20,8 @@ class SpeedometerView extends StatelessWidget { selector: (_, vm) => vm.displaySpeed, builder: (context, displaySpeed, _) { final vm = context.watch(); - final theme = context.select( - (theme) => ColorThemes.themes[0], - ); + final settings = context.read(); + final theme = settings.currentTheme; // Staleness — UI-layer concern final age = DateTime.now().difference(vm.displayData.timestamp); diff --git a/lib/ui/features/speedometer/speedometer_view_model.dart b/lib/ui/features/speedometer/speedometer_view_model.dart index ba09ce4..c59f31c 100644 --- a/lib/ui/features/speedometer/speedometer_view_model.dart +++ b/lib/ui/features/speedometer/speedometer_view_model.dart @@ -1,5 +1,4 @@ import 'package:flutter/widgets.dart'; -import 'package:provider/provider.dart'; import '../../../core/constants/speed_unit.dart'; import '../../../data/models/location_data.dart'; import '../../../data/repositories/location_repository.dart'; @@ -11,22 +10,16 @@ import '../../../providers/settings_provider.dart'; /// the current display state to the view. No data-layer logic here. class SpeedometerViewModel extends ChangeNotifier { final LocationRepository _repository; - SettingsProvider? _settings; + final SettingsProvider _settings; - SpeedUnit get displayUnit => _settings?.currentUnit ?? SpeedUnit.kmh; + SpeedUnit get displayUnit => _settings.currentUnit; LocationData get displayData => _repository.currentData; String get displaySpeedText => _repository.currentData.displaySpeed; String get displayHeading => _repository.currentData.displayHeading; bool get isSpeedValid => _repository.currentData.isSpeedValid; bool get isHeadingValid => _repository.currentData.isHeadingValid; - SpeedometerViewModel(this._repository); - - /// Call when the ViewModel is inserted into the provider tree so it - /// can listen to SettingsProvider and repository state. - void attach(BuildContext context) { - _settings = context.read(); - } + SpeedometerViewModel(this._repository, this._settings); double get displaySpeed { return displayUnit.convert(_repository.currentData.speed);