Fix duplicate items and unmounted pages for pagination

This commit is contained in:
John Wesley 2024-01-21 12:01:50 -05:00
parent 7b68f2303d
commit c856953f31
8 changed files with 102 additions and 20 deletions

View File

@ -47,14 +47,23 @@ class _EntriesListViewState extends State<EntriesListView> {
sort: sort,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.entryId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.entryId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;

View File

@ -60,14 +60,23 @@ class _EntryPageState extends State<EntryPage> {
sort: commentsSort,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.commentId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.commentId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;
@ -202,8 +211,7 @@ class _EntryPageState extends State<EntryPage> {
setState(() {
_pagingController.itemList = newList;
});
},
opUserId: widget.initData.user.userId),
}, opUserId: widget.initData.user.userId),
),
),
)
@ -212,4 +220,10 @@ class _EntryPageState extends State<EntryPage> {
),
);
}
@override
void dispose() {
_pagingController.dispose();
super.dispose();
}
}

View File

@ -42,14 +42,23 @@ class _DomainsScreenState extends State<DomainsScreen> {
search: search.isEmpty ? null : search,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.domainId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.domainId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;

View File

@ -45,14 +45,23 @@ class _MagazinesScreenState extends State<MagazinesScreen> {
search: search.isEmpty ? null : search,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.magazineId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.magazineId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;

View File

@ -41,14 +41,23 @@ class _UsersScreenState extends State<UsersScreen> {
filter: filter,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.userId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.userId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;

View File

@ -60,14 +60,23 @@ class _PostPageState extends State<PostPage> {
sort: commentsSort,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.commentId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.commentId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;
@ -198,8 +207,7 @@ class _PostPageState extends State<PostPage> {
setState(() {
_pagingController.itemList = newList;
});
},
opUserId: widget.initData.user.userId),
}, opUserId: widget.initData.user.userId),
),
),
)
@ -208,4 +216,10 @@ class _PostPageState extends State<PostPage> {
),
);
}
@override
void dispose() {
_pagingController.dispose();
super.dispose();
}
}

View File

@ -47,14 +47,23 @@ class _PostsListViewState extends State<PostsListView> {
sort: sort,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.postId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.postId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;

View File

@ -37,14 +37,23 @@ class _NotificationsScreenState extends State<NotificationsScreen> {
filter: filter,
);
// Check BuildContext
if (!mounted) return;
final isLastPage =
newPage.pagination.currentPage == newPage.pagination.maxPage;
// Prevent duplicates
final currentItemIds =
_pagingController.itemList?.map((e) => e.notificationId) ?? [];
final newItems = newPage.items
.where((e) => !currentItemIds.contains(e.notificationId))
.toList();
if (isLastPage) {
_pagingController.appendLastPage(newPage.items);
_pagingController.appendLastPage(newItems);
} else {
final nextPageKey = pageKey + 1;
_pagingController.appendPage(newPage.items, nextPageKey);
_pagingController.appendPage(newItems, nextPageKey);
}
} catch (error) {
_pagingController.error = error;