added stub FilmsProvider

This commit is contained in:
Vadim 2023-09-11 17:02:44 +02:00
parent 1be7c3be48
commit 088c273e9a
4 changed files with 116 additions and 28 deletions

View file

@ -2,11 +2,12 @@ library m3_lightmeter_iap;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:m3_lightmeter_iap/src/providers/equipment_profile_provider.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'; import 'package:m3_lightmeter_iap/src/providers/iap_products_provider.dart';
export 'src/data/models/iap_product.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'; export 'src/providers/iap_products_provider.dart';
class IAPProviders extends StatelessWidget { class IAPProviders extends StatelessWidget {
@ -22,8 +23,10 @@ class IAPProviders extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return IAPProductsProvider( return IAPProductsProvider(
child: EquipmentProfileProvider( child: FilmsProvider(
child: child, child: EquipmentProfileProvider(
child: child,
),
), ),
); );
} }

View file

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:m3_lightmeter_iap/src/providers/selectable_provider.dart';
import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart'; import 'package:m3_lightmeter_resources/m3_lightmeter_resources.dart';
class EquipmentProfileProvider extends StatefulWidget { class EquipmentProfileProvider extends StatefulWidget {
@ -27,7 +28,7 @@ class EquipmentProfileProviderState extends State<EquipmentProfileProvider> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return EquipmentProfiles( return EquipmentProfiles(
profiles: const [_defaultProfile], values: const [_defaultProfile],
selected: _defaultProfile, selected: _defaultProfile,
child: widget.child, child: widget.child,
); );
@ -42,38 +43,19 @@ class EquipmentProfileProviderState extends State<EquipmentProfileProvider> {
void deleteProfile(EquipmentProfile data) {} void deleteProfile(EquipmentProfile data) {}
} }
enum EquipmentProfilesAspect { list, selected } class EquipmentProfiles extends SelectableInheritedModel<EquipmentProfile> {
class EquipmentProfiles extends InheritedModel<EquipmentProfilesAspect> {
const EquipmentProfiles({ const EquipmentProfiles({
super.key, super.key,
required this.profiles, required super.values,
required this.selected, required super.selected,
required super.child, required super.child,
}); });
final List<EquipmentProfile> profiles;
final EquipmentProfile selected;
static List<EquipmentProfile> of(BuildContext context) { static List<EquipmentProfile> of(BuildContext context) {
return InheritedModel.inheritFrom<EquipmentProfiles>( return InheritedModel.inheritFrom<EquipmentProfiles>(context, aspect: SelectableAspect.list)!.values;
context,
aspect: EquipmentProfilesAspect.list,
)!
.profiles;
} }
static EquipmentProfile selectedOf(BuildContext context) { static EquipmentProfile selectedOf(BuildContext context) {
return InheritedModel.inheritFrom<EquipmentProfiles>( return InheritedModel.inheritFrom<EquipmentProfiles>(context, aspect: SelectableAspect.selected)!.selected;
context,
aspect: EquipmentProfilesAspect.selected,
)!
.selected;
} }
@override
bool updateShouldNotify(EquipmentProfiles oldWidget) => false;
@override
bool updateShouldNotifyDependent(EquipmentProfiles oldWidget, Set<EquipmentProfilesAspect> dependencies) => false;
} }

View file

@ -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<FilmsProviderState>()!;
}
@override
State<FilmsProvider> createState() => FilmsProviderState();
}
class FilmsProviderState extends State<FilmsProvider> {
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<Film> films) {}
}
class Films extends SelectableInheritedModel<Film> {
const Films({
super.key,
required super.values,
required super.selected,
required super.child,
});
static List<Film> of(BuildContext context) {
return InheritedModel.inheritFrom<Films>(context, aspect: SelectableAspect.list)!.values;
}
static Film selectedOf(BuildContext context) {
return InheritedModel.inheritFrom<Films>(context, aspect: SelectableAspect.selected)!.selected;
}
}

View file

@ -0,0 +1,45 @@
import 'package:flutter/material.dart';
enum SelectableAspect { list, selected }
class SelectableInheritedModel<T> extends InheritedModel<SelectableAspect> {
const SelectableInheritedModel({
super.key,
required this.values,
required this.selected,
required super.child,
});
final List<T> values;
final T selected;
static List<T> of<T>(BuildContext context) {
return InheritedModel.inheritFrom<SelectableInheritedModel<T>>(
context,
aspect: SelectableAspect.list,
)!
.values;
}
static T selectedOf<T>(BuildContext context) {
return InheritedModel.inheritFrom<SelectableInheritedModel>(
context,
aspect: SelectableAspect.selected,
)!
.selected;
}
@override
bool updateShouldNotify(SelectableInheritedModel oldWidget) => true;
@override
bool updateShouldNotifyDependent(SelectableInheritedModel oldWidget, Set<SelectableAspect> dependencies) {
if (dependencies.contains(SelectableAspect.list)) {
return true;
} else if (dependencies.contains(SelectableAspect.selected)) {
return selected != oldWidget.selected;
} else {
return false;
}
}
}