mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2025-12-22 17:40:45 +00:00
98 lines
2.6 KiB
Dart
98 lines
2.6 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:friflex_starter/src/initialization/initialization_controller.dart';
|
|
import 'package:friflex_starter/src/initialization/initialization_step.dart';
|
|
import 'package:friflex_starter/src/initialization/initialization_step_label.dart';
|
|
|
|
class InitializationScope<L extends InitializableStepLabel,
|
|
S extends InitializableStep<L, Object?>> extends StatefulWidget {
|
|
const InitializationScope({
|
|
required this.labels,
|
|
required this.createStep,
|
|
required this.relations,
|
|
required this.child,
|
|
super.key,
|
|
});
|
|
|
|
final Set<L> labels;
|
|
final S? Function(BuildContext context, L label) createStep;
|
|
final Map<L, Set<L>> relations;
|
|
final Widget child;
|
|
|
|
static InitializationInheritedScope of(
|
|
BuildContext context, {
|
|
bool listen = false,
|
|
}) {
|
|
// TODO bang
|
|
return _maybeOf(context, listen: listen)!;
|
|
}
|
|
|
|
static InitializationInheritedScope? _maybeOf(
|
|
BuildContext context, {
|
|
bool listen = false,
|
|
}) {
|
|
return listen
|
|
? context
|
|
.dependOnInheritedWidgetOfExactType<InitializationInheritedScope>()
|
|
: context.getInheritedWidgetOfExactType<InitializationInheritedScope>();
|
|
}
|
|
|
|
@override
|
|
State<InitializationScope<L, S>> createState() =>
|
|
_InitializationScopeState<L, S>();
|
|
}
|
|
|
|
class _InitializationScopeState<L extends InitializableStepLabel,
|
|
S extends InitializableStep<L, Object?>>
|
|
extends State<InitializationScope<L, S>> {
|
|
late final InitializationController<L, S> _initializationController;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
|
|
final labelsWithSteps = <L, S>{};
|
|
for (final label in widget.labels) {
|
|
final createdStep = widget.createStep(context, label);
|
|
if (createdStep == null) continue;
|
|
labelsWithSteps[label] = createdStep;
|
|
}
|
|
|
|
_initializationController = InitializationController()
|
|
..initialize(
|
|
labelsWithSteps.values.toSet(),
|
|
widget.relations,
|
|
);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
_initializationController.dispose();
|
|
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return InitializationInheritedScope(
|
|
controller: _initializationController,
|
|
child: widget.child,
|
|
);
|
|
}
|
|
}
|
|
|
|
class InitializationInheritedScope extends InheritedWidget {
|
|
const InitializationInheritedScope({
|
|
required this.controller,
|
|
required super.child,
|
|
super.key,
|
|
});
|
|
|
|
final IInitializationController controller;
|
|
|
|
@override
|
|
bool updateShouldNotify(covariant InheritedWidget oldWidget) {
|
|
return oldWidget is InitializationInheritedScope &&
|
|
oldWidget.controller != controller;
|
|
}
|
|
}
|