From 7740cf78303a3ed2f077e42842116aaaf0747269 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Sun, 8 Jun 2025 22:33:47 +0800 Subject: [PATCH] :bug: Fixes members' loading bugs --- lib/screens/chat/room_detail.dart | 244 ++++++++++++++++----------- lib/screens/chat/room_detail.g.dart | 180 ++++++++++++++++++++ lib/screens/realm/detail.dart | 244 ++++++++++++++++----------- lib/screens/realm/detail.g.dart | 150 ++++++++++++++++ lib/widgets/content/cloud_files.dart | 2 +- lib/widgets/post/post_list.dart | 1 - lib/widgets/post/post_list.g.dart | 2 +- 7 files changed, 616 insertions(+), 207 deletions(-) create mode 100644 lib/screens/chat/room_detail.g.dart diff --git a/lib/screens/chat/room_detail.dart b/lib/screens/chat/room_detail.dart index c5c604f..0e9220a 100644 --- a/lib/screens/chat/room_detail.dart +++ b/lib/screens/chat/room_detail.dart @@ -14,10 +14,14 @@ import 'package:island/widgets/account/account_picker.dart'; import 'package:island/widgets/alert.dart'; import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/cloud_files.dart'; +import 'package:island/widgets/content/paging_helper_ext.dart'; import 'package:material_symbols_icons/symbols.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; import 'package:styled_widget/styled_widget.dart'; part 'room_detail.freezed.dart'; +part 'room_detail.g.dart'; @RoutePage() class ChatDetailScreen extends HookConsumerWidget { @@ -287,12 +291,51 @@ class ChatMemberNotifier extends StateNotifier { } } +@riverpod +class ChatMemberListNotifier extends _$ChatMemberListNotifier + with CursorPagingNotifierMixin { + @override + Future> build(String roomId) { + return fetch(); + } + + @override + Future> fetch({String? cursor}) async { + final offset = cursor == null ? 0 : int.parse(cursor); + final take = 20; + + final apiClient = ref.watch(apiClientProvider); + final response = await apiClient.get( + '/chat/$roomId/members', + queryParameters: {'offset': offset, 'take': take}, + ); + + final total = int.parse(response.headers.value('X-Total') ?? '0'); + final List data = response.data; + final members = data.map((e) => SnChatMember.fromJson(e)).toList(); + + // Calculate next cursor based on total count + final nextOffset = offset + members.length; + final String? nextCursor = + nextOffset < total ? nextOffset.toString() : null; + + return CursorPagingData( + items: members, + nextCursor: nextCursor, + hasMore: members.length < total, + ); + } +} + class _ChatMemberListSheet extends HookConsumerWidget { final String roomId; const _ChatMemberListSheet({required this.roomId}); @override Widget build(BuildContext context, WidgetRef ref) { + final memberListProvider = chatMemberListNotifierProvider(roomId); + + // For backward compatibility and to show total count in the header final memberState = ref.watch(chatMemberStateProvider(roomId)); final memberNotifier = ref.read(chatMemberStateProvider(roomId).notifier); @@ -318,8 +361,10 @@ class _ChatMemberListSheet extends HookConsumerWidget { '/chat/invites/$roomId', data: {'related_user_id': result.id, 'role': 0}, ); + // Refresh both providers memberNotifier.reset(); await memberNotifier.loadMore(); + ref.invalidate(memberListProvider); } catch (err) { showErrorAlert(err); } @@ -351,8 +396,10 @@ class _ChatMemberListSheet extends HookConsumerWidget { IconButton( icon: const Icon(Symbols.refresh), onPressed: () { + // Refresh both providers memberNotifier.reset(); memberNotifier.loadMore(); + ref.invalidate(memberListProvider); }, ), IconButton( @@ -365,108 +412,103 @@ class _ChatMemberListSheet extends HookConsumerWidget { ), const Divider(height: 1), Expanded( - child: - memberState.error != null - ? Center(child: Text(memberState.error!)) - : ListView.builder( - itemCount: memberState.members.length + 1, - itemBuilder: (context, index) { - if (index == memberState.members.length) { - if (memberState.isLoading) { - return const Center( - child: Padding( - padding: EdgeInsets.all(16.0), - child: CircularProgressIndicator(), - ), - ); - } - if (memberState.members.length < memberState.total) { - memberNotifier.loadMore( - offset: memberState.members.length, - ); - } - return const SizedBox.shrink(); - } + child: PagingHelperView( + provider: memberListProvider, + futureRefreshable: memberListProvider.future, + notifierRefreshable: memberListProvider.notifier, + contentBuilder: (data, widgetCount, endItemView) { + return ListView.builder( + itemCount: widgetCount, + itemBuilder: (context, index) { + if (index == data.items.length) { + return endItemView; + } - final member = memberState.members[index]; - return ListTile( - contentPadding: EdgeInsets.only(left: 16, right: 12), - leading: ProfilePictureWidget( - fileId: member.account.profile.picture?.id, - ), - title: Row( - spacing: 6, - children: [ - Flexible(child: Text(member.account.nick)), - if (member.joinedAt == null) - const Icon(Symbols.pending_actions, size: 20), - ], - ), - subtitle: Row( - children: [ - Text( - member.role >= 100 - ? 'permissionOwner' - : member.role >= 50 - ? 'permissionModerator' - : 'permissionMember', - ).tr(), - Text('·').bold().padding(horizontal: 6), - Expanded(child: Text("@${member.account.name}")), - ], - ), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if ((roomIdentity.value?.role ?? 0) >= 50) - IconButton( - icon: const Icon(Symbols.edit), - onPressed: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: - (context) => _ChatMemberRoleSheet( - roomId: roomId, - member: member, - ), - ).then((value) { - if (value != null) { - memberNotifier.reset(); - memberNotifier.loadMore(); - } - }); - }, - ), - if ((roomIdentity.value?.role ?? 0) >= 50) - IconButton( - icon: const Icon(Symbols.delete), - onPressed: () { - showConfirmAlert( - 'removeChatMemberHint'.tr(), - 'removeChatMember'.tr(), - ).then((confirm) async { - if (confirm != true) return; - try { - final apiClient = ref.watch( - apiClientProvider, - ); - await apiClient.delete( - '/chat/$roomId/members/${member.accountId}', - ); - memberNotifier.reset(); - memberNotifier.loadMore(); - } catch (err) { - showErrorAlert(err); - } - }); - }, - ), - ], - ), - ); - }, - ), + final member = data.items[index]; + return ListTile( + contentPadding: EdgeInsets.only(left: 16, right: 12), + leading: ProfilePictureWidget( + fileId: member.account.profile.picture?.id, + ), + title: Row( + spacing: 6, + children: [ + Flexible(child: Text(member.account.nick)), + if (member.joinedAt == null) + const Icon(Symbols.pending_actions, size: 20), + ], + ), + subtitle: Row( + children: [ + Text( + member.role >= 100 + ? 'permissionOwner' + : member.role >= 50 + ? 'permissionModerator' + : 'permissionMember', + ).tr(), + Text('·').bold().padding(horizontal: 6), + Expanded(child: Text("@${member.account.name}")), + ], + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if ((roomIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.edit), + onPressed: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: + (context) => _ChatMemberRoleSheet( + roomId: roomId, + member: member, + ), + ).then((value) { + if (value != null) { + // Refresh both providers + memberNotifier.reset(); + memberNotifier.loadMore(); + ref.invalidate(memberListProvider); + } + }); + }, + ), + if ((roomIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.delete), + onPressed: () { + showConfirmAlert( + 'removeChatMemberHint'.tr(), + 'removeChatMember'.tr(), + ).then((confirm) async { + if (confirm != true) return; + try { + final apiClient = ref.watch( + apiClientProvider, + ); + await apiClient.delete( + '/chat/$roomId/members/${member.accountId}', + ); + // Refresh both providers + memberNotifier.reset(); + memberNotifier.loadMore(); + ref.invalidate(memberListProvider); + } catch (err) { + showErrorAlert(err); + } + }); + }, + ), + ], + ), + ); + }, + ); + }, + ), ), ], ), diff --git a/lib/screens/chat/room_detail.g.dart b/lib/screens/chat/room_detail.g.dart new file mode 100644 index 0000000..0250fb7 --- /dev/null +++ b/lib/screens/chat/room_detail.g.dart @@ -0,0 +1,180 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'room_detail.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$chatMemberListNotifierHash() => + r'f14dbb3c6ccfef26a49d8bf5dd53b05f7c63eb6c'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$ChatMemberListNotifier + extends BuildlessAutoDisposeAsyncNotifier> { + late final String roomId; + + FutureOr> build(String roomId); +} + +/// See also [ChatMemberListNotifier]. +@ProviderFor(ChatMemberListNotifier) +const chatMemberListNotifierProvider = ChatMemberListNotifierFamily(); + +/// See also [ChatMemberListNotifier]. +class ChatMemberListNotifierFamily + extends Family>> { + /// See also [ChatMemberListNotifier]. + const ChatMemberListNotifierFamily(); + + /// See also [ChatMemberListNotifier]. + ChatMemberListNotifierProvider call(String roomId) { + return ChatMemberListNotifierProvider(roomId); + } + + @override + ChatMemberListNotifierProvider getProviderOverride( + covariant ChatMemberListNotifierProvider provider, + ) { + return call(provider.roomId); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'chatMemberListNotifierProvider'; +} + +/// See also [ChatMemberListNotifier]. +class ChatMemberListNotifierProvider + extends + AutoDisposeAsyncNotifierProviderImpl< + ChatMemberListNotifier, + CursorPagingData + > { + /// See also [ChatMemberListNotifier]. + ChatMemberListNotifierProvider(String roomId) + : this._internal( + () => ChatMemberListNotifier()..roomId = roomId, + from: chatMemberListNotifierProvider, + name: r'chatMemberListNotifierProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$chatMemberListNotifierHash, + dependencies: ChatMemberListNotifierFamily._dependencies, + allTransitiveDependencies: + ChatMemberListNotifierFamily._allTransitiveDependencies, + roomId: roomId, + ); + + ChatMemberListNotifierProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.roomId, + }) : super.internal(); + + final String roomId; + + @override + FutureOr> runNotifierBuild( + covariant ChatMemberListNotifier notifier, + ) { + return notifier.build(roomId); + } + + @override + Override overrideWith(ChatMemberListNotifier Function() create) { + return ProviderOverride( + origin: this, + override: ChatMemberListNotifierProvider._internal( + () => create()..roomId = roomId, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + roomId: roomId, + ), + ); + } + + @override + AutoDisposeAsyncNotifierProviderElement< + ChatMemberListNotifier, + CursorPagingData + > + createElement() { + return _ChatMemberListNotifierProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is ChatMemberListNotifierProvider && other.roomId == roomId; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, roomId.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin ChatMemberListNotifierRef + on AutoDisposeAsyncNotifierProviderRef> { + /// The parameter `roomId` of this provider. + String get roomId; +} + +class _ChatMemberListNotifierProviderElement + extends + AutoDisposeAsyncNotifierProviderElement< + ChatMemberListNotifier, + CursorPagingData + > + with ChatMemberListNotifierRef { + _ChatMemberListNotifierProviderElement(super.provider); + + @override + String get roomId => (origin as ChatMemberListNotifierProvider).roomId; +} + +// 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/lib/screens/realm/detail.dart b/lib/screens/realm/detail.dart index 3d48e70..cd598a4 100644 --- a/lib/screens/realm/detail.dart +++ b/lib/screens/realm/detail.dart @@ -15,6 +15,7 @@ import 'package:island/widgets/app_scaffold.dart'; import 'package:island/widgets/content/cloud_files.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:riverpod_paging_utils/riverpod_paging_utils.dart'; import 'package:styled_widget/styled_widget.dart'; part 'detail.g.dart'; @@ -250,6 +251,42 @@ class _RealmActionMenu extends HookConsumerWidget { } } +@riverpod +class RealmMemberListNotifier extends _$RealmMemberListNotifier + with CursorPagingNotifierMixin { + static const int _pageSize = 20; + + @override + Future> build(String realmSlug) async { + return fetch(); + } + + @override + Future> fetch({String? cursor}) async { + final apiClient = ref.read(apiClientProvider); + final offset = cursor != null ? int.parse(cursor) : 0; + + final response = await apiClient.get( + '/realms/$realmSlug/members', + queryParameters: {'offset': offset, 'take': _pageSize}, + ); + + final total = int.parse(response.headers.value('X-Total') ?? '0'); + final List data = response.data; + final members = data.map((e) => SnRealmMember.fromJson(e)).toList(); + + final hasMore = offset + members.length < total; + final nextCursor = hasMore ? (offset + members.length).toString() : null; + + return CursorPagingData( + items: members, + hasMore: hasMore, + nextCursor: nextCursor, + ); + } +} + +// Keep the old provider for backward compatibility final realmMemberStateProvider = StateNotifierProvider.family( (ref, realmSlug) { @@ -302,13 +339,15 @@ class _RealmMemberListSheet extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { + final realmIdentity = ref.watch(realmIdentityProvider(realmSlug)); + final memberListProvider = realmMemberListNotifierProvider(realmSlug); + + // For backward compatibility and to show total count in the header final memberState = ref.watch(realmMemberStateProvider(realmSlug)); final memberNotifier = ref.read( realmMemberStateProvider(realmSlug).notifier, ); - final realmIdentity = ref.watch(realmIdentityProvider(realmSlug)); - useEffect(() { Future(() { memberNotifier.loadMore(); @@ -329,8 +368,10 @@ class _RealmMemberListSheet extends HookConsumerWidget { '/realms/invites/$realmSlug', data: {'related_user_id': result.id, 'role': 0}, ); + // Refresh both providers memberNotifier.reset(); await memberNotifier.loadMore(); + ref.invalidate(memberListProvider); } catch (err) { showErrorAlert(err); } @@ -362,8 +403,10 @@ class _RealmMemberListSheet extends HookConsumerWidget { IconButton( icon: const Icon(Symbols.refresh), onPressed: () { + // Refresh both providers memberNotifier.reset(); memberNotifier.loadMore(); + ref.invalidate(memberListProvider); }, ), IconButton( @@ -376,108 +419,103 @@ class _RealmMemberListSheet extends HookConsumerWidget { ), const Divider(height: 1), Expanded( - child: - memberState.error != null - ? Center(child: Text(memberState.error!)) - : ListView.builder( - itemCount: memberState.members.length + 1, - itemBuilder: (context, index) { - if (index == memberState.members.length) { - if (memberState.isLoading) { - return const Center( - child: Padding( - padding: EdgeInsets.all(16.0), - child: CircularProgressIndicator(), - ), - ); - } - if (memberState.members.length < memberState.total) { - memberNotifier.loadMore( - offset: memberState.members.length, - ); - } - return const SizedBox.shrink(); - } + child: PagingHelperView( + provider: memberListProvider, + futureRefreshable: memberListProvider.future, + notifierRefreshable: memberListProvider.notifier, + contentBuilder: (data, widgetCount, endItemView) { + return ListView.builder( + itemCount: widgetCount, + itemBuilder: (context, index) { + if (index == data.items.length) { + return endItemView; + } - final member = memberState.members[index]; - return ListTile( - contentPadding: EdgeInsets.only(left: 16, right: 12), - leading: ProfilePictureWidget( - fileId: member.account!.profile.picture?.id, - ), - title: Row( - spacing: 6, - children: [ - Flexible(child: Text(member.account!.nick)), - if (member.joinedAt == null) - const Icon(Symbols.pending_actions, size: 20), - ], - ), - subtitle: Row( - children: [ - Text( - member.role >= 100 - ? 'permissionOwner' - : member.role >= 50 - ? 'permissionModerator' - : 'permissionMember', - ).tr(), - Text('·').bold().padding(horizontal: 6), - Expanded(child: Text("@${member.account!.name}")), - ], - ), - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - if ((realmIdentity.value?.role ?? 0) >= 50) - IconButton( - icon: const Icon(Symbols.edit), - onPressed: () { - showModalBottomSheet( - isScrollControlled: true, - context: context, - builder: - (context) => _RealmMemberRoleSheet( - realmSlug: realmSlug, - member: member, - ), - ).then((value) { - if (value != null) { - memberNotifier.reset(); - memberNotifier.loadMore(); - } - }); - }, - ), - if ((realmIdentity.value?.role ?? 0) >= 50) - IconButton( - icon: const Icon(Symbols.delete), - onPressed: () { - showConfirmAlert( - 'removeRealmMemberHint'.tr(), - 'removeRealmMember'.tr(), - ).then((confirm) async { - if (confirm != true) return; - try { - final apiClient = ref.watch( - apiClientProvider, - ); - await apiClient.delete( - '/realms/$realmSlug/members/${member.accountId}', - ); - memberNotifier.reset(); - memberNotifier.loadMore(); - } catch (err) { - showErrorAlert(err); - } - }); - }, - ), - ], - ), - ); - }, - ), + final member = data.items[index]; + return ListTile( + contentPadding: EdgeInsets.only(left: 16, right: 12), + leading: ProfilePictureWidget( + fileId: member.account!.profile.picture?.id, + ), + title: Row( + spacing: 6, + children: [ + Flexible(child: Text(member.account!.nick)), + if (member.joinedAt == null) + const Icon(Symbols.pending_actions, size: 20), + ], + ), + subtitle: Row( + children: [ + Text( + member.role >= 100 + ? 'permissionOwner' + : member.role >= 50 + ? 'permissionModerator' + : 'permissionMember', + ).tr(), + Text('·').bold().padding(horizontal: 6), + Expanded(child: Text("@${member.account!.name}")), + ], + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if ((realmIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.edit), + onPressed: () { + showModalBottomSheet( + isScrollControlled: true, + context: context, + builder: + (context) => _RealmMemberRoleSheet( + realmSlug: realmSlug, + member: member, + ), + ).then((value) { + if (value != null) { + // Refresh both providers + memberNotifier.reset(); + memberNotifier.loadMore(); + ref.invalidate(memberListProvider); + } + }); + }, + ), + if ((realmIdentity.value?.role ?? 0) >= 50) + IconButton( + icon: const Icon(Symbols.delete), + onPressed: () { + showConfirmAlert( + 'removeRealmMemberHint'.tr(), + 'removeRealmMember'.tr(), + ).then((confirm) async { + if (confirm != true) return; + try { + final apiClient = ref.watch( + apiClientProvider, + ); + await apiClient.delete( + '/realms/$realmSlug/members/${member.accountId}', + ); + // Refresh both providers + memberNotifier.reset(); + memberNotifier.loadMore(); + ref.invalidate(memberListProvider); + } catch (err) { + showErrorAlert(err); + } + }); + }, + ), + ], + ), + ); + }, + ); + }, + ), ), ], ), diff --git a/lib/screens/realm/detail.g.dart b/lib/screens/realm/detail.g.dart index ef73fba..2591d79 100644 --- a/lib/screens/realm/detail.g.dart +++ b/lib/screens/realm/detail.g.dart @@ -148,5 +148,155 @@ class _RealmIdentityProviderElement String get realmSlug => (origin as RealmIdentityProvider).realmSlug; } +String _$realmMemberListNotifierHash() => + r'b2e3eefc62a597f45df9470b2058fdda62f8853f'; + +abstract class _$RealmMemberListNotifier + extends BuildlessAutoDisposeAsyncNotifier> { + late final String realmSlug; + + FutureOr> build(String realmSlug); +} + +/// See also [RealmMemberListNotifier]. +@ProviderFor(RealmMemberListNotifier) +const realmMemberListNotifierProvider = RealmMemberListNotifierFamily(); + +/// See also [RealmMemberListNotifier]. +class RealmMemberListNotifierFamily + extends Family>> { + /// See also [RealmMemberListNotifier]. + const RealmMemberListNotifierFamily(); + + /// See also [RealmMemberListNotifier]. + RealmMemberListNotifierProvider call(String realmSlug) { + return RealmMemberListNotifierProvider(realmSlug); + } + + @override + RealmMemberListNotifierProvider getProviderOverride( + covariant RealmMemberListNotifierProvider provider, + ) { + return call(provider.realmSlug); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'realmMemberListNotifierProvider'; +} + +/// See also [RealmMemberListNotifier]. +class RealmMemberListNotifierProvider + extends + AutoDisposeAsyncNotifierProviderImpl< + RealmMemberListNotifier, + CursorPagingData + > { + /// See also [RealmMemberListNotifier]. + RealmMemberListNotifierProvider(String realmSlug) + : this._internal( + () => RealmMemberListNotifier()..realmSlug = realmSlug, + from: realmMemberListNotifierProvider, + name: r'realmMemberListNotifierProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$realmMemberListNotifierHash, + dependencies: RealmMemberListNotifierFamily._dependencies, + allTransitiveDependencies: + RealmMemberListNotifierFamily._allTransitiveDependencies, + realmSlug: realmSlug, + ); + + RealmMemberListNotifierProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.realmSlug, + }) : super.internal(); + + final String realmSlug; + + @override + FutureOr> runNotifierBuild( + covariant RealmMemberListNotifier notifier, + ) { + return notifier.build(realmSlug); + } + + @override + Override overrideWith(RealmMemberListNotifier Function() create) { + return ProviderOverride( + origin: this, + override: RealmMemberListNotifierProvider._internal( + () => create()..realmSlug = realmSlug, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + realmSlug: realmSlug, + ), + ); + } + + @override + AutoDisposeAsyncNotifierProviderElement< + RealmMemberListNotifier, + CursorPagingData + > + createElement() { + return _RealmMemberListNotifierProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is RealmMemberListNotifierProvider && + other.realmSlug == realmSlug; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, realmSlug.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin RealmMemberListNotifierRef + on AutoDisposeAsyncNotifierProviderRef> { + /// The parameter `realmSlug` of this provider. + String get realmSlug; +} + +class _RealmMemberListNotifierProviderElement + extends + AutoDisposeAsyncNotifierProviderElement< + RealmMemberListNotifier, + CursorPagingData + > + with RealmMemberListNotifierRef { + _RealmMemberListNotifierProviderElement(super.provider); + + @override + String get realmSlug => (origin as RealmMemberListNotifierProvider).realmSlug; +} + // 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/lib/widgets/content/cloud_files.dart b/lib/widgets/content/cloud_files.dart index 16e9dfc..b1fbbe4 100644 --- a/lib/widgets/content/cloud_files.dart +++ b/lib/widgets/content/cloud_files.dart @@ -298,7 +298,7 @@ class SplitAvatarWidget extends ConsumerWidget { return SizedBox( width: radius, height: radius, - child: CachedNetworkImage(imageUrl: uri, fit: BoxFit.cover), + child: UniversalImage(uri: uri, fit: BoxFit.cover), ); } } diff --git a/lib/widgets/post/post_list.dart b/lib/widgets/post/post_list.dart index 0f90e95..30d8b64 100644 --- a/lib/widgets/post/post_list.dart +++ b/lib/widgets/post/post_list.dart @@ -16,7 +16,6 @@ class PostListNotifier extends _$PostListNotifier @override Future> build(String? pubName) { - this.pubName = pubName; return fetch(cursor: null); } diff --git a/lib/widgets/post/post_list.g.dart b/lib/widgets/post/post_list.g.dart index 28fc928..e3386c8 100644 --- a/lib/widgets/post/post_list.g.dart +++ b/lib/widgets/post/post_list.g.dart @@ -6,7 +6,7 @@ part of 'post_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$postListNotifierHash() => r'58a2d5d9a8f742f0a3a3e224a51a811d43903e0d'; +String _$postListNotifierHash() => r'a2a273cbf96393a84a66bd6ae8e88058704f3195'; /// Copied from Dart SDK class _SystemHash {