颤振错误:"滚动控制器未附加到任何滚动视图。



每当我在列表视图中滚动时,我都会在控制台中收到此错误:

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。这当然是一个错误,但没有解决错误。在四个列表视图中的每一个中滚动时都会发生此错误。

为避免此类错误,请使用 getter

ScrollController.hasClient

如果这是假的,则与 [滚动位置],例如 [位置]、[偏移]、[动画到] 和 [跳转到], 不得调用。

例如:

if (_controller.hasClients) {
_controller.animateTo(
...
}

问题出在_scrollListener内部。

if-else中检查控制器时,场景中只有一个视图。意味着只渲染一个listview,只设置一个scrollcontroller。但是在您的代码中,它们在单个函数中检查所有滚动控制器的位置。这就是您收到此错误的原因。首先检查控制器是否具有位置,只有在控制器连接并正确呈现视图时,它才会具有位置。之后检查extentAfter值。

呵呵 -

if (hController.positions.length > 0 && tController.position.extentAfter == 0.0) {
}
else if (tController.positions.length > 0 && tController.position.extentAfter == 0.0) {
}

等等

检查控制器没有客户端 ant,然后延迟跳转:

if (!_scrollController.hasClients) {
_scrollController.animateTo(_scrollController.position.maxScrollExtent,
duration: const Duration(milliseconds: 500),
curve: Curves.easeInOut);
}

如果您正确粘贴代码 - 似乎可能存在错误:

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

更新你的颤振 sdk 它将解决这个问题 那是我的工作 在您的CMD上运行它 -flutter update

相关内容

最新更新