@@ -10,7 +10,6 @@ import 'package:readeck_app/ui/core/ui/loading.dart';
1010import 'package:readeck_app/ui/bookmarks/view_models/bookmarks_viewmodel.dart' ;
1111import 'package:readeck_app/utils/network_error_exception.dart' ;
1212import 'package:readeck_app/ui/core/ui/snack_bar_helper.dart' ;
13- import 'package:readeck_app/ui/core/main_layout.dart' ;
1413
1514/// 书签列表页面的文案配置
1615class BookmarkListTexts {
@@ -45,10 +44,12 @@ class BookmarkListScreen<T extends BaseBookmarksViewmodel>
4544 super .key,
4645 required this .viewModel,
4746 required this .texts,
47+ this .scrollController,
4848 });
4949
5050 final T viewModel;
5151 final BookmarkListTexts texts;
52+ final ScrollController ? scrollController;
5253
5354 @override
5455 State <BookmarkListScreen <T >> createState () => _BookmarkListScreenState <T >();
@@ -57,6 +58,7 @@ class BookmarkListScreen<T extends BaseBookmarksViewmodel>
5758class _BookmarkListScreenState <T extends BaseBookmarksViewmodel >
5859 extends State <BookmarkListScreen <T >> {
5960 ScrollController ? _scrollController;
61+ bool _ownsController = false ;
6062 late final ListenableSubscription _deleteSuccessSubscription;
6163
6264 @override
@@ -92,37 +94,37 @@ class _BookmarkListScreenState<T extends BaseBookmarksViewmodel>
9294 void didChangeDependencies () {
9395 super .didChangeDependencies ();
9496
95- // 只有在没有外部提供ScrollController时才创建自己的
97+ // 使用外部提供的 ScrollController 或创建自己的(仅首次绑定)
9698 if (_scrollController == null ) {
97- _scrollController = ScrollController ();
98- _scrollController? .addListener (_onScroll);
99-
100- // 延迟到下一帧更新Provider,避免在build过程中触发rebuild
101- WidgetsBinding .instance.addPostFrameCallback ((_) {
102- if (mounted) {
103- try {
104- final provider = context.read <ScrollControllerProvider ?>();
105- provider? .setScrollController (_scrollController);
106- } catch (e) {
107- // 在测试环境中可能会失败,忽略
108- }
109- }
110- });
99+ _scrollController = widget.scrollController ?? ScrollController ();
100+ _scrollController! .addListener (_onScroll);
101+ _ownsController = widget.scrollController == null ;
111102 }
112103 }
113104
114105 @override
115- void dispose () {
116- // 清除Provider中的ScrollController引用
117- try {
118- final provider = context.read <ScrollControllerProvider ?>();
119- provider? .setScrollController (null );
120- } catch (e) {
121- // 在测试或context已失效时忽略错误
106+ void didUpdateWidget (covariant BookmarkListScreen <T > oldWidget) {
107+ super .didUpdateWidget (oldWidget);
108+ if (oldWidget.scrollController != widget.scrollController) {
109+ // 解绑旧
110+ _scrollController? .removeListener (_onScroll);
111+ if (_ownsController) {
112+ _scrollController? .dispose ();
113+ }
114+ // 绑定新
115+ _scrollController = widget.scrollController ?? ScrollController ();
116+ _ownsController = widget.scrollController == null ;
117+ _scrollController! .addListener (_onScroll);
122118 }
119+ }
123120
121+ @override
122+ void dispose () {
124123 _scrollController? .removeListener (_onScroll);
125- _scrollController? .dispose ();
124+ // 只有自己创建的 ScrollController 才需要 dispose
125+ if (_ownsController) {
126+ _scrollController? .dispose ();
127+ }
126128 _deleteSuccessSubscription.cancel ();
127129 super .dispose ();
128130 }
0 commit comments