如何通过ScrollController获取其控制的ScrollView?
获取ScrollController对应的ScrollView的解决方案
当你只有一个ScrollController实例,且无法通过Scrollable.of()定位到目标ScrollView时,可以试试以下两种方案:
方案一:自定义带追踪功能的ScrollController子类
ScrollController在与Scrollable关联(attach)和解除关联(detach)时会触发对应方法,我们可以重写这些方法来保存对应的Scrollable实例,进而获取ScrollView:
class TrackedScrollController extends ScrollController { ScrollableState? _linkedScrollable; @override void attach(ScrollableState scrollable) { super.attach(scrollable); _linkedScrollable = scrollable; } @override void detach(ScrollableState scrollable) { _linkedScrollable = null; super.detach(scrollable); } // 获取绑定的ScrollView ScrollView? get targetScrollView => _linkedScrollable?.widget as ScrollView?; }
使用时直接用这个子类替代原生ScrollController,之后通过controller.targetScrollView就能拿到对应的ScrollView实例。
方案二:给目标ScrollView绑定GlobalKey
如果能控制目标ScrollView的创建流程,直接给它设置一个GlobalKey是最直接的方式:
final GlobalKey<ScrollViewState> _scrollViewKey = GlobalKey(); // 创建ScrollView时绑定key ListView( key: _scrollViewKey, controller: yourExistingController, // 其他配置项 ) // 后续获取ScrollView ScrollView? targetScrollView = _scrollViewKey.currentWidget as ScrollView?;
这种方法不需要修改ScrollController,适合场景可控的情况。
内容的提问来源于stack exchange,提问作者SePröbläm
相关产品推荐
相关产品推荐

