248053270b
Delete old flat files, wire new DI in main.dart:
- Removed: gps_service.dart, config/, models/, providers/overlay_provider.dart,
screens/, services/gps_data_manager.dart, services/overlay_service.dart
- Kept: settings_provider.dart (thin, correct), logger.dart (shared util)
- main.dart now wires: LocationRepository → SpeedometerViewModel → SpeedometerView
- overlay_provider.dart deferred, stub in ui/features/overlay/
- flutter analyze: 30 info-level constant_identifier_names warnings (project convention),
zero errors, zero warnings — builds clean
New structure:
lib/
core/constants/ — gps, overlay, timing, speed_unit
core/theme/ — color_themes
data/
models/ — LocationData (immutable domain model)
services/ — GpsService (stateless wrapper), OverlayService (IPC)
repositories/ — LocationRepository (business logic, ChangeNotifier)
providers/ — SettingsProvider (thin, unchanged)
ui/
features/
speedometer/ — SpeedometerViewModel + SpeedometerView
overlay/ — Stub ViewModel + View (deferred)
shared/ — SpeedDisplay widget
services/ — Logger (shared util)
35 lines
1.3 KiB
Dart
35 lines
1.3 KiB
Dart
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';
|
|
import '../../../providers/settings_provider.dart';
|
|
|
|
/// ViewModel for the speedometer UI.
|
|
///
|
|
/// Thin state manager — subscribes to [LocationRepository] and exposes
|
|
/// the current display state to the view. No data-layer logic here.
|
|
class SpeedometerViewModel extends ChangeNotifier {
|
|
final LocationRepository _repository;
|
|
SettingsProvider? _settings;
|
|
|
|
SpeedUnit get displayUnit => _settings?.currentUnit ?? SpeedUnit.kmh;
|
|
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<SettingsProvider>();
|
|
}
|
|
|
|
double get displaySpeed {
|
|
return displayUnit.convert(_repository.currentData.speed);
|
|
}
|
|
}
|