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
This commit is contained in:
+9
-8
@@ -33,19 +33,20 @@ void main() async {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
// UI layer — ViewModels subscribe to repositories
|
// UI layer — ViewModels subscribe to repositories
|
||||||
ChangeNotifierProvider<SpeedometerViewModel>(
|
|
||||||
create: (context) => SpeedometerViewModel(
|
|
||||||
context.read<LocationRepository>(),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ChangeNotifierProvider<OverlayViewModel>(
|
|
||||||
create: (_) => OverlayViewModel(),
|
|
||||||
),
|
|
||||||
ChangeNotifierProvider<SettingsProvider>(
|
ChangeNotifierProvider<SettingsProvider>(
|
||||||
create: (context) => SettingsProvider(
|
create: (context) => SettingsProvider(
|
||||||
context.read<SharedPreferences>(),
|
context.read<SharedPreferences>(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
ChangeNotifierProvider<SpeedometerViewModel>(
|
||||||
|
create: (context) => SpeedometerViewModel(
|
||||||
|
context.read<LocationRepository>(),
|
||||||
|
context.read<SettingsProvider>(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ChangeNotifierProvider<OverlayViewModel>(
|
||||||
|
create: (_) => OverlayViewModel(),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
child: const SpeedoApp(),
|
child: const SpeedoApp(),
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import 'package:provider/provider.dart';
|
|||||||
import '../../../core/constants/overlay_constants.dart';
|
import '../../../core/constants/overlay_constants.dart';
|
||||||
import '../../../core/theme/color_themes.dart';
|
import '../../../core/theme/color_themes.dart';
|
||||||
import '../../shared/speed_display.dart';
|
import '../../shared/speed_display.dart';
|
||||||
|
import '../../../providers/settings_provider.dart';
|
||||||
import 'speedometer_view_model.dart';
|
import 'speedometer_view_model.dart';
|
||||||
|
|
||||||
/// Thin UI view for the speedometer — renders speed and compass.
|
/// Thin UI view for the speedometer — renders speed and compass.
|
||||||
@@ -19,9 +20,8 @@ class SpeedometerView extends StatelessWidget {
|
|||||||
selector: (_, vm) => vm.displaySpeed,
|
selector: (_, vm) => vm.displaySpeed,
|
||||||
builder: (context, displaySpeed, _) {
|
builder: (context, displaySpeed, _) {
|
||||||
final vm = context.watch<SpeedometerViewModel>();
|
final vm = context.watch<SpeedometerViewModel>();
|
||||||
final theme = context.select<Theme, ColorTheme>(
|
final settings = context.read<SettingsProvider>();
|
||||||
(theme) => ColorThemes.themes[0],
|
final theme = settings.currentTheme;
|
||||||
);
|
|
||||||
|
|
||||||
// Staleness — UI-layer concern
|
// Staleness — UI-layer concern
|
||||||
final age = DateTime.now().difference(vm.displayData.timestamp);
|
final age = DateTime.now().difference(vm.displayData.timestamp);
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:provider/provider.dart';
|
|
||||||
import '../../../core/constants/speed_unit.dart';
|
import '../../../core/constants/speed_unit.dart';
|
||||||
import '../../../data/models/location_data.dart';
|
import '../../../data/models/location_data.dart';
|
||||||
import '../../../data/repositories/location_repository.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.
|
/// the current display state to the view. No data-layer logic here.
|
||||||
class SpeedometerViewModel extends ChangeNotifier {
|
class SpeedometerViewModel extends ChangeNotifier {
|
||||||
final LocationRepository _repository;
|
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;
|
LocationData get displayData => _repository.currentData;
|
||||||
String get displaySpeedText => _repository.currentData.displaySpeed;
|
String get displaySpeedText => _repository.currentData.displaySpeed;
|
||||||
String get displayHeading => _repository.currentData.displayHeading;
|
String get displayHeading => _repository.currentData.displayHeading;
|
||||||
bool get isSpeedValid => _repository.currentData.isSpeedValid;
|
bool get isSpeedValid => _repository.currentData.isSpeedValid;
|
||||||
bool get isHeadingValid => _repository.currentData.isHeadingValid;
|
bool get isHeadingValid => _repository.currentData.isHeadingValid;
|
||||||
|
|
||||||
SpeedometerViewModel(this._repository);
|
SpeedometerViewModel(this._repository, this._settings);
|
||||||
|
|
||||||
/// 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<SettingsProvider>();
|
|
||||||
}
|
|
||||||
|
|
||||||
double get displaySpeed {
|
double get displaySpeed {
|
||||||
return displayUnit.convert(_repository.currentData.speed);
|
return displayUnit.convert(_repository.currentData.speed);
|
||||||
|
|||||||
Reference in New Issue
Block a user