diff --git a/packages/flutter_riverpod/lib/src/providers/legacy/change_notifier_provider.dart b/packages/flutter_riverpod/lib/src/providers/legacy/change_notifier_provider.dart index 9d3d814b9..5031ad323 100644 --- a/packages/flutter_riverpod/lib/src/providers/legacy/change_notifier_provider.dart +++ b/packages/flutter_riverpod/lib/src/providers/legacy/change_notifier_provider.dart @@ -167,13 +167,13 @@ class ChangeNotifierProviderElement @override final ChangeNotifierProvider provider; - final _notifierNotifier = ProxyElementValueListenable(); + final _notifierNotifier = $ElementLense(); void Function()? _removeListener; @override void create(Ref ref, {required bool didChangeDependency}) { - final notifierResult = _notifierNotifier.result = Result.guard( + final notifierResult = _notifierNotifier.result = $Result.guard( () => provider._createFn(ref), ); @@ -208,8 +208,7 @@ class ChangeNotifierProviderElement @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/lib/src/common/listenable.dart b/packages/riverpod/lib/src/common/listenable.dart index 7a615a3ba..9689865cc 100644 --- a/packages/riverpod/lib/src/common/listenable.dart +++ b/packages/riverpod/lib/src/common/listenable.dart @@ -19,7 +19,7 @@ class _Listener { /// to subsets of the state exposed by a provider. @internal @optionalTypeArgs -class ProxyElementValueListenable extends _ValueListenable { +class $ElementLense extends _ValueListenable { /// Directly obtain the value exposed, gratefully handling cases where /// [result] is null or in error state. T get value { @@ -33,9 +33,9 @@ class ProxyElementValueListenable extends _ValueListenable { /// The state associated with this notifier. /// /// Modifying this property will notify listeners. - Result? get result => _result; - Result? _result; - set result(Result? value) { + $Result? get result => _result; + $Result? _result; + set result($Result? value) { final previous = _result; _result = value; diff --git a/packages/riverpod/lib/src/common/result.dart b/packages/riverpod/lib/src/common/result.dart index bb9d9a938..535be3d77 100644 --- a/packages/riverpod/lib/src/common/result.dart +++ b/packages/riverpod/lib/src/common/result.dart @@ -3,24 +3,24 @@ import 'package:meta/meta.dart'; /// A T|Error union type. @immutable @internal -sealed class Result { +sealed class $Result { /// The data case // coverage:ignore-start - factory Result.data(State state) = ResultData; + factory $Result.data(State state) = ResultData; // coverage:ignore-end /// The error case // coverage:ignore-start - factory Result.error(Object error, StackTrace stackTrace) = ResultError; + factory $Result.error(Object error, StackTrace stackTrace) = ResultError; // coverage:ignore-end /// Automatically catches errors into a [ResultError] and convert successful /// values into a [ResultData]. - static Result guard(State Function() cb) { + static $Result guard(State Function() cb) { try { - return Result.data(cb()); + return $Result.data(cb()); } catch (err, stack) { - return Result.error(err, stack); + return $Result.error(err, stack); } } @@ -36,7 +36,7 @@ sealed class Result { /// The data case @internal -class ResultData implements Result { +class ResultData implements $Result { /// The data case ResultData(this.state); @@ -64,7 +64,7 @@ class ResultData implements Result { /// The error case @internal -class ResultError implements Result { +class ResultError implements $Result { /// The error case ResultError(this.error, this.stackTrace); diff --git a/packages/riverpod/lib/src/core/element.dart b/packages/riverpod/lib/src/core/element.dart index 58dd8045d..b0902b27e 100644 --- a/packages/riverpod/lib/src/core/element.dart +++ b/packages/riverpod/lib/src/core/element.dart @@ -126,7 +126,7 @@ abstract class ProviderElement implements Node { var _didMount = false; /* STATE */ - Result? _stateResult; + $Result? _stateResult; /// The current state of the provider. /// @@ -138,7 +138,7 @@ abstract class ProviderElement implements Node { /// /// This is not meant for public consumption. Instead, public API should use /// [readSelf]. - Result? get stateResult => _stateResult; + $Result? get stateResult => _stateResult; /// Returns the currently exposed by a provider /// @@ -156,7 +156,7 @@ abstract class ProviderElement implements Node { /// /// This API is not meant for public consumption. Instead if a [Ref] needs /// to expose a way to update the state, the practice is to expose a getter/setter. - void setStateResult(Result newState) { + void setStateResult($Result newState) { if (kDebugMode) _debugDidSetState = true; final previousResult = stateResult; @@ -344,7 +344,7 @@ This could mean a few things: } catch (err, stack) { if (kDebugMode) _debugDidSetState = true; - _stateResult = Result.error(err, stack); + _stateResult = $Result.error(err, stack); triggerRetry(err); } finally { _didBuild = true; @@ -428,8 +428,8 @@ The provider ${_debugCurrentlyBuildingElement!.origin} modified $origin while bu } void _notifyListeners( - Result newState, - Result? previousStateResult, { + $Result newState, + $Result? previousStateResult, { bool checkUpdateShouldNotify = true, bool isMount = false, }) { @@ -805,8 +805,7 @@ The provider ${_debugCurrentlyBuildingElement!.origin} modified $origin while bu /// [Ref.listen] multiple times to an element, it may be visited multiple times. void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { void lookup(Iterable children) { for (final child in children) { diff --git a/packages/riverpod/lib/src/core/modifiers/future.dart b/packages/riverpod/lib/src/core/modifiers/future.dart index 1391ce31f..0184c6e67 100644 --- a/packages/riverpod/lib/src/core/modifiers/future.dart +++ b/packages/riverpod/lib/src/core/modifiers/future.dart @@ -239,7 +239,7 @@ mixin FutureModifierElement on ProviderElement> { /// An observable for [FutureProvider.future]. @internal - final futureNotifier = ProxyElementValueListenable>(); + final futureNotifier = $ElementLense>(); Completer? _futureCompleter; Future? _lastFuture; AsyncSubscription? _cancelSubscription; @@ -270,7 +270,7 @@ mixin FutureModifierElement on ProviderElement> { @override @protected - void setStateResult(Result> newState) { + void setStateResult($Result> newState) { newState.requireState.map( loading: onLoading, error: onError, @@ -314,7 +314,7 @@ mixin FutureModifierElement on ProviderElement> { ); _futureCompleter = null; } else { - futureNotifier.result = Result.data( + futureNotifier.result = $Result.data( Future.error( value.error, value.stackTrace, @@ -336,7 +336,7 @@ mixin FutureModifierElement on ProviderElement> { completer.complete(value.value); _futureCompleter = null; } else { - futureNotifier.result = Result.data(Future.value(value.value)); + futureNotifier.result = $Result.data(Future.value(value.value)); } } @@ -515,8 +515,7 @@ mixin FutureModifierElement on ProviderElement> { @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/lib/src/core/modifiers/select.dart b/packages/riverpod/lib/src/core/modifiers/select.dart index b9bf77388..69494b858 100644 --- a/packages/riverpod/lib/src/core/modifiers/select.dart +++ b/packages/riverpod/lib/src/core/modifiers/select.dart @@ -39,17 +39,17 @@ class _ProviderSelector /// The selector applied final OutputT Function(InputT) selector; - Result _select(Result value) { + $Result _select($Result value) { if (kDebugMode) _debugIsRunningSelector = true; try { return switch (value) { - ResultData(:final state) => Result.data(selector(state)), + ResultData(:final state) => $Result.data(selector(state)), ResultError(:final error, :final stackTrace) => - Result.error(error, stackTrace), + $Result.error(error, stackTrace), }; } catch (err, stack) { - return Result.error(err, stack); + return $Result.error(err, stack); } finally { if (kDebugMode) _debugIsRunningSelector = false; } @@ -57,12 +57,12 @@ class _ProviderSelector void _selectOnChange({ required InputT newState, - required Result? lastSelectedValue, + required $Result? lastSelectedValue, required void Function(Object error, StackTrace stackTrace) onError, required void Function(OutputT? prev, OutputT next) listener, - required void Function(Result newState) onChange, + required void Function($Result newState) onChange, }) { - final newSelectedValue = _select(Result.data(newState)); + final newSelectedValue = _select($Result.data(newState)); if (lastSelectedValue == null || !lastSelectedValue.hasState || !newSelectedValue.hasState || @@ -91,7 +91,7 @@ class _ProviderSelector }) { onError ??= Zone.current.handleUncaughtError; - Result? lastSelectedValue; + $Result? lastSelectedValue; final sub = provider.addListener( node, (prev, input) { @@ -109,7 +109,7 @@ class _ProviderSelector onError: onError, ); - if (!weak) lastSelectedValue = _select(Result.guard(sub.read)); + if (!weak) lastSelectedValue = _select($Result.guard(sub.read)); if (fireImmediately) { _handleFireImmediately( diff --git a/packages/riverpod/lib/src/core/modifiers/select_async.dart b/packages/riverpod/lib/src/core/modifiers/select_async.dart index ffb3bd42c..9fa483503 100644 --- a/packages/riverpod/lib/src/core/modifiers/select_async.dart +++ b/packages/riverpod/lib/src/core/modifiers/select_async.dart @@ -22,13 +22,13 @@ class _AsyncSelector /// The selector applied final OutputT Function(InputT) selector; - Result _select(InputT value) { + $Result _select(InputT value) { if (kDebugMode) _debugIsRunningSelector = true; try { - return Result.data(selector(value)); + return $Result.data(selector(value)); } catch (err, stack) { - return Result.error(err, stack); + return $Result.error(err, stack); } finally { if (kDebugMode) _debugIsRunningSelector = false; } @@ -43,7 +43,7 @@ class _AsyncSelector required bool fireImmediately, required bool weak, }) { - Result? lastSelectedValue; + $Result? lastSelectedValue; Completer? selectedCompleter; Future? selectedFuture; diff --git a/packages/riverpod/lib/src/core/provider/notifier_provider.dart b/packages/riverpod/lib/src/core/provider/notifier_provider.dart index b387f128d..19b92b99a 100644 --- a/packages/riverpod/lib/src/core/provider/notifier_provider.dart +++ b/packages/riverpod/lib/src/core/provider/notifier_provider.dart @@ -187,7 +187,7 @@ abstract class ClassProviderElement< // @override $ClassProvider get provider; - final classListenable = ProxyElementValueListenable(); + final classListenable = $ElementLense(); @mustCallSuper @override @@ -198,7 +198,7 @@ abstract class ClassProviderElement< // }) { final seamless = !didChangeDependency; - final result = classListenable.result = Result.guard(() { + final result = classListenable.result = $Result.guard(() { final notifier = provider.create(); if (notifier._ref != null) { throw StateError(alreadyInitializedError); @@ -250,8 +250,7 @@ abstract class ClassProviderElement< // @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/lib/src/core/provider_subscription.dart b/packages/riverpod/lib/src/core/provider_subscription.dart index 421a72790..a3e5238ef 100644 --- a/packages/riverpod/lib/src/core/provider_subscription.dart +++ b/packages/riverpod/lib/src/core/provider_subscription.dart @@ -369,7 +369,7 @@ final class ProviderStateSubscription /// Deals with the internals of synchronously calling the listeners /// when using `fireImmediately: true` void _handleFireImmediately( - Result currentState, { + $Result currentState, { required void Function(StateT? previous, StateT current) listener, required void Function(Object error, StackTrace stackTrace) onError, }) { diff --git a/packages/riverpod/lib/src/core/proxy_provider_listenable.dart b/packages/riverpod/lib/src/core/proxy_provider_listenable.dart index 94e9651b8..0fde2bb5b 100644 --- a/packages/riverpod/lib/src/core/proxy_provider_listenable.dart +++ b/packages/riverpod/lib/src/core/proxy_provider_listenable.dart @@ -1,11 +1,11 @@ part of '../framework.dart'; -class LazyProxyListenable +class $LazyProxyListenable with ProviderListenable, ProviderListenableWithOrigin { - LazyProxyListenable(this.provider, this._lense); + $LazyProxyListenable(this.provider, this._lense); final ProviderBase provider; - final ProxyElementValueListenable Function( + final $ElementLense Function( ProviderElement element, ) _lense; @@ -100,7 +100,7 @@ class ProviderElementProxy @override final ProviderBase provider; - final ProxyElementValueListenable Function( + final $ElementLense Function( ProviderElement element, ) _lense; diff --git a/packages/riverpod/lib/src/mutation.dart b/packages/riverpod/lib/src/mutation.dart index 2e922953c..1ac949fe1 100644 --- a/packages/riverpod/lib/src/mutation.dart +++ b/packages/riverpod/lib/src/mutation.dart @@ -363,7 +363,7 @@ abstract class $SyncMutationBase< @override void setData(StateT value) { - element.setStateResult(Result.data(value)); + element.setStateResult($Result.data(value)); } } @@ -377,7 +377,7 @@ abstract class $AsyncMutationBase< @override void setData(StateT value) { - element.setStateResult(Result.data(AsyncData(value))); + element.setStateResult($Result.data(AsyncData(value))); } } @@ -397,7 +397,7 @@ abstract class _MutationBase< final Object? key; ClassProviderElement get element; - ProxyElementValueListenable get listenable; + $ElementLense get listenable; Object? get _currentKey => listenable.result?.stateOrNull?.key; @@ -431,7 +431,7 @@ abstract class _MutationBase< } void _setState(MutationContext? mutationContext, MutationT mutation) { - listenable.result = Result.data(mutation); + listenable.result = $Result.data(mutation); final obsContext = ProviderObserverContext( element.origin, diff --git a/packages/riverpod/lib/src/providers/legacy/state_notifier_provider.dart b/packages/riverpod/lib/src/providers/legacy/state_notifier_provider.dart index a46f22601..d1040f08a 100644 --- a/packages/riverpod/lib/src/providers/legacy/state_notifier_provider.dart +++ b/packages/riverpod/lib/src/providers/legacy/state_notifier_provider.dart @@ -172,13 +172,13 @@ class StateNotifierProviderElement, @override final StateNotifierProvider provider; - final _notifierNotifier = ProxyElementValueListenable(); + final _notifierNotifier = $ElementLense(); void Function()? _removeListener; @override void create(Ref ref, {required bool didChangeDependency}) { - final notifier = _notifierNotifier.result = Result.guard( + final notifier = _notifierNotifier.result = $Result.guard( () => provider._create(ref), ); @@ -212,8 +212,7 @@ class StateNotifierProviderElement, @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/lib/src/providers/legacy/state_provider.dart b/packages/riverpod/lib/src/providers/legacy/state_provider.dart index 1d2006d7f..7a454aa8e 100644 --- a/packages/riverpod/lib/src/providers/legacy/state_provider.dart +++ b/packages/riverpod/lib/src/providers/legacy/state_provider.dart @@ -119,9 +119,9 @@ class StateProviderElement extends ProviderElement { @override final StateProvider provider; - final _controllerNotifier = ProxyElementValueListenable>(); + final _controllerNotifier = $ElementLense>(); - final _stateNotifier = ProxyElementValueListenable>(); + final _stateNotifier = $ElementLense>(); void Function()? _removeListener; @@ -133,7 +133,7 @@ class StateProviderElement extends ProviderElement { final initialState = provider._createFn(ref); final controller = StateController(initialState); - _controllerNotifier.result = Result.data(controller); + _controllerNotifier.result = $Result.data(controller); _removeListener = controller.addListener( fireImmediately: true, @@ -163,8 +163,7 @@ class StateProviderElement extends ProviderElement { @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/lib/src/providers/stream_provider.dart b/packages/riverpod/lib/src/providers/stream_provider.dart index a87e0bc6e..140d07698 100644 --- a/packages/riverpod/lib/src/providers/stream_provider.dart +++ b/packages/riverpod/lib/src/providers/stream_provider.dart @@ -160,7 +160,7 @@ class $StreamProviderElement extends ProviderElement> @override final $StreamProvider provider; - final _streamNotifier = ProxyElementValueListenable>(); + final _streamNotifier = $ElementLense>(); final StreamController _streamController = StreamController.broadcast(); @@ -170,7 +170,7 @@ class $StreamProviderElement extends ProviderElement> required bool didChangeDependency, }) { asyncTransition(AsyncLoading(), seamless: !didChangeDependency); - _streamNotifier.result ??= Result.data(_streamController.stream); + _streamNotifier.result ??= $Result.data(_streamController.stream); handleStream( () => provider.create(ref), @@ -190,8 +190,7 @@ class $StreamProviderElement extends ProviderElement> @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, diff --git a/packages/riverpod/test/src/common/result_test.dart b/packages/riverpod/test/src/common/result_test.dart index 902634c8c..e7e1fec01 100644 --- a/packages/riverpod/test/src/common/result_test.dart +++ b/packages/riverpod/test/src/common/result_test.dart @@ -4,32 +4,32 @@ import 'package:test/test.dart'; void main() { group('Result.data', () { test('implements hashCode/==', () { - expect(Result.data(42), Result.data(42)); - expect(Result.data(42), isNot(Result.data(21))); + expect($Result.data(42), $Result.data(42)); + expect($Result.data(42), isNot($Result.data(21))); - expect(Result.data(42).hashCode, Result.data(42).hashCode); - expect(Result.data(42).hashCode, isNot(Result.data(21).hashCode)); + expect($Result.data(42).hashCode, $Result.data(42).hashCode); + expect($Result.data(42).hashCode, isNot($Result.data(21).hashCode)); }); }); group('Result.error', () { test('implements hashCode/==', () { expect( - Result.error(42, StackTrace.empty), - Result.error(42, StackTrace.empty), + $Result.error(42, StackTrace.empty), + $Result.error(42, StackTrace.empty), ); expect( - Result.error(42, StackTrace.empty), - isNot(Result.error(21, StackTrace.empty)), + $Result.error(42, StackTrace.empty), + isNot($Result.error(21, StackTrace.empty)), ); expect( - Result.error(42, StackTrace.empty).hashCode, - Result.error(42, StackTrace.empty).hashCode, + $Result.error(42, StackTrace.empty).hashCode, + $Result.error(42, StackTrace.empty).hashCode, ); expect( - Result.error(42, StackTrace.empty).hashCode, - isNot(Result.error(21, StackTrace.empty).hashCode), + $Result.error(42, StackTrace.empty).hashCode, + isNot($Result.error(21, StackTrace.empty).hashCode), ); }); }); diff --git a/packages/riverpod_annotation/lib/riverpod_annotation.dart b/packages/riverpod_annotation/lib/riverpod_annotation.dart index d8ddb66ab..e449dd69d 100644 --- a/packages/riverpod_annotation/lib/riverpod_annotation.dart +++ b/packages/riverpod_annotation/lib/riverpod_annotation.dart @@ -25,6 +25,13 @@ export 'package:riverpod/src/internals.dart' $RefArg, $ProviderPointer, + // Mutation/Listenables + ProviderListenable, + $LazyProxyListenable, + ProviderElement, + $ElementLense, + $Result, + // Provider $Provider, $ProviderElement, diff --git a/packages/riverpod_generator/lib/src/templates/element.dart b/packages/riverpod_generator/lib/src/templates/element.dart index 165f24602..8951911a3 100644 --- a/packages/riverpod_generator/lib/src/templates/element.dart +++ b/packages/riverpod_generator/lib/src/templates/element.dart @@ -42,17 +42,17 @@ class ${provider.generatedElementName}$_genericsDefinition extends ${provider.in void _constructorBody(StringBuffer buffer) { for (final mutation in provider.mutations) { buffer.writeln( - ' ${mutation.elementFieldName}.result = Result.data(${mutation.generatedMutationImplName}(this));', + ' ${mutation.elementFieldName}.result = \$Result.data(${mutation.generatedMutationImplName}(this));', ); } } void _overrideVisitChildren(StringBuffer buffer) { - buffer.writeln(''' + buffer.writeln(r''' @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( @@ -73,7 +73,7 @@ class ${provider.generatedElementName}$_genericsDefinition extends ${provider.in void _fields(StringBuffer buffer) { for (final mutation in provider.mutations) { buffer.writeln( - ' final ${mutation.elementFieldName} = ProxyElementValueListenable<${mutation.generatedMutationImplName}>();', + ' final ${mutation.elementFieldName} = \$ElementLense<${mutation.generatedMutationImplName}>();', ); } } diff --git a/packages/riverpod_generator/lib/src/templates/mutation.dart b/packages/riverpod_generator/lib/src/templates/mutation.dart index 044ec019f..902569b52 100644 --- a/packages/riverpod_generator/lib/src/templates/mutation.dart +++ b/packages/riverpod_generator/lib/src/templates/mutation.dart @@ -56,7 +56,7 @@ final class ${mutation.generatedMutationImplName} final ${provider.generatedElementName} element; @override - ProxyElementValueListenable<${mutation.generatedMutationImplName}> get listenable => element.${mutation.elementFieldName}; + \$ElementLense<${mutation.generatedMutationImplName}> get listenable => element.${mutation.elementFieldName}; @override Future<${provider.valueTypeDisplayString}> call${mutation.node.typeParameters.genericDefinitionDisplayString()}${mutation.node.parameters} { @@ -67,7 +67,7 @@ final class ${mutation.generatedMutationImplName} } @override - ${mutation.generatedMutationImplName} copyWith(MutationState state, {Object? key}) => ${mutation.generatedMutationImplName}(element, state: state, key: key); + ${mutation.generatedMutationImplName} copyWith(MutationState<${provider.valueTypeDisplayString}> state, {Object? key}) => ${mutation.generatedMutationImplName}(element, state: state, key: key); } '''); } @@ -81,7 +81,7 @@ final class ${mutation.generatedMutationImplName} Map? named = Map.fromEntries( mutation.node.parameters?.parameters .where((e) => e.isNamed) - .map((e) => MapEntry(e.name!.lexeme, e.name!.lexeme)) ?? + .map((e) => MapEntry('#${e.name!.lexeme}', e.name!.lexeme)) ?? const [], ); diff --git a/packages/riverpod_generator/lib/src/templates/provider.dart b/packages/riverpod_generator/lib/src/templates/provider.dart index 967f0303f..46729b2fb 100644 --- a/packages/riverpod_generator/lib/src/templates/provider.dart +++ b/packages/riverpod_generator/lib/src/templates/provider.dart @@ -216,7 +216,7 @@ ${provider.doc} final class $name$_genericsDefinition for (final mutation in mutations) { buffer.writeln(''' ProviderListenable<${mutation.generatedMutationInterfaceName}> get ${mutation.name} - => LazyProxyListenable<${mutation.generatedMutationInterfaceName}, ${provider.exposedTypeDisplayString}>( + => \$LazyProxyListenable<${mutation.generatedMutationInterfaceName}, ${provider.exposedTypeDisplayString}>( this, (element) { element as ${provider.generatedElementName}$_generics; diff --git a/packages/riverpod_generator/test/integration/mutation.dart b/packages/riverpod_generator/test/integration/mutation.dart index 08ccca44e..ab8071f79 100644 --- a/packages/riverpod_generator/test/integration/mutation.dart +++ b/packages/riverpod_generator/test/integration/mutation.dart @@ -1,4 +1,3 @@ -import 'package:riverpod/src/internals.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'mutation.g.dart'; @@ -86,64 +85,16 @@ class FailingCtor extends _$FailingCtor { Future increment([int inc = 1]) async => state + inc; } -// final mut = ref.watch(aProvider(arg).increment); -// mut(2); - -// class User { -// final String id; -// } - -// class UserSub extends User {} - -// class IList extends List {} - -// @Repository(retry: retry) -// class Users extends _$Users { -// @riverpod -// FutureOr byId(String id) => User(); - -// @riverpod -// Future> home() async => []; - -// @riverpod -// Future> search(String search) async => []; - -// @riverpod -// Future> search(String search) async => []; - -// @riverpod -// Future> search(String search) async => []; - -// @riverpod -// Stream> socketSearch(String search) async => []; - -// @mutation -// Future addUser(User user) async { -// return user; -// } -// } - -// abstract class Repository { -// Map> _all; - -// KeyT key(StateT state); - -// void build(Ref ref); -// } - -// abstract class _$Users extends Repository { -// // User has a .id, so we automatically pick it up as the key -// @override -// String key(User user) => user.id; - -// @override -// void build(ref) { -// observe(providerOrFamily, onAdd: (provider, key, value) { -// ref.mutate((state) => state.add(value)); -// }, onUpdate); -// } -// } +@riverpod +class Typed extends _$Typed { + @override + String build() => 'typed'; -// // ref.watch(usersProvider.byId('123')); -// // ref.watch(usersProvider.home); -// // ref.watch(usersProvider.search('john')); + @mutation + Future mutate( + String one, { + required String two, + required String three, + }) async => + '$one $two $three'; +} diff --git a/packages/riverpod_generator/test/integration/mutation.g.dart b/packages/riverpod_generator/test/integration/mutation.g.dart index e229d3876..7d2f70556 100644 --- a/packages/riverpod_generator/test/integration/mutation.g.dart +++ b/packages/riverpod_generator/test/integration/mutation.g.dart @@ -65,7 +65,7 @@ final class SimpleProvider extends $NotifierProvider { _$SimpleElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$SimpleElement; @@ -75,7 +75,7 @@ final class SimpleProvider extends $NotifierProvider { ); ProviderListenable get incrementOr => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$SimpleElement; @@ -85,7 +85,7 @@ final class SimpleProvider extends $NotifierProvider { ); ProviderListenable get delegated => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$SimpleElement; @@ -106,13 +106,13 @@ abstract class _$Simple extends $Notifier { class _$SimpleElement extends $NotifierProviderElement { _$SimpleElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$Simple$Increment(this)); - _$incrementOr.result = Result.data(_$Simple$IncrementOr(this)); - _$delegated.result = Result.data(_$Simple$Delegated(this)); + _$increment.result = $Result.data(_$Simple$Increment(this)); + _$incrementOr.result = $Result.data(_$Simple$IncrementOr(this)); + _$delegated.result = $Result.data(_$Simple$Delegated(this)); } - final _$increment = ProxyElementValueListenable<_$Simple$Increment>(); - final _$incrementOr = ProxyElementValueListenable<_$Simple$IncrementOr>(); - final _$delegated = ProxyElementValueListenable<_$Simple$Delegated>(); + final _$increment = $ElementLense<_$Simple$Increment>(); + final _$incrementOr = $ElementLense<_$Simple$IncrementOr>(); + final _$delegated = $ElementLense<_$Simple$Delegated>(); @override void mount() { super.mount(); @@ -124,8 +124,7 @@ class _$SimpleElement extends $NotifierProviderElement { @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -168,8 +167,7 @@ final class _$Simple$Increment final _$SimpleElement element; @override - ProxyElementValueListenable<_$Simple$Increment> get listenable => - element._$increment; + $ElementLense<_$Simple$Increment> get listenable => element._$increment; @override Future call([int inc = 1]) { @@ -219,8 +217,7 @@ final class _$Simple$IncrementOr final _$SimpleElement element; @override - ProxyElementValueListenable<_$Simple$IncrementOr> get listenable => - element._$incrementOr; + $ElementLense<_$Simple$IncrementOr> get listenable => element._$incrementOr; @override Future call() { @@ -268,8 +265,7 @@ final class _$Simple$Delegated final _$SimpleElement element; @override - ProxyElementValueListenable<_$Simple$Delegated> get listenable => - element._$delegated; + $ElementLense<_$Simple$Delegated> get listenable => element._$delegated; @override Future call(Future Function() fn) { @@ -362,7 +358,7 @@ final class SimpleFamilyProvider extends $NotifierProvider { _$SimpleFamilyElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$SimpleFamilyElement; @@ -372,7 +368,7 @@ final class SimpleFamilyProvider extends $NotifierProvider { ); ProviderListenable get incrementOr => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$SimpleFamilyElement; @@ -471,12 +467,11 @@ abstract class _$SimpleFamily extends $Notifier { class _$SimpleFamilyElement extends $NotifierProviderElement { _$SimpleFamilyElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$SimpleFamily$Increment(this)); - _$incrementOr.result = Result.data(_$SimpleFamily$IncrementOr(this)); + _$increment.result = $Result.data(_$SimpleFamily$Increment(this)); + _$incrementOr.result = $Result.data(_$SimpleFamily$IncrementOr(this)); } - final _$increment = ProxyElementValueListenable<_$SimpleFamily$Increment>(); - final _$incrementOr = - ProxyElementValueListenable<_$SimpleFamily$IncrementOr>(); + final _$increment = $ElementLense<_$SimpleFamily$Increment>(); + final _$incrementOr = $ElementLense<_$SimpleFamily$IncrementOr>(); @override void mount() { super.mount(); @@ -487,8 +482,7 @@ class _$SimpleFamilyElement @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -530,8 +524,7 @@ final class _$SimpleFamily$Increment final _$SimpleFamilyElement element; @override - ProxyElementValueListenable<_$SimpleFamily$Increment> get listenable => - element._$increment; + $ElementLense<_$SimpleFamily$Increment> get listenable => element._$increment; @override Future call([int inc = 1]) { @@ -581,7 +574,7 @@ final class _$SimpleFamily$IncrementOr final _$SimpleFamilyElement element; @override - ProxyElementValueListenable<_$SimpleFamily$IncrementOr> get listenable => + $ElementLense<_$SimpleFamily$IncrementOr> get listenable => element._$incrementOr; @override @@ -653,7 +646,7 @@ final class SimpleAsyncProvider _$SimpleAsyncElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable>( + $LazyProxyListenable>( this, (element) { element as _$SimpleAsyncElement; @@ -663,7 +656,7 @@ final class SimpleAsyncProvider ); ProviderListenable get delegated => - LazyProxyListenable>( + $LazyProxyListenable>( this, (element) { element as _$SimpleAsyncElement; @@ -685,11 +678,11 @@ abstract class _$SimpleAsync extends $AsyncNotifier { class _$SimpleAsyncElement extends $AsyncNotifierProviderElement { _$SimpleAsyncElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$SimpleAsync$Increment(this)); - _$delegated.result = Result.data(_$SimpleAsync$Delegated(this)); + _$increment.result = $Result.data(_$SimpleAsync$Increment(this)); + _$delegated.result = $Result.data(_$SimpleAsync$Delegated(this)); } - final _$increment = ProxyElementValueListenable<_$SimpleAsync$Increment>(); - final _$delegated = ProxyElementValueListenable<_$SimpleAsync$Delegated>(); + final _$increment = $ElementLense<_$SimpleAsync$Increment>(); + final _$delegated = $ElementLense<_$SimpleAsync$Delegated>(); @override void mount() { super.mount(); @@ -700,8 +693,7 @@ class _$SimpleAsyncElement @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -743,8 +735,7 @@ final class _$SimpleAsync$Increment final _$SimpleAsyncElement element; @override - ProxyElementValueListenable<_$SimpleAsync$Increment> get listenable => - element._$increment; + $ElementLense<_$SimpleAsync$Increment> get listenable => element._$increment; @override Future call([int inc = 1]) { @@ -794,8 +785,7 @@ final class _$SimpleAsync$Delegated final _$SimpleAsyncElement element; @override - ProxyElementValueListenable<_$SimpleAsync$Delegated> get listenable => - element._$delegated; + $ElementLense<_$SimpleAsync$Delegated> get listenable => element._$delegated; @override Future call(Future Function() fn) { @@ -881,7 +871,7 @@ final class SimpleAsync2Provider _$SimpleAsync2Element(this, pointer); ProviderListenable get increment => - LazyProxyListenable>( + $LazyProxyListenable>( this, (element) { element as _$SimpleAsync2Element; @@ -980,9 +970,9 @@ abstract class _$SimpleAsync2 extends $StreamNotifier { class _$SimpleAsync2Element extends $StreamNotifierProviderElement { _$SimpleAsync2Element(super.provider, super.pointer) { - _$increment.result = Result.data(_$SimpleAsync2$Increment(this)); + _$increment.result = $Result.data(_$SimpleAsync2$Increment(this)); } - final _$increment = ProxyElementValueListenable<_$SimpleAsync2$Increment>(); + final _$increment = $ElementLense<_$SimpleAsync2$Increment>(); @override void mount() { super.mount(); @@ -992,8 +982,7 @@ class _$SimpleAsync2Element @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -1034,8 +1023,7 @@ final class _$SimpleAsync2$Increment final _$SimpleAsync2Element element; @override - ProxyElementValueListenable<_$SimpleAsync2$Increment> get listenable => - element._$increment; + $ElementLense<_$SimpleAsync2$Increment> get listenable => element._$increment; @override Future call() { @@ -1131,7 +1119,7 @@ final class GenericProvider _$GenericElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable>( + $LazyProxyListenable>( this, (element) { element as _$GenericElement; @@ -1212,9 +1200,9 @@ abstract class _$Generic extends $AsyncNotifier { class _$GenericElement extends $AsyncNotifierProviderElement, int> { _$GenericElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$Generic$Increment(this)); + _$increment.result = $Result.data(_$Generic$Increment(this)); } - final _$increment = ProxyElementValueListenable<_$Generic$Increment>(); + final _$increment = $ElementLense<_$Generic$Increment>(); @override void mount() { super.mount(); @@ -1224,8 +1212,7 @@ class _$GenericElement @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -1266,8 +1253,7 @@ final class _$Generic$Increment final _$GenericElement element; @override - ProxyElementValueListenable<_$Generic$Increment> get listenable => - element._$increment; + $ElementLense<_$Generic$Increment> get listenable => element._$increment; @override Future call() { @@ -1336,7 +1322,7 @@ final class GenericMutProvider extends $AsyncNotifierProvider { _$GenericMutElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable>( + $LazyProxyListenable>( this, (element) { element as _$GenericMutElement; @@ -1358,9 +1344,9 @@ abstract class _$GenericMut extends $AsyncNotifier { class _$GenericMutElement extends $AsyncNotifierProviderElement { _$GenericMutElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$GenericMut$Increment(this)); + _$increment.result = $Result.data(_$GenericMut$Increment(this)); } - final _$increment = ProxyElementValueListenable<_$GenericMut$Increment>(); + final _$increment = $ElementLense<_$GenericMut$Increment>(); @override void mount() { super.mount(); @@ -1370,8 +1356,7 @@ class _$GenericMutElement @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -1412,8 +1397,7 @@ final class _$GenericMut$Increment final _$GenericMutElement element; @override - ProxyElementValueListenable<_$GenericMut$Increment> get listenable => - element._$increment; + $ElementLense<_$GenericMut$Increment> get listenable => element._$increment; @override Future call(T value) { @@ -1493,7 +1477,7 @@ final class FailingCtorProvider extends $NotifierProvider { _$FailingCtorElement(this, pointer); ProviderListenable get increment => - LazyProxyListenable( + $LazyProxyListenable( this, (element) { element as _$FailingCtorElement; @@ -1514,9 +1498,9 @@ abstract class _$FailingCtor extends $Notifier { class _$FailingCtorElement extends $NotifierProviderElement { _$FailingCtorElement(super.provider, super.pointer) { - _$increment.result = Result.data(_$FailingCtor$Increment(this)); + _$increment.result = $Result.data(_$FailingCtor$Increment(this)); } - final _$increment = ProxyElementValueListenable<_$FailingCtor$Increment>(); + final _$increment = $ElementLense<_$FailingCtor$Increment>(); @override void mount() { super.mount(); @@ -1526,8 +1510,7 @@ class _$FailingCtorElement extends $NotifierProviderElement { @override void visitChildren({ required void Function(ProviderElement element) elementVisitor, - required void Function(ProxyElementValueListenable element) - listenableVisitor, + required void Function($ElementLense element) listenableVisitor, }) { super.visitChildren( elementVisitor: elementVisitor, @@ -1568,8 +1551,7 @@ final class _$FailingCtor$Increment final _$FailingCtorElement element; @override - ProxyElementValueListenable<_$FailingCtor$Increment> get listenable => - element._$increment; + $ElementLense<_$FailingCtor$Increment> get listenable => element._$increment; @override Future call([int inc = 1]) { @@ -1589,5 +1571,158 @@ final class _$FailingCtor$Increment _$FailingCtor$Increment(element, state: state, key: key); } +@ProviderFor(Typed) +const typedProvider = TypedProvider._(); + +final class TypedProvider extends $NotifierProvider { + const TypedProvider._( + {super.runNotifierBuildOverride, Typed Function()? create}) + : _createCb = create, + super( + from: null, + argument: null, + retry: null, + name: r'typedProvider', + isAutoDispose: true, + dependencies: null, + allTransitiveDependencies: null, + ); + + final Typed Function()? _createCb; + + @override + String debugGetCreateSourceHash() => _$typedHash(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(String value) { + return $ProviderOverride( + origin: this, + providerOverride: $ValueProvider(value), + ); + } + + @$internal + @override + Typed create() => _createCb?.call() ?? Typed(); + + @$internal + @override + TypedProvider $copyWithCreate( + Typed Function() create, + ) { + return TypedProvider._(create: create); + } + + @$internal + @override + TypedProvider $copyWithBuild( + String Function( + Ref, + Typed, + ) build, + ) { + return TypedProvider._(runNotifierBuildOverride: build); + } + + @$internal + @override + _$TypedElement $createElement($ProviderPointer pointer) => + _$TypedElement(this, pointer); + + ProviderListenable get mutate => + $LazyProxyListenable( + this, + (element) { + element as _$TypedElement; + + return element._$mutate; + }, + ); +} + +String _$typedHash() => r'1f53e16796771d14fcdfec41d2b9f5eb70d875a7'; + +abstract class _$Typed extends $Notifier { + String build(); + @$internal + @override + String runBuild() => build(); +} + +class _$TypedElement extends $NotifierProviderElement { + _$TypedElement(super.provider, super.pointer) { + _$mutate.result = $Result.data(_$Typed$Mutate(this)); + } + final _$mutate = $ElementLense<_$Typed$Mutate>(); + @override + void mount() { + super.mount(); + _$mutate.result!.stateOrNull!.reset(); + } + + @override + void visitChildren({ + required void Function(ProviderElement element) elementVisitor, + required void Function($ElementLense element) listenableVisitor, + }) { + super.visitChildren( + elementVisitor: elementVisitor, + listenableVisitor: listenableVisitor, + ); + + listenableVisitor(_$mutate); + } +} + +sealed class Typed$Mutate extends MutationBase { + /// Starts the mutation. + /// + /// This will first set the state to [PendingMutationState], then + /// will call [Typed.mutate] with the provided parameters. + /// + /// After the method completes, the mutation state will be updated to either + /// [SuccessMutationState] or [ErrorMutationState] based on if the method + /// threw or not. + /// + /// Lastly, if the method completes without throwing, the Notifier's state + /// will be updated with the new value. + /// + /// **Note**: + /// If the notifier threw in its constructor, the mutation won't start + /// and [call] will throw. + /// This should generally never happen though, as Notifiers are not supposed + /// to have logic in their constructors. + Future call(String one, {required String two, required String three}); +} + +final class _$Typed$Mutate + extends $SyncMutationBase + implements Typed$Mutate { + _$Typed$Mutate(this.element, {super.state, super.key}); + + @override + final _$TypedElement element; + + @override + $ElementLense<_$Typed$Mutate> get listenable => element._$mutate; + + @override + Future call(String one, + {required String two, required String three}) { + return mutateAsync( + Invocation.method(#mutate, [one], {#two: two, #three: three}), + ($notifier) => $notifier.mutate( + one, + two: two, + three: three, + ), + ); + } + + @override + _$Typed$Mutate copyWith(MutationState state, {Object? key}) => + _$Typed$Mutate(element, state: state, key: key); +} + // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/packages/riverpod_generator/test/mutation_test.dart b/packages/riverpod_generator/test/mutation_test.dart index 27c19696f..65d317563 100644 --- a/packages/riverpod_generator/test/mutation_test.dart +++ b/packages/riverpod_generator/test/mutation_test.dart @@ -248,6 +248,21 @@ void main() { verifyNever(observer.mutationError(any, any, any, any)); }); + test('Typed providers and named parameters', () async { + final container = ProviderContainer.test(); + + final sub = container.listen(typedProvider.mutate, (a, b) {}); + + expect(container.read(typedProvider), 'typed'); + + await sub.read().call('five', two: 'six', three: 'seven'); + + expect( + sub.read(), + isMutationBase(state: isSuccessMutationState('five six seven')), + ); + }); + group('reset', () { test('Supports calling reset while pending', () async { final container = ProviderContainer.test();