一旦我掌握了有关最大滚动范围的信息,我就试图显示一个小部件。如果我将ScrollController
的实例分配给可滚动小部件的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
附加到可滚动窗口小部件时,我是否可以收到通知?或者有更好的方法吗?
答案 0 :(得分:2)
如果滚动条是Note: -webkit-app-region: drag is known to have problems while the developer tools are open.
See this GitHub issue for more information including a workaround.
。
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
只有在为可滚动对象(widget.child)明确定义了滚动控制器的情况下,所有这些方法才有效。