From 088c273e9a2d3a24486123b4c1b0d375f431e40f Mon Sep 17 00:00:00 2001 From: Vadim <44135514+vodemn@users.noreply.github.com> Date: Mon, 11 Sep 2023 17:02:44 +0200 Subject: [PATCH] added stub `FilmsProvider` --- iap/lib/m3_lightmeter_iap.dart | 9 ++- .../providers/equipment_profile_provider.dart | 32 +++------- iap/lib/src/providers/films_provider.dart | 58 +++++++++++++++++++ .../src/providers/selectable_provider.dart | 45 ++++++++++++++ 4 files changed, 116 insertions(+), 28 deletions(-) create mode 100644 iap/lib/src/providers/films_provider.dart create mode 100644 iap/lib/src/providers/selectable_provider.dart diff --git a/iap/lib/m3_lightmeter_iap.dart b/iap/lib/m3_lightmeter_iap.dart index 8fe8aa5..2f5d26b 100644 --- a/iap/lib/m3_lightmeter_iap.dart +++ b/iap/lib/m3_lightmeter_iap.dart @@ -2,11 +2,12 @@ library m3_lightmeter_iap; import 'package:flutter/material.dart'; import 'package:m3_lightmeter_iap/src/providers/equipment_profile_provider.dart'; +import 'package:m3_lightmeter_iap/src/providers/films_provider.dart'; import 'package:m3_lightmeter_iap/src/providers/iap_products_provider.dart'; export 'src/data/models/iap_product.dart'; -export 'src/providers/equipment_profile_provider.dart' hide EquipmentProfilesAspect; +export 'src/providers/equipment_profile_provider.dart'; export 'src/providers/iap_products_provider.dart'; class IAPProviders extends StatelessWidget { @@ -22,8 +23,10 @@ class IAPProviders extends StatelessWidget { @override Widget build(BuildContext context) { return IAPProductsProvider( - child: EquipmentProfileProvider( - child: child, + child: FilmsProvider( + child: EquipmentProfileProvider( + child: child, + ), ), ); } diff --git a/iap/lib/src/providers/equipment_profile_provider.dart b/iap/lib/src/providers/equipment_profile_provider.dart index 4f7aa0f..92ba8a2 100644 --- a/iap/lib/src/providers/equipment_profile_provider.dart +++ b/iap/lib/src/providers/equipment_profile_provider.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/providers/selectable_provider.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; class EquipmentProfileProvider extends StatefulWidget { @@ -27,7 +28,7 @@ class EquipmentProfileProviderState extends State { @override Widget build(BuildContext context) { return EquipmentProfiles( - profiles: const [_defaultProfile], + values: const [_defaultProfile], selected: _defaultProfile, child: widget.child, ); @@ -42,38 +43,19 @@ class EquipmentProfileProviderState extends State { void deleteProfile(EquipmentProfile data) {} } -enum EquipmentProfilesAspect { list, selected } - -class EquipmentProfiles extends InheritedModel { +class EquipmentProfiles extends SelectableInheritedModel { const EquipmentProfiles({ super.key, - required this.profiles, - required this.selected, + required super.values, + required super.selected, required super.child, }); - final List profiles; - final EquipmentProfile selected; - static List of(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.list, - )! - .profiles; + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.list)!.values; } static EquipmentProfile selectedOf(BuildContext context) { - return InheritedModel.inheritFrom( - context, - aspect: EquipmentProfilesAspect.selected, - )! - .selected; + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.selected)!.selected; } - - @override - bool updateShouldNotify(EquipmentProfiles oldWidget) => false; - - @override - bool updateShouldNotifyDependent(EquipmentProfiles oldWidget, Set dependencies) => false; } diff --git a/iap/lib/src/providers/films_provider.dart b/iap/lib/src/providers/films_provider.dart new file mode 100644 index 0000000..eb03681 --- /dev/null +++ b/iap/lib/src/providers/films_provider.dart @@ -0,0 +1,58 @@ +import 'package:flutter/material.dart'; +import 'package:m3_lightmeter_iap/src/providers/selectable_provider.dart'; +import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; + +class FilmsProvider extends StatefulWidget { + final Widget child; + + const FilmsProvider({ + required this.child, + super.key, + }); + + static FilmsProviderState of(BuildContext context) { + return context.findAncestorStateOfType()!; + } + + @override + State createState() => FilmsProviderState(); +} + +class FilmsProviderState extends State { + late Film _selected = Film.values.first; + + @override + Widget build(BuildContext context) { + return Films( + values: Film.values, + selected: _selected, + child: widget.child, + ); + } + + void setFilm(Film film) { + if (_selected != film) { + _selected = film; + setState(() {}); + } + } + + void saveFilms(List films) {} +} + +class Films extends SelectableInheritedModel { + const Films({ + super.key, + required super.values, + required super.selected, + required super.child, + }); + + static List of(BuildContext context) { + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.list)!.values; + } + + static Film selectedOf(BuildContext context) { + return InheritedModel.inheritFrom(context, aspect: SelectableAspect.selected)!.selected; + } +} diff --git a/iap/lib/src/providers/selectable_provider.dart b/iap/lib/src/providers/selectable_provider.dart new file mode 100644 index 0000000..c4168d3 --- /dev/null +++ b/iap/lib/src/providers/selectable_provider.dart @@ -0,0 +1,45 @@ +import 'package:flutter/material.dart'; + +enum SelectableAspect { list, selected } + +class SelectableInheritedModel extends InheritedModel { + const SelectableInheritedModel({ + super.key, + required this.values, + required this.selected, + required super.child, + }); + + final List values; + final T selected; + + static List of(BuildContext context) { + return InheritedModel.inheritFrom>( + context, + aspect: SelectableAspect.list, + )! + .values; + } + + static T selectedOf(BuildContext context) { + return InheritedModel.inheritFrom( + context, + aspect: SelectableAspect.selected, + )! + .selected; + } + + @override + bool updateShouldNotify(SelectableInheritedModel oldWidget) => true; + + @override + bool updateShouldNotifyDependent(SelectableInheritedModel oldWidget, Set dependencies) { + if (dependencies.contains(SelectableAspect.list)) { + return true; + } else if (dependencies.contains(SelectableAspect.selected)) { + return selected != oldWidget.selected; + } else { + return false; + } + } +}