| import 'package:jaspr/jaspr.dart'; |
| |
| class Provider<T> extends InheritedComponent { |
| const Provider({super.key, required this.value, this.identity, required super.child}); |
| |
| final T value; |
| final Object? identity; |
| |
| static Provider<T> of<T>(BuildContext context, {bool listen = true}) { |
| if (listen) { |
| final provider = context.dependOnInheritedComponentOfExactType<Provider<T>>(); |
| if (provider == null) { |
| throw Exception('Provider not found'); |
| } |
| return provider; |
| } else { |
| final element = context.getElementForInheritedComponentOfExactType<Provider<T>>(); |
| if (element == null) { |
| throw Exception('Provider not found'); |
| } |
| return element.component as Provider<T>; |
| } |
| } |
| |
| @override |
| bool updateShouldNotify(covariant Provider<T> oldComponent) { |
| return value != oldComponent.value || identity != oldComponent.identity; |
| } |
| } |
| |
| class ChangeNotifierProvider<T extends ChangeNotifier> extends StatelessComponent { |
| const ChangeNotifierProvider({super.key, required this.value, required this.child}); |
| |
| final T value; |
| final Component child; |
| |
| @override |
| Component build(BuildContext context) { |
| return ListenableBuilder( |
| listenable: value, |
| builder: (context) => Provider<T>(value: value, child: child, identity: Object()), |
| ); |
| } |
| } |
| |
| extension ProviderContext on BuildContext { |
| T get<T>() { |
| return Provider.of<T>(this, listen: false).value; |
| } |
| |
| T watch<T>() { |
| return Provider.of<T>(this).value; |
| } |
| } |