Skip to content

Commit 5538ce2

Browse files
committed
chore: higher async
Still use async at higher levels, which leads to less nullability.
1 parent 6c83fbe commit 5538ce2

File tree

7 files changed

+27
-28
lines changed

7 files changed

+27
-28
lines changed

lib/app/app_router.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class AppRouter extends _$AppRouter {
3434
guards: [
3535
AutoRouteGuard.redirect(
3636
(resolver) {
37-
final authState = ref.read(userProvider);
37+
final authState = ref.read(userProvider).valueOrNull;
3838

3939
return (authState != null) ? null : const AuthRoute();
4040
},

lib/features/auth/application/auth_service.dart

+12-11
Original file line numberDiff line numberDiff line change
@@ -44,33 +44,34 @@ class PirateAuthService extends _$PirateAuthService {
4444
///
4545
/// Use [pirateAuthServiceProvider] for more granular output.
4646
@Riverpod(keepAlive: true)
47-
PirateUser? user(UserRef ref) => ref.watch(
48-
pirateAuthServiceProvider.select((value) => value.valueOrNull?.user),
47+
Future<PirateUser> user(UserRef ref) async => await ref.watch(
48+
pirateAuthServiceProvider.selectAsync((value) => value.user),
4949
);
5050

5151
/// The email address used in case things go wrong.
5252
const redactedEmail = "[email protected]";
5353

5454
/// Get the current user's name.
5555
@riverpod
56-
String? name(NameRef ref) =>
57-
ref.watch(userProvider.select((value) => value?.name));
56+
Future<String> name(NameRef ref) async =>
57+
await ref.watch(userProvider.selectAsync((value) => value.name));
5858

5959
/// Get the current user's email address.
6060
@riverpod
61-
String? email(EmailRef ref) =>
62-
ref.watch(userProvider.select((value) => value?.email));
61+
Future<String> email(EmailRef ref) async =>
62+
await ref.watch(userProvider.selectAsync((value) => value.email));
6363

6464
/// Get the current user's avatar.
6565
@riverpod
66-
Uint8List? avatar(AvatarRef ref) =>
67-
ref.watch(userProvider.select((value) => value?.avatar));
66+
Future<Uint8List> avatar(AvatarRef ref) async =>
67+
await ref.watch(userProvider.selectAsync((value) => value.avatar));
6868

6969
/// Get the current user's account type.
7070
@riverpod
71-
AccountType? accountType(AccountTypeRef ref) =>
72-
ref.watch(userProvider.select((value) => value?.accountType));
71+
Future<AccountType> accountType(AccountTypeRef ref) async =>
72+
await ref.watch(userProvider.selectAsync((value) => value.accountType));
7373

7474
/// Get the current user's ID.
7575
@riverpod
76-
int? id(IdRef ref) => ref.watch(userProvider.select((value) => value?.id));
76+
Future<int> id(IdRef ref) async =>
77+
await ref.watch(userProvider.selectAsync((value) => value.id));

lib/features/dashboard/presentation/wrapper_page/wrapper_page.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ class _ExpandedWrapper extends ConsumerWidget {
6565
@override
6666
Widget build(BuildContext context, WidgetRef ref) {
6767
final theme = Theme.of(context);
68-
final name = ref.watch(nameProvider);
69-
final email = ref.watch(emailProvider);
70-
final avatar = ref.watch(avatarProvider);
68+
final name = ref.watch(nameProvider).valueOrNull;
69+
final email = ref.watch(emailProvider).valueOrNull;
70+
final avatar = ref.watch(avatarProvider).valueOrNull;
7171

7272
return Scaffold(
7373
appBar: AppBar(

lib/features/pirate_coins/application/coins_service.dart

+5-7
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,11 @@ class CoinsService extends _$CoinsService {
5858

5959
/// Get the coins of the current user.
6060
@riverpod
61-
Future<CoinsModel?> currentUserCoins(CurrentUserCoinsRef ref) async {
62-
final userId = ref.watch(idProvider);
63-
final fetchCoins = ref
64-
.read(
65-
coinsServiceProvider(userId ?? 0).notifier,
66-
)
67-
.fetchCoins;
61+
Future<CoinsModel> currentUserCoins(CurrentUserCoinsRef ref) async {
62+
final userId = await ref.watch(
63+
pirateAuthServiceProvider.selectAsync((data) => data.user.id),
64+
);
65+
final fetchCoins = ref.read(coinsServiceProvider(userId).notifier).fetchCoins;
6866

6967
return fetchCoins();
7068
}

lib/features/pirate_coins/presentation/pirate_coins_page/pirate_coins_page.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ class PirateCoinsPage extends ConsumerWidget {
2424

2525
@override
2626
Widget build(BuildContext context, WidgetRef ref) {
27-
final accountType = ref.watch(accountTypeProvider);
28-
final id = ref.watch(idProvider);
27+
final accountType = ref.watch(accountTypeProvider).valueOrNull;
28+
final id = ref.watch(idProvider).valueOrNull;
2929

3030
final child = accountType == AccountType.student
3131
? _StudentView(id: id ?? 0)

lib/features/pirate_coins/presentation/stats_page/stats_page.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ class StatsPage extends ConsumerWidget {
2727
Padding(
2828
padding: const EdgeInsets.all(8),
2929
child: switch (data) {
30-
AsyncData(:final value) => (value?.coins.coins ?? 0) > 0
31-
? BigCard(l10n.howManyCoins(value?.coins.coins ?? 0))
30+
AsyncData(:final value) => (value.coins.coins) > 0
31+
? BigCard(l10n.howManyCoins(value.coins.coins))
3232
: BigCard(l10n.emptyReport),
3333
AsyncError(:final error) => BigCard(l10n.error("$error")),
3434
AsyncLoading() => Column(

test/features/dashboard/presentation/wrapper_page/wrapper_page_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import "../../../../helpers/riverpod.dart";
1717

1818
ProviderContainer createOverriddenContainer() => createContainer(
1919
overrides: [
20-
userProvider.overrideWithValue(
21-
PirateUser(
20+
userProvider.overrideWith(
21+
(_) => PirateUser(
2222
name: "",
2323
email: redactedEmail,
2424
accountType: AccountType.student,

0 commit comments

Comments
 (0)