diff --git a/lib/pages/book/book_detail_page.dart b/lib/pages/book/book_detail_page.dart index 0b3a804..09361e0 100644 --- a/lib/pages/book/book_detail_page.dart +++ b/lib/pages/book/book_detail_page.dart @@ -1333,7 +1333,7 @@ class _BookDetailPageState extends State { void _navigateToEdit(BuildContext context) { final provider = context.read(); Navigator.pushNamed(context, '/book-form', arguments: widget.book).then((_) { - provider.setEditRefresh(); + provider.setEditRefresh(widget.book.id); provider.loadBooks(); }); } diff --git a/lib/pages/book/book_tab_page.dart b/lib/pages/book/book_tab_page.dart index be6d6c9..210cd0e 100644 --- a/lib/pages/book/book_tab_page.dart +++ b/lib/pages/book/book_tab_page.dart @@ -82,6 +82,20 @@ class _BookTabPageState extends State { 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(); diff --git a/lib/pages/movies/movie_detail_page.dart b/lib/pages/movies/movie_detail_page.dart index 76cf1b6..6cc1535 100644 --- a/lib/pages/movies/movie_detail_page.dart +++ b/lib/pages/movies/movie_detail_page.dart @@ -1147,7 +1147,7 @@ class _MovieDetailPageState extends State { void _navigateToEdit(BuildContext context) { final provider = context.read(); Navigator.pushNamed(context, '/movie-form', arguments: widget.movie).then((_) { - provider.setEditRefresh(); + provider.setEditRefresh(widget.movie.id); provider.loadMovies(); }); } diff --git a/lib/pages/movies/movie_tab_page.dart b/lib/pages/movies/movie_tab_page.dart index 6baaf03..cdb3875 100644 --- a/lib/pages/movies/movie_tab_page.dart +++ b/lib/pages/movies/movie_tab_page.dart @@ -74,6 +74,20 @@ class _MovieTabPageState extends State { 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; diff --git a/lib/pages/note/note_detail_page.dart b/lib/pages/note/note_detail_page.dart index 799fbab..b2d78aa 100644 --- a/lib/pages/note/note_detail_page.dart +++ b/lib/pages/note/note_detail_page.dart @@ -299,6 +299,7 @@ class _NoteDetailPageState extends State { ); final provider = context.read(); Navigator.pushNamed(context, '/note-form', arguments: currentNote).then((_) async { + provider.setEditRefresh(currentNote.id); await provider.loadNotes(); }); } diff --git a/lib/pages/note/note_tab_page.dart b/lib/pages/note/note_tab_page.dart index 3afa188..2974c5c 100644 --- a/lib/pages/note/note_tab_page.dart +++ b/lib/pages/note/note_tab_page.dart @@ -30,6 +30,7 @@ class _NoteTabPageState extends State { bool _initialized = false; int _lastScrollSignal = 0; int _prevNoteCount = -1; + int _lastEditRefreshCounter = 0; @override void initState() { @@ -64,10 +65,28 @@ class _NoteTabPageState extends State { // 仅在数据实际变化时刷新列表,避免底部导航栏显隐等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 { if (Breakpoint.isWideContent(context)) { context.read().selectNote(note); } else { - Navigator.pushNamed(context, '/note-detail', arguments: note).then((_) => _loadFirst()); + Navigator.pushNamed(context, '/note-detail', arguments: note); } } diff --git a/lib/providers/app_provider.dart b/lib/providers/app_provider.dart index 9e012e1..f53748c 100644 --- a/lib/providers/app_provider.dart +++ b/lib/providers/app_provider.dart @@ -80,6 +80,10 @@ class AppProvider extends ChangeNotifier { int _editRefreshCounter = 0; int get editRefreshCounter => _editRefreshCounter; + // 最近编辑的条目 ID(用于就地更新,避免重置分页) + String? _lastEditedItemId; + String? get lastEditedItemId => _lastEditedItemId; + // 初始化数据库 Future 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(); }