每当我在列表视图中滚动时,都会在控制台中收到此错误:
ScrollController not attached to any scroll views.
'package:flutter/src/widgets/scroll_controller.dart':
Failed assertion: line 110 pos 12: '_positions.isNotEmpty'
我整天都在尝试解决此问题,我想请其他人看看。 这段代码还有更多问题,但是现在我主要是要解决此错误。
我尝试使用Listview.builder,检查hController.hasClients以及更多其他小东西。他们似乎什么也没改变
class MyHome extends StatefulWidget {
@override
MyHomeState createState() => new MyHomeState();
}
class MyHomeState extends State<MyHome> with SingleTickerProviderStateMixin {
ScrollController hController;
ScrollController tController;
ScrollController fController;
ScrollController bController;
@override
void initState() {
super.initState();
hController = new ScrollController()..addListener(_scrollListener);
tController = new ScrollController()..addListener(_scrollListener);
fController = new ScrollController()..addListener(_scrollListener);
bController = new ScrollController()..addListener(_scrollListener);
}
@override
void dispose() {
super.dispose();
hController.removeListener(_scrollListener);
tController.removeListener(_scrollListener);
fController.removeListener(_scrollListener);
bController.removeListener(_scrollListener);
}
@override
Widget build(BuildContext context) {
return new DefaultTabController(
length: 4,
child: new Scaffold(
//Removed AppBar for readability
body: new TabBarView(
children: [
new Container(// hot
child: ListView(
controller: hController,
children: <Widget>[
Utils.show("hot")
],
),
),
new Container( //Trending
child: ListView(
controller: tController,
children: <Widget>[
Utils.show("trending")
],
),
),
new Container( //Fresh
child: ListView(
controller: fController,
children: <Widget>[
Utils.show("fresh")
],
),
),
new Container( //Best
child: ListView(
controller: bController,
children: <Widget>[
Utils.show("best")
],
),
),
],
),
));
}
void _scrollListener() {
if (hController.position.extentAfter == 0.0) {
setState(() {
Utils.show("hot");
});
}else if (tController.position.extentAfter == 0.0) {
setState(() {
Utils.show("trending");
});
} else if (fController.position.extentAfter == 0.0) {
setState(() {
Utils.show("fresh");
});
} else if (bController.position.extentAfter == 0.0) {
setState(() {
Utils.show("best");
});
}
}
}
编辑:为清楚起见,我第一次发布此代码时,我两次使用了tController。这当然是一个错误,但没有解决错误。在四个列表视图中的每个视图中滚动时都会发生错误。
答案 0 :(得分:9)
为避免此类错误,请使用getter
ScrollController.hasClient
如果这是错误的,则与 [ScrollPosition],例如[position],[offset],[animateTo]和[jumpTo], 不能被调用。
例如:
if (_controller.hasClients) {
_controller.animateTo(
...
}
答案 1 :(得分:0)
如果正确粘贴您的代码-看来可能有误:
new Container(// hot
child: ListView(
controller: tController,
children: <Widget>[
Utils.show("hot")
],
),
),
new Container( //Trending
child: ListView(
controller: tController,
children: <Widget>[
Utils.show("trending")
],
),
),
您已经使用过tController
两次,却没有使用过hController
答案 2 :(得分:0)
问题出在_scrollListener
内部。
在if-else
中检查控制器时,场景中只有一个视图。意味着仅渲染一个listview
,并且仅完全设置一个scrollcontroller
。但是在您的代码中,他们正在检查单个函数中所有scrollcontroller的位置。那就是为什么您收到此错误。首先检查控制器是否具有位置,只有在连接控制器和正确渲染视图后才具有该位置。之后,检查extentAfter
的值。
Exa-
if (hController.positions.length > 0 && tController.position.extentAfter == 0.0) {
}
else if (tController.positions.length > 0 && tController.position.extentAfter == 0.0) {
}
&等等
答案 3 :(得分:-1)
更新您的Flutter SDK,即可解决此问题
那对我来说是工作
在您的cmd上运行此命令-flutter update