generated from dellevin/template
优化编辑之后回到第一页的问题
This commit is contained in:
@@ -1333,7 +1333,7 @@ class _BookDetailPageState extends State<BookDetailPage> {
|
|||||||
void _navigateToEdit(BuildContext context) {
|
void _navigateToEdit(BuildContext context) {
|
||||||
final provider = context.read<AppProvider>();
|
final provider = context.read<AppProvider>();
|
||||||
Navigator.pushNamed(context, '/book-form', arguments: widget.book).then((_) {
|
Navigator.pushNamed(context, '/book-form', arguments: widget.book).then((_) {
|
||||||
provider.setEditRefresh();
|
provider.setEditRefresh(widget.book.id);
|
||||||
provider.loadBooks();
|
provider.loadBooks();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,6 +82,20 @@ class _BookTabPageState extends State<BookTabPage> {
|
|||||||
final statusChanged = provider.bookStatusIndex != _lastStatusIndex;
|
final statusChanged = provider.bookStatusIndex != _lastStatusIndex;
|
||||||
final countChanged = provider.books.length != _prevBookCount;
|
final countChanged = provider.books.length != _prevBookCount;
|
||||||
final editRefreshed = provider.editRefreshCounter > _lastEditRefreshCounter;
|
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) {
|
if (statusChanged || countChanged || editRefreshed) {
|
||||||
_prevBookCount = provider.books.length;
|
_prevBookCount = provider.books.length;
|
||||||
_loadFirst();
|
_loadFirst();
|
||||||
|
|||||||
@@ -1147,7 +1147,7 @@ class _MovieDetailPageState extends State<MovieDetailPage> {
|
|||||||
void _navigateToEdit(BuildContext context) {
|
void _navigateToEdit(BuildContext context) {
|
||||||
final provider = context.read<AppProvider>();
|
final provider = context.read<AppProvider>();
|
||||||
Navigator.pushNamed(context, '/movie-form', arguments: widget.movie).then((_) {
|
Navigator.pushNamed(context, '/movie-form', arguments: widget.movie).then((_) {
|
||||||
provider.setEditRefresh();
|
provider.setEditRefresh(widget.movie.id);
|
||||||
provider.loadMovies();
|
provider.loadMovies();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,20 @@ class _MovieTabPageState extends State<MovieTabPage> {
|
|||||||
final layoutChanged = provider.movieLayoutStyle != _prevLayoutStyle;
|
final layoutChanged = provider.movieLayoutStyle != _prevLayoutStyle;
|
||||||
final countChanged = provider.movies.length != _prevMovieCount;
|
final countChanged = provider.movies.length != _prevMovieCount;
|
||||||
final editRefreshed = provider.editRefreshCounter > _lastEditRefreshCounter;
|
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) {
|
if (statusChanged || layoutChanged || countChanged || editRefreshed) {
|
||||||
_prevLayoutStyle = provider.movieLayoutStyle;
|
_prevLayoutStyle = provider.movieLayoutStyle;
|
||||||
_prevMovieCount = provider.movies.length;
|
_prevMovieCount = provider.movies.length;
|
||||||
|
|||||||
@@ -299,6 +299,7 @@ class _NoteDetailPageState extends State<NoteDetailPage> {
|
|||||||
);
|
);
|
||||||
final provider = context.read<AppProvider>();
|
final provider = context.read<AppProvider>();
|
||||||
Navigator.pushNamed(context, '/note-form', arguments: currentNote).then((_) async {
|
Navigator.pushNamed(context, '/note-form', arguments: currentNote).then((_) async {
|
||||||
|
provider.setEditRefresh(currentNote.id);
|
||||||
await provider.loadNotes();
|
await provider.loadNotes();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ class _NoteTabPageState extends State<NoteTabPage> {
|
|||||||
bool _initialized = false;
|
bool _initialized = false;
|
||||||
int _lastScrollSignal = 0;
|
int _lastScrollSignal = 0;
|
||||||
int _prevNoteCount = -1;
|
int _prevNoteCount = -1;
|
||||||
|
int _lastEditRefreshCounter = 0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@@ -64,10 +65,28 @@ class _NoteTabPageState extends State<NoteTabPage> {
|
|||||||
|
|
||||||
// 仅在数据实际变化时刷新列表,避免底部导航栏显隐等UI变化误触发重载
|
// 仅在数据实际变化时刷新列表,避免底部导航栏显隐等UI变化误触发重载
|
||||||
final countChanged = provider.notes.length != _prevNoteCount;
|
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;
|
_prevNoteCount = provider.notes.length;
|
||||||
_loadFirst();
|
_loadFirst();
|
||||||
}
|
}
|
||||||
|
if (editRefreshed) {
|
||||||
|
_lastEditRefreshCounter = provider.editRefreshCounter;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _onScroll() {
|
void _onScroll() {
|
||||||
@@ -98,7 +117,7 @@ class _NoteTabPageState extends State<NoteTabPage> {
|
|||||||
if (Breakpoint.isWideContent(context)) {
|
if (Breakpoint.isWideContent(context)) {
|
||||||
context.read<AppProvider>().selectNote(note);
|
context.read<AppProvider>().selectNote(note);
|
||||||
} else {
|
} else {
|
||||||
Navigator.pushNamed(context, '/note-detail', arguments: note).then((_) => _loadFirst());
|
Navigator.pushNamed(context, '/note-detail', arguments: note);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,10 @@ class AppProvider extends ChangeNotifier {
|
|||||||
int _editRefreshCounter = 0;
|
int _editRefreshCounter = 0;
|
||||||
int get editRefreshCounter => _editRefreshCounter;
|
int get editRefreshCounter => _editRefreshCounter;
|
||||||
|
|
||||||
|
// 最近编辑的条目 ID(用于就地更新,避免重置分页)
|
||||||
|
String? _lastEditedItemId;
|
||||||
|
String? get lastEditedItemId => _lastEditedItemId;
|
||||||
|
|
||||||
// 初始化数据库
|
// 初始化数据库
|
||||||
Future<void> initDatabase() async {
|
Future<void> initDatabase() async {
|
||||||
debugPrint('[AppProvider] initDatabase');
|
debugPrint('[AppProvider] initDatabase');
|
||||||
@@ -141,8 +145,10 @@ class AppProvider extends ChangeNotifier {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// 编辑返回后触发列表页重载
|
/// 编辑返回后触发列表页重载
|
||||||
void setEditRefresh() {
|
/// [itemId] 被编辑条目的 ID,用于就地更新而非重置分页
|
||||||
|
void setEditRefresh([String? itemId]) {
|
||||||
_editRefreshCounter++;
|
_editRefreshCounter++;
|
||||||
|
_lastEditedItemId = itemId;
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user