fetchPage method
Fetches a page of raw feed item maps, ordered by timestamp descending.
page — zero-based page index.
pageSize — number of items per page.
userId — when non-null, filters items by actor or target user.
Implementation
@override
Future<List<Map<String, dynamic>>> fetchPage({
required int page,
required int pageSize,
String? userId,
}) async {
try {
var query = _ref.orderBy('timestamp', descending: true).limit(pageSize);
if (userId != null) {
query = query.where('actorId', isEqualTo: userId);
}
// Simple offset pagination: skip `page * pageSize` docs.
if (page > 0) {
final previousSnapshot =
await _ref
.orderBy('timestamp', descending: true)
.limit(page * pageSize)
.get();
if (previousSnapshot.docs.isNotEmpty) {
query = query.startAfterDocument(previousSnapshot.docs.last);
}
}
final snapshot = await query.get();
return snapshot.docs
.map((d) => {'id': d.id, ...d.data()})
.toList(growable: false);
} catch (error) {
throw Exception(
'FirebaseActivityFeedSource.fetchPage failed (page: $page): $error',
);
}
}