优化编辑之后回到第一页的问题

This commit is contained in:
DelLevin-Home
2026-07-05 14:31:30 +08:00
parent 6dd2014f1b
commit 2f926dfdb5
7 changed files with 59 additions and 5 deletions

View File

@@ -1333,7 +1333,7 @@ class _BookDetailPageState extends State<BookDetailPage> {
void _navigateToEdit(BuildContext context) {
final provider = context.read<AppProvider>();
Navigator.pushNamed(context, '/book-form', arguments: widget.book).then((_) {
provider.setEditRefresh();
provider.setEditRefresh(widget.book.id);
provider.loadBooks();
});
}

View File

@@ -82,6 +82,20 @@ class _BookTabPageState extends State<BookTabPage> {
final statusChanged = provider.bookStatusIndex != _lastStatusIndex;
final countChanged = provider.books.length != _prevBookCount;
final editRefreshed = provider.editRefreshCounter > _lastEditRefreshCounter;
if (editRefreshed && provider.lastEditedItemId != null) {
// 就地更新被编辑的条目,不重置分页
_lastEditRefreshCounter = provider.editRefreshCounter;
_prevBookCount = provider.books.length;
final editedId = provider.lastEditedItemId!;
final idx = _items.indexWhere((b) => b.id == editedId);
if (idx != -1) {
final updated = provider.books.where((b) => b.id == editedId).firstOrNull;
if (updated != null) {
setState(() { _items[idx] = updated; });
}
}
return;
}
if (statusChanged || countChanged || editRefreshed) {
_prevBookCount = provider.books.length;
_loadFirst();

View File

@@ -1147,7 +1147,7 @@ class _MovieDetailPageState extends State<MovieDetailPage> {
void _navigateToEdit(BuildContext context) {
final provider = context.read<AppProvider>();
Navigator.pushNamed(context, '/movie-form', arguments: widget.movie).then((_) {
provider.setEditRefresh();
provider.setEditRefresh(widget.movie.id);
provider.loadMovies();
});
}

View File

@@ -74,6 +74,20 @@ class _MovieTabPageState extends State<MovieTabPage> {
final layoutChanged = provider.movieLayoutStyle != _prevLayoutStyle;
final countChanged = provider.movies.length != _prevMovieCount;
final editRefreshed = provider.editRefreshCounter > _lastEditRefreshCounter;
if (editRefreshed && provider.lastEditedItemId != null) {
// 就地更新被编辑的条目,不重置分页
_lastEditRefreshCounter = provider.editRefreshCounter;
_prevMovieCount = provider.movies.length;
final editedId = provider.lastEditedItemId!;
final idx = _items.indexWhere((m) => m.id == editedId);
if (idx != -1) {
final updated = provider.movies.where((m) => m.id == editedId).firstOrNull;
if (updated != null) {
setState(() { _items[idx] = updated; });
}
}
return;
}
if (statusChanged || layoutChanged || countChanged || editRefreshed) {
_prevLayoutStyle = provider.movieLayoutStyle;
_prevMovieCount = provider.movies.length;

View File

@@ -299,6 +299,7 @@ class _NoteDetailPageState extends State<NoteDetailPage> {
);
final provider = context.read<AppProvider>();
Navigator.pushNamed(context, '/note-form', arguments: currentNote).then((_) async {
provider.setEditRefresh(currentNote.id);
await provider.loadNotes();
});
}

View File

@@ -30,6 +30,7 @@ class _NoteTabPageState extends State<NoteTabPage> {
bool _initialized = false;
int _lastScrollSignal = 0;
int _prevNoteCount = -1;
int _lastEditRefreshCounter = 0;
@override
void initState() {
@@ -64,10 +65,28 @@ class _NoteTabPageState extends State<NoteTabPage> {
// 仅在数据实际变化时刷新列表避免底部导航栏显隐等UI变化误触发重载
final countChanged = provider.notes.length != _prevNoteCount;
if (countChanged) {
final editRefreshed = provider.editRefreshCounter > _lastEditRefreshCounter;
if (editRefreshed && provider.lastEditedItemId != null) {
// 就地更新被编辑的条目,不重置分页
_lastEditRefreshCounter = provider.editRefreshCounter;
_prevNoteCount = provider.notes.length;
final editedId = provider.lastEditedItemId!;
final idx = _items.indexWhere((n) => n.id == editedId);
if (idx != -1) {
final updated = provider.notes.where((n) => n.id == editedId).firstOrNull;
if (updated != null) {
setState(() { _items[idx] = updated; });
}
}
return;
}
if (countChanged || editRefreshed) {
_prevNoteCount = provider.notes.length;
_loadFirst();
}
if (editRefreshed) {
_lastEditRefreshCounter = provider.editRefreshCounter;
}
}
void _onScroll() {
@@ -98,7 +117,7 @@ class _NoteTabPageState extends State<NoteTabPage> {
if (Breakpoint.isWideContent(context)) {
context.read<AppProvider>().selectNote(note);
} else {
Navigator.pushNamed(context, '/note-detail', arguments: note).then((_) => _loadFirst());
Navigator.pushNamed(context, '/note-detail', arguments: note);
}
}

View File

@@ -80,6 +80,10 @@ class AppProvider extends ChangeNotifier {
int _editRefreshCounter = 0;
int get editRefreshCounter => _editRefreshCounter;
// 最近编辑的条目 ID用于就地更新避免重置分页
String? _lastEditedItemId;
String? get lastEditedItemId => _lastEditedItemId;
// 初始化数据库
Future<void> initDatabase() async {
debugPrint('[AppProvider] initDatabase');
@@ -141,8 +145,10 @@ class AppProvider extends ChangeNotifier {
}
/// 编辑返回后触发列表页重载
void setEditRefresh() {
/// [itemId] 被编辑条目的 ID用于就地更新而非重置分页
void setEditRefresh([String? itemId]) {
_editRefreshCounter++;
_lastEditedItemId = itemId;
notifyListeners();
}