blob: 2fb27f96476898031d144771ae243b2e48755fdb [file]
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;
}
}