diff --git a/examples/pub/lib/detail.dart b/examples/pub/lib/detail.dart index 707903408..cc7e865e6 100644 --- a/examples/pub/lib/detail.dart +++ b/examples/pub/lib/detail.dart @@ -122,15 +122,16 @@ class PackageDetailPage extends HookConsumerWidget { loading: () => const Center(child: CircularProgressIndicator()), data: (package) { return RefreshIndicator( - onRefresh: () { - return Future.wait([ - ref.refresh( - packageMetricsProvider(packageName: packageName).future, - ), - ref.refresh( - fetchPackageDetailsProvider(packageName: packageName).future, - ), - ]); + onRefresh: () async { + final a = ref.refresh( + packageMetricsProvider(packageName: packageName).future, + ); + final b = ref.refresh( + fetchPackageDetailsProvider(packageName: packageName).future, + ); + + await a; + await b; }, child: metrics.when( error: (err, stack) => Text('Error $err'), diff --git a/examples/pub/lib/search.dart b/examples/pub/lib/search.dart index eeafba4f1..c450a1c25 100644 --- a/examples/pub/lib/search.dart +++ b/examples/pub/lib/search.dart @@ -44,9 +44,11 @@ Future> fetchPackages( return Future.wait([ for (final package in searchedPackages) - ref.watch( - fetchPackageDetailsProvider(packageName: package.package).future, - ), + Future(() async { + return ref.watch( + fetchPackageDetailsProvider(packageName: package.package).future, + ); + }), ]); } @@ -65,7 +67,7 @@ class SearchPage extends HookConsumerWidget { SearchBar(controller: searchController), Expanded( child: RefreshIndicator( - onRefresh: () { + onRefresh: () async { // disposes the pages previously fetched. Next read will refresh them ref.invalidate(fetchPackagesProvider); // keep showing the progress indicator until the first page is fetched diff --git a/examples/stackoverflow/lib/home.dart b/examples/stackoverflow/lib/home.dart index fdfe12b5f..9a89b2680 100644 --- a/examples/stackoverflow/lib/home.dart +++ b/examples/stackoverflow/lib/home.dart @@ -35,7 +35,7 @@ class MyHomePage extends HookConsumerWidget { }, data: (count) { return RefreshIndicator( - onRefresh: () { + onRefresh: () async { ref.invalidate(paginatedQuestionsProvider(0)); return ref.read(paginatedQuestionsProvider(0).future); }, diff --git a/packages/flutter_riverpod/test/utils.dart b/packages/flutter_riverpod/test/utils.dart index 4d11a9102..31567e5c3 100644 --- a/packages/flutter_riverpod/test/utils.dart +++ b/packages/flutter_riverpod/test/utils.dart @@ -1,9 +1,17 @@ import 'dart:async'; +import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:riverpod/legacy.dart'; import 'package:riverpod/riverpod.dart'; +Matcher completionOr(Object? matcher) { + return anyOf( + matcher, + completion(matcher), + ); +} + class ErrorListener extends Mock { void call(Object? error, StackTrace? stackTrace); } diff --git a/packages/riverpod/lib/riverpod.dart b/packages/riverpod/lib/riverpod.dart index f963116aa..35265eaaa 100644 --- a/packages/riverpod/lib/riverpod.dart +++ b/packages/riverpod/lib/riverpod.dart @@ -1,4 +1,5 @@ -export 'src/common/synchronous_future.dart' hide SynchronousFuture; +export 'src/common/synchronous_future.dart' + hide SynchronousFuture, FutureOrThen; export 'src/core/async_value.dart' hide AsyncTransition; export 'src/framework.dart' hide diff --git a/packages/riverpod_generator/test/async_test.dart b/packages/riverpod_generator/test/async_test.dart index 6cf0651bf..407b05d32 100644 --- a/packages/riverpod_generator/test/async_test.dart +++ b/packages/riverpod_generator/test/async_test.dart @@ -5,6 +5,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:test/test.dart'; import 'integration/async.dart'; +import 'utils.dart'; void main() { test( diff --git a/packages/riverpod_generator/test/stream_test.dart b/packages/riverpod_generator/test/stream_test.dart index aac3aff78..a20355b71 100644 --- a/packages/riverpod_generator/test/stream_test.dart +++ b/packages/riverpod_generator/test/stream_test.dart @@ -5,6 +5,7 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:test/test.dart'; import 'integration/stream.dart'; +import 'utils.dart'; void main() { test('Creates a StreamProvider if @riverpod is used on a Stream function', diff --git a/packages/riverpod_generator/test/utils.dart b/packages/riverpod_generator/test/utils.dart new file mode 100644 index 000000000..e455fcb83 --- /dev/null +++ b/packages/riverpod_generator/test/utils.dart @@ -0,0 +1,8 @@ +import 'package:test/test.dart'; + +Matcher completionOr(Object? matcher) { + return anyOf( + matcher, + completion(matcher), + ); +} diff --git a/website/docs/case_studies/cancel/detail_screen/codegen.dart b/website/docs/case_studies/cancel/detail_screen/codegen.dart index 1941e884c..f822da7ee 100644 --- a/website/docs/case_studies/cancel/detail_screen/codegen.dart +++ b/website/docs/case_studies/cancel/detail_screen/codegen.dart @@ -45,7 +45,7 @@ class DetailPageView extends ConsumerWidget { title: const Text('Detail page'), ), body: RefreshIndicator( - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), child: ListView( children: [ switch (activity) { diff --git a/website/docs/case_studies/cancel/detail_screen/raw.dart b/website/docs/case_studies/cancel/detail_screen/raw.dart index 46c76ff89..847785e0d 100644 --- a/website/docs/case_studies/cancel/detail_screen/raw.dart +++ b/website/docs/case_studies/cancel/detail_screen/raw.dart @@ -49,7 +49,7 @@ class DetailPageView extends ConsumerWidget { title: const Text('Detail page'), ), body: RefreshIndicator( - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), child: ListView( children: [ switch (activity) { diff --git a/website/docs/case_studies/pull_to_refresh/display_activity3.dart b/website/docs/case_studies/pull_to_refresh/display_activity3.dart index ed7960b18..ffdaee5a1 100644 --- a/website/docs/case_studies/pull_to_refresh/display_activity3.dart +++ b/website/docs/case_studies/pull_to_refresh/display_activity3.dart @@ -20,7 +20,7 @@ class ActivityView extends ConsumerWidget { // fetched. // {@endtemplate} /* highlight-start */ - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), /* highlight-end */ child: ListView( children: [ diff --git a/website/docs/case_studies/pull_to_refresh/display_activity4.dart b/website/docs/case_studies/pull_to_refresh/display_activity4.dart index b4ce0722e..e703e57e3 100644 --- a/website/docs/case_studies/pull_to_refresh/display_activity4.dart +++ b/website/docs/case_studies/pull_to_refresh/display_activity4.dart @@ -15,7 +15,7 @@ class ActivityView extends ConsumerWidget { return Scaffold( appBar: AppBar(title: const Text('Pull to refresh')), body: RefreshIndicator( - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), child: ListView( children: [ switch (activity) { diff --git a/website/docs/case_studies/pull_to_refresh/full_app/codegen.dart b/website/docs/case_studies/pull_to_refresh/full_app/codegen.dart index 837a4b2d7..d197cac7e 100644 --- a/website/docs/case_studies/pull_to_refresh/full_app/codegen.dart +++ b/website/docs/case_studies/pull_to_refresh/full_app/codegen.dart @@ -29,7 +29,7 @@ class ActivityView extends ConsumerWidget { return Scaffold( appBar: AppBar(title: const Text('Pull to refresh')), body: RefreshIndicator( - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), child: ListView( children: [ switch (activity) { diff --git a/website/docs/case_studies/pull_to_refresh/full_app/raw.dart b/website/docs/case_studies/pull_to_refresh/full_app/raw.dart index 491e8295e..dc180e3dc 100644 --- a/website/docs/case_studies/pull_to_refresh/full_app/raw.dart +++ b/website/docs/case_studies/pull_to_refresh/full_app/raw.dart @@ -24,7 +24,7 @@ class ActivityView extends ConsumerWidget { return Scaffold( appBar: AppBar(title: const Text('Pull to refresh')), body: RefreshIndicator( - onRefresh: () => ref.refresh(activityProvider.future), + onRefresh: () async => ref.refresh(activityProvider.future), child: ListView( children: [ switch (activity) {