一旦我获得有关最大滚动范围的信息,我就会尝试显示一个小部件。如果我分配一个实例,我可以找到该数字ScrollController
to the controller
可滚动小部件的属性。
我的问题是ScrollController
在构建过程中附加到可滚动小部件,因此我无法在第一次构建之前使用最大滚动范围数。因此我想做的是显示一个空的Container
在第一个构建中,然后将其切换为空Container
与我真正想要的小部件。像这样的东西:
_scrollController.positions.length == 0 ? new Container() : new Align(
alignment: Alignment.center,
child: new Container(
width: constraints.maxWidth,
height: 50.0,
color: Colors.black,
)
)
现在这当然行不通了,因为_scrollController.positions.length
一开始就是0,我无处可调用setState
当该值更改时(当连接控制器时)。
所以我的问题是:有没有什么地方我可以在任何时候收到通知ScrollController
附加到可滚动小部件?或者有更好的方法吗?
如果可滚动的是widget.child
.
@override
Widget build(BuildContext context) {
return new NotificationListener<ScrollNotification>(
onNotification: _handleScrollNotification,
child: widget.child,
);
}
bool _handleScrollNotification(ScrollNotification notification) {
if (notification is ScrollUpdateNotification || notification is OverscrollNotification) {
widget.child.update(notification.metrics);
}
return false;
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) => afterFirstLayout(context));
}
void afterFirstLayout(BuildContext context) {
applyInitialScrollPosition();
}
void applyInitialScrollPosition() {
ScrollController scrollControler = widget.child.controller;
ScrollPosition position = scrollControler.position;
ScrollNotification notification = ScrollUpdateNotification(
metrics: FixedScrollMetrics(
minScrollExtent: position.minScrollExtent,
maxScrollExtent: position.maxScrollExtent,
pixels: position.pixels,
viewportDimension: position.viewportDimension,
axisDirection: position.axisDirection),
context: null,
scrollDelta: 0.0);
_handleScrollNotification(notification);
}
孩子必须extends ChangeNotifier
并有一个update
method:
void update(ScrollMetrics metrics) {
assert(metrics != null);
_lastMetrics = metrics; // Save the metrics.
notifyListeners();
}
仅当已为可滚动(widget.child)显式定义滚动控制器时,所有这些才有效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)