mirror of
https://github.com/vodemn/m3_lightmeter.git
synced 2024-11-22 07:20:39 +00:00
Added UserPreferencesService
This commit is contained in:
parent
07dc5d8f57
commit
52d8578d77
22 changed files with 99 additions and 59 deletions
|
@ -5,7 +5,9 @@ import 'package:lightmeter/data/ev_source/ev_source_type.dart';
|
||||||
import 'package:lightmeter/data/permissions_service.dart';
|
import 'package:lightmeter/data/permissions_service.dart';
|
||||||
import 'package:lightmeter/screens/settings/settings_screen.dart';
|
import 'package:lightmeter/screens/settings/settings_screen.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import 'data/shared_prefs_service.dart';
|
||||||
import 'generated/l10n.dart';
|
import 'generated/l10n.dart';
|
||||||
import 'res/theme.dart';
|
import 'res/theme.dart';
|
||||||
import 'screens/metering/flow_metering.dart';
|
import 'screens/metering/flow_metering.dart';
|
||||||
|
@ -38,35 +40,46 @@ class _ApplicationState extends State<Application> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Provider.value(
|
return FutureBuilder<SharedPreferences>(
|
||||||
value: widget.evSource,
|
future: SharedPreferences.getInstance(),
|
||||||
child: Provider(
|
builder: (context, snapshot) {
|
||||||
create: (context) => PermissionsService(),
|
if (snapshot.data != null) {
|
||||||
child: StopTypeProvider(
|
return MultiProvider(
|
||||||
child: MaterialApp(
|
providers: [
|
||||||
theme: ThemeData(
|
Provider(create: (_) => UserPreferencesService(snapshot.data!)),
|
||||||
useMaterial3: true,
|
Provider.value(value: widget.evSource),
|
||||||
colorScheme: lightColorScheme,
|
|
||||||
),
|
|
||||||
localizationsDelegates: const [
|
|
||||||
S.delegate,
|
|
||||||
GlobalMaterialLocalizations.delegate,
|
|
||||||
GlobalWidgetsLocalizations.delegate,
|
|
||||||
GlobalCupertinoLocalizations.delegate,
|
|
||||||
],
|
],
|
||||||
supportedLocales: S.delegate.supportedLocales,
|
child: Provider(
|
||||||
builder: (context, child) => MediaQuery(
|
create: (context) => PermissionsService(),
|
||||||
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
|
child: StopTypeProvider(
|
||||||
child: child!,
|
child: MaterialApp(
|
||||||
|
theme: ThemeData(
|
||||||
|
useMaterial3: true,
|
||||||
|
colorScheme: lightColorScheme,
|
||||||
|
),
|
||||||
|
localizationsDelegates: const [
|
||||||
|
S.delegate,
|
||||||
|
GlobalMaterialLocalizations.delegate,
|
||||||
|
GlobalWidgetsLocalizations.delegate,
|
||||||
|
GlobalCupertinoLocalizations.delegate,
|
||||||
|
],
|
||||||
|
supportedLocales: S.delegate.supportedLocales,
|
||||||
|
builder: (context, child) => MediaQuery(
|
||||||
|
data: MediaQuery.of(context).copyWith(textScaleFactor: 1.0),
|
||||||
|
child: child!,
|
||||||
|
),
|
||||||
|
home: const MeteringFlow(),
|
||||||
|
routes: {
|
||||||
|
"metering": (context) => const MeteringFlow(),
|
||||||
|
"settings": (context) => const SettingsScreen(),
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
home: const MeteringFlow(),
|
);
|
||||||
routes: {
|
}
|
||||||
"metering": (context) => const MeteringFlow(),
|
return const SizedBox();
|
||||||
"settings": (context) => const SettingsScreen(),
|
},
|
||||||
},
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
19
lib/data/shared_prefs_service.dart
Normal file
19
lib/data/shared_prefs_service.dart
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import 'package:lightmeter/data/models/nd_value.dart';
|
||||||
|
import 'package:shared_preferences/shared_preferences.dart';
|
||||||
|
|
||||||
|
import 'models/iso_value.dart';
|
||||||
|
|
||||||
|
class UserPreferencesService {
|
||||||
|
static const _isoKey = "ISO";
|
||||||
|
static const _ndFilterKey = "ND";
|
||||||
|
|
||||||
|
final SharedPreferences _sharedPreferences;
|
||||||
|
|
||||||
|
UserPreferencesService(this._sharedPreferences);
|
||||||
|
|
||||||
|
IsoValue get iso => isoValues.firstWhere((v) => v.value == (_sharedPreferences.getInt(_isoKey) ?? 100));
|
||||||
|
set iso(IsoValue value) => _sharedPreferences.setInt(_isoKey, value.value);
|
||||||
|
|
||||||
|
NdValue get ndFilter => ndValues.firstWhere((v) => v.value == (_sharedPreferences.getInt(_ndFilterKey) ?? 0));
|
||||||
|
set ndFilter(NdValue value) => _sharedPreferences.setInt(_ndFilterKey, value.value);
|
||||||
|
}
|
|
@ -2,12 +2,11 @@ import 'dart:async';
|
||||||
import 'dart:math';
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/models/aperture_value.dart';
|
import 'package:lightmeter/data/models/aperture_value.dart';
|
||||||
import 'package:lightmeter/models/exposure_pair.dart';
|
import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/models/iso_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/models/nd_value.dart';
|
import 'package:lightmeter/data/models/shutter_speed_value.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
import 'package:lightmeter/models/shutter_speed_value.dart';
|
|
||||||
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' as communication_events;
|
import 'package:lightmeter/screens/metering/communication/event_communication_metering.dart' as communication_events;
|
||||||
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart' as communication_states;
|
import 'package:lightmeter/screens/metering/communication/state_communication_metering.dart' as communication_states;
|
||||||
import 'package:lightmeter/utils/log_2.dart';
|
import 'package:lightmeter/utils/log_2.dart';
|
||||||
|
@ -18,6 +17,7 @@ import 'state_metering.dart';
|
||||||
|
|
||||||
class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
||||||
final MeteringCommunicationBloc _communicationBloc;
|
final MeteringCommunicationBloc _communicationBloc;
|
||||||
|
final UserPreferencesService _userPreferencesService;
|
||||||
late final StreamSubscription<communication_states.ScreenState> _communicationSubscription;
|
late final StreamSubscription<communication_states.ScreenState> _communicationSubscription;
|
||||||
|
|
||||||
List<ApertureValue> get _apertureValues => apertureValues.whereStopType(stopType);
|
List<ApertureValue> get _apertureValues => apertureValues.whereStopType(stopType);
|
||||||
|
@ -25,13 +25,16 @@ class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
||||||
|
|
||||||
StopType stopType;
|
StopType stopType;
|
||||||
|
|
||||||
MeteringBloc(this._communicationBloc, this.stopType)
|
MeteringBloc(
|
||||||
: super(
|
this._communicationBloc,
|
||||||
|
this._userPreferencesService,
|
||||||
|
this.stopType,
|
||||||
|
) : super(
|
||||||
MeteringState(
|
MeteringState(
|
||||||
iso: isoValues.where((element) => element.value == 100).first,
|
iso: _userPreferencesService.iso,
|
||||||
ev: 0.0,
|
ev: 0.0,
|
||||||
evCompensation: 0.0,
|
evCompensation: 0.0,
|
||||||
nd: ndValues.first,
|
nd: _userPreferencesService.ndFilter,
|
||||||
exposurePairs: [],
|
exposurePairs: [],
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
|
@ -73,6 +76,7 @@ class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onIsoChanged(IsoChangedEvent event, Emitter emit) {
|
void _onIsoChanged(IsoChangedEvent event, Emitter emit) {
|
||||||
|
_userPreferencesService.iso = event.isoValue;
|
||||||
final ev = state.ev + log2(event.isoValue.value / state.iso.value);
|
final ev = state.ev + log2(event.isoValue.value / state.iso.value);
|
||||||
emit(MeteringState(
|
emit(MeteringState(
|
||||||
iso: event.isoValue,
|
iso: event.isoValue,
|
||||||
|
@ -84,6 +88,7 @@ class MeteringBloc extends Bloc<MeteringEvent, MeteringState> {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onNdChanged(NdChangedEvent event, Emitter emit) {
|
void _onNdChanged(NdChangedEvent event, Emitter emit) {
|
||||||
|
_userPreferencesService.ndFilter = event.ndValue;
|
||||||
final ev = state.ev - event.ndValue.stopReduction + state.nd.stopReduction;
|
final ev = state.ev - event.ndValue.stopReduction + state.nd.stopReduction;
|
||||||
emit(MeteringState(
|
emit(MeteringState(
|
||||||
iso: state.iso,
|
iso: state.iso,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
class ExposurePaitListItem<T extends PhotographyStopValue> extends StatelessWidget {
|
class ExposurePaitListItem<T extends PhotographyStopValue> extends StatelessWidget {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/models/exposure_pair.dart';
|
import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
import 'package:lightmeter/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart';
|
import 'package:lightmeter/screens/metering/components/exposure_pairs_list/components/exposure_pair_item.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
typedef DialogPickerItemBuilder<T extends PhotographyValue> = Widget Function(BuildContext, T);
|
typedef DialogPickerItemBuilder<T extends PhotographyValue> = Widget Function(BuildContext, T);
|
||||||
|
|
|
@ -2,10 +2,10 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart';
|
import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/models/exposure_pair.dart';
|
import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/models/iso_value.dart';
|
import 'package:lightmeter/data/models/iso_value.dart';
|
||||||
import 'package:lightmeter/models/nd_value.dart';
|
import 'package:lightmeter/data/models/nd_value.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
|
|
||||||
import 'components/camera_preview.dart';
|
import 'components/camera_preview.dart';
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:lightmeter/models/iso_value.dart';
|
import 'package:lightmeter/data/models/iso_value.dart';
|
||||||
import 'package:lightmeter/models/nd_value.dart';
|
import 'package:lightmeter/data/models/nd_value.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
|
|
||||||
abstract class MeteringEvent {
|
abstract class MeteringEvent {
|
||||||
const MeteringEvent();
|
const MeteringEvent();
|
||||||
|
|
|
@ -3,7 +3,8 @@ import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart';
|
import 'package:lightmeter/data/ev_source/camera/bloc_camera.dart';
|
||||||
import 'package:lightmeter/data/ev_source/ev_source_type.dart';
|
import 'package:lightmeter/data/ev_source/ev_source_type.dart';
|
||||||
import 'package:lightmeter/data/ev_source/random_ev/bloc_random_ev.dart';
|
import 'package:lightmeter/data/ev_source/random_ev/bloc_random_ev.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
|
import 'package:lightmeter/data/shared_prefs_service.dart';
|
||||||
import 'package:lightmeter/screens/metering/bloc_metering.dart';
|
import 'package:lightmeter/screens/metering/bloc_metering.dart';
|
||||||
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
import 'package:lightmeter/screens/metering/communication/bloc_communication_metering.dart';
|
||||||
|
|
||||||
|
@ -20,6 +21,7 @@ class MeteringFlow extends StatelessWidget {
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (context) => MeteringBloc(
|
create: (context) => MeteringBloc(
|
||||||
context.read<MeteringCommunicationBloc>(),
|
context.read<MeteringCommunicationBloc>(),
|
||||||
|
context.read<UserPreferencesService>(),
|
||||||
context.read<StopType>(),
|
context.read<StopType>(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/res/dimens.dart';
|
import 'package:lightmeter/res/dimens.dart';
|
||||||
import 'package:lightmeter/screens/settings/settings_screen.dart';
|
import 'package:lightmeter/screens/settings/settings_screen.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:lightmeter/models/exposure_pair.dart';
|
import 'package:lightmeter/data/models/exposure_pair.dart';
|
||||||
import 'package:lightmeter/models/iso_value.dart';
|
import 'package:lightmeter/data/models/iso_value.dart';
|
||||||
import 'package:lightmeter/models/nd_value.dart';
|
import 'package:lightmeter/data/models/nd_value.dart';
|
||||||
|
|
||||||
class MeteringState {
|
class MeteringState {
|
||||||
final double ev;
|
final double ev;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
|
|
||||||
class FractionalStopsDialog extends StatefulWidget {
|
class FractionalStopsDialog extends StatefulWidget {
|
||||||
final StopType selectedType;
|
final StopType selectedType;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/generated/l10n.dart';
|
import 'package:lightmeter/generated/l10n.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/utils/stop_type_provider.dart';
|
import 'package:lightmeter/utils/stop_type_provider.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
class StopTypeProvider extends StatefulWidget {
|
class StopTypeProvider extends StatefulWidget {
|
||||||
|
|
|
@ -19,6 +19,7 @@ dependencies:
|
||||||
material_color_utilities: ^0.2.0
|
material_color_utilities: ^0.2.0
|
||||||
permission_handler: 10.2.0
|
permission_handler: 10.2.0
|
||||||
provider: ^6.0.4
|
provider: ^6.0.4
|
||||||
|
shared_preferences: 2.0.15
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
google_fonts: ^3.0.1
|
google_fonts: ^3.0.1
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import 'package:lightmeter/models/aperture_value.dart';
|
import 'package:lightmeter/data/models/aperture_value.dart';
|
||||||
import 'package:lightmeter/models/iso_value.dart';
|
import 'package:lightmeter/data/models/iso_value.dart';
|
||||||
import 'package:lightmeter/models/photography_value.dart';
|
import 'package:lightmeter/data/models/photography_value.dart';
|
||||||
import 'package:lightmeter/models/shutter_speed_value.dart';
|
import 'package:lightmeter/data/models/shutter_speed_value.dart';
|
||||||
import 'package:test/test.dart';
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
|
Loading…
Reference in a new issue