我正在使用CustomScrollView,并为其提供控制器。 ScrollController可以工作,我什至在其中添加了一个侦听器并打印出滚动视图的位置。
CustomScrollView(
controller: _scrollController,
现在,我要做的就是跳到initState()函数中的50.0位置。
_scrollController.jumpTo(50.0);
但是,我得到了错误
scrollController未附加到任何滚动视图
答案 0 :(得分:4)
延迟它不是正确的解决方案。最好等到使用
完成树的构建WidgetsBinding.instance
.addPostFrameCallback((_){});
答案 1 :(得分:3)
@ carlosx2答案是正确的,但是如果有人想知道将WigetsBinding放在哪里。就在这里。
dist
答案 2 :(得分:2)
要设置ScrollController
的初始位置,请使用initialScrollOffset
属性:
_scrollController = ScrollController(initialScrollOffset: 50.0);
答案 3 :(得分:0)
首先通过使用其hasClients属性检查scrollController是否已附加到滚动视图。
if (_scrollController.hasClients)
_scrollController.jumpTo(50.0);
答案 4 :(得分:0)
我找到了可行的解决方案,但是坦率地说,我认为该方法不是最佳实践。 以我为例,在将 controller.jumpTo()附加到任何滚动视图之前,已对其进行了调用。为了解决问题,我延迟了几毫秒,然后调用.jumpTo(),因为将调用build并将控制器附加到任何滚动视图。
Future.delayed(Duration(milliseconds: <some time, ex: 100>), () {
_scrollController.jumpTo(50.0);
});
我完全同意这是不好的解决方案,但可以解决问题。
答案 5 :(得分:0)
当您尝试将ScrollController绑定到实际上尚不存在的小部件时,会发生有时。因此,它尝试绑定,但是没有要绑定的ListView / ScrollView。 假设您有以下代码:
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(
flex: 8,
child: Container(
child: ListView.builder(
controller: scrollController,
itemCount: messages.length,
itemBuilder: (context, index) {
return MessageTile(message: messages[index]);
}),
),
),
]),
在这里,我们正在动态构建ListView。由于我们之前从未声明过这个ListView,所以scrollController没有任何要绑定的东西。但这很容易解决:
//首先声明ListView和ScrollController
final scrollController = ScrollController(initialScrollOffset: 0);
ListView list = ListView.builder(
controller: scrollController,
itemCount: messages.length,
itemBuilder: (context, index) {
return MessageTile(message: messages[index]);
}
);
//然后在构建函数中只需引用已构建的列表
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Expanded(
flex: 8,
child: Container(
child: list,
),
),
]),
答案 6 :(得分:0)
使用setState()方法绑定到与滚动相关的小部件(您的列表视图等)
setState(() {
topicsScrollController.animateTo(....);
});
答案 7 :(得分:0)
我对两个控制器使用相同的ScrollController解决了我的问题。 首先,我创建ScrollController():
ScrollController scollBarController = ScrollController();
在我的代码内:
Container(
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: Scrollbar(
controller: scollBarController,
isAlwaysShown: true,
child: StaggeredGridView.count(
controller: scollBarController,
crossAxisCount: 16,
staggeredTiles: _staggeredTamanho,
shrinkWrap: true,
children: [
...
], //listStaggered,
mainAxisSpacing: 7.0,
),
),
),
答案 8 :(得分:0)
初始化scrollController:
ScrollController _scrollController = ScrollController();
在以下要滚动的位置使用以下代码:
SchedulerBinding.instance.addPostFrameCallback((_) {
_scrollController.jumpTo(_scrollController.position.maxScrollExtent);
});
答案 9 :(得分:0)
我尝试了上述解决方案,但是设置了ScrollController initialScrollOffset,检查hasClients和jumpTo,WidgetsBinding对我没有作用。
最后通过检查位置'scrollcontroller.positions.length'来解决我的问题
if (_sc.positions.length == 0 || _sc.position.pixels == 0.0) {
return Container();
}
您必须检查控制器位置以消除错误
参考:https://api.flutter.dev/flutter/widgets/ScrollController/position.html
答案 10 :(得分:0)
我使用此代码使appbar的颜色在0位置透明,而黑色则超过70
backgroundColor: !_scrollController.hasClients
? Colors.transparent
: _scrollController.offset > 70
? Color.fromRGBO(7, 7, 7, 1)
: Colors.transparent,