Use PageStorage to store state

This commit is contained in:
2024-12-09 19:56:43 +08:00
parent 1104d28f14
commit 72b146a9bf
5 changed files with 188 additions and 79 deletions

View File

@@ -281,7 +281,9 @@ class _FilledTabBarState extends State<FilledTabBar> {
_IndicatorPainter? painter;
var scrollController = ScrollController();
var scrollController = ScrollController(
keepScrollOffset: false
);
var tabBarKey = GlobalKey();
@@ -298,12 +300,20 @@ class _FilledTabBarState extends State<FilledTabBar> {
super.dispose();
}
PageStorageBucket get bucket => PageStorage.of(context);
@override
void didChangeDependencies() {
_controller = widget.controller ?? DefaultTabController.of(context);
_controller.animation!.addListener(onTabChanged);
initPainter();
super.didChangeDependencies();
var prevIndex = bucket.readState(context) as int?;
if (prevIndex != null && prevIndex != _controller.index) {
Future.microtask(() {
_controller.index = prevIndex;
});
}
}
@override
@@ -387,6 +397,7 @@ class _FilledTabBarState extends State<FilledTabBar> {
}
updateScrollOffset(i);
previousIndex = i;
bucket.writeState(context, i);
}
void updateScrollOffset(int i) {

View File

@@ -865,6 +865,39 @@ class ComicListState extends State<ComicList> {
String? _nextUrl;
Map<String, dynamic> get state => {
'maxPage': _maxPage,
'data': _data,
'page': _page,
'error': _error,
'loading': _loading,
'nextUrl': _nextUrl,
};
void restoreState(Map<String, dynamic>? state) {
if (state == null) {
return;
}
_maxPage = state['maxPage'];
_data.clear();
_data.addAll(state['data']);
_page = state['page'];
_error = state['error'];
_loading.clear();
_loading.addAll(state['loading']);
_nextUrl = state['nextUrl'];
}
void storeState() {
PageStorage.of(context).writeState(context, state);
}
@override
void didChangeDependencies() {
super.didChangeDependencies();
restoreState(PageStorage.of(context).readState(context));
}
void remove(Comic c) {
if (_data[_page] == null || !_data[_page]!.remove(c)) {
for (var page in _data.values) {
@@ -1025,6 +1058,7 @@ class ComicListState extends State<ComicList> {
}
} finally {
_loading[page] = false;
storeState();
}
}
@@ -1073,6 +1107,7 @@ class ComicListState extends State<ComicList> {
);
}
return SmoothCustomScrollView(
key: const PageStorageKey('scroll'),
controller: widget.controller,
slivers: [
if (widget.leadingSliver != null) widget.leadingSliver!,