Skip to content

Commit ea68b95

Browse files
Add dispose to FutureProvider
1 parent 3ee02e4 commit ea68b95

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

packages/provider/lib/src/async_provider.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,15 @@ class FutureProvider<T> extends DeferredInheritedProvider<Future<T>?, T> {
181181
/// Creates a [Future] from `create` and subscribes to it.
182182
///
183183
/// `create` must not be `null`.
184+
///
185+
/// The optional [dispose] callback is invoked with the last exposed value
186+
/// when the provider is removed from the widget tree, allowing cleanup of
187+
/// resources (closing streams, cancelling timers, etc.).
184188
FutureProvider({
185189
Key? key,
186190
required Create<Future<T>?> create,
187191
required T initialData,
192+
Dispose<T>? dispose,
188193
ErrorBuilder<T>? catchError,
189194
UpdateShouldNotify<T>? updateShouldNotify,
190195
bool? lazy,
@@ -195,6 +200,7 @@ class FutureProvider<T> extends DeferredInheritedProvider<Future<T>?, T> {
195200
lazy: lazy,
196201
builder: builder,
197202
create: create,
203+
dispose: dispose,
198204
updateShouldNotify: updateShouldNotify,
199205
startListening: _futureStartListening(
200206
catchError: catchError,

packages/provider/lib/src/deferred_inherited_provider.dart

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class DeferredInheritedProvider<T, R> extends InheritedProvider<R> {
3535
DeferredInheritedProvider({
3636
Key? key,
3737
required Create<T> create,
38-
Dispose<T>? dispose,
38+
Dispose<R>? dispose,
3939
required DeferredStartListening<T, R> startListening,
4040
UpdateShouldNotify<R>? updateShouldNotify,
4141
bool? lazy,
@@ -165,7 +165,7 @@ class _CreateDeferredInheritedProvider<T, R> extends _DeferredDelegate<T, R> {
165165
}) : super(updateShouldNotify, startListening);
166166

167167
final Create<T> create;
168-
final Dispose<T>? dispose;
168+
final Dispose<R>? dispose;
169169

170170
@override
171171
_CreateDeferredInheritedProviderElement<T, R> createState() {
@@ -220,7 +220,13 @@ class _CreateDeferredInheritedProviderElement<T, R>
220220
void dispose() {
221221
super.dispose();
222222
if (_didBuild) {
223-
delegate.dispose?.call(element!, _controller as T);
223+
if (T is Future<R>) {
224+
(_controller as Future<R>).then((value) => delegate.dispose?.call(element!, value));
225+
} else if (isLoaded) {
226+
delegate.dispose?.call(element!, value);
227+
} else {
228+
delegate.dispose?.call(element!, _controller as R);
229+
}
224230
}
225231
}
226232

0 commit comments

Comments
 (0)