Flutter中的ListView Builder滚动控制器监听器在列表视图内部不触发?

11

我有一个列表视图构建器小部件在另一个列表视图中。当滚动位置到达其末尾时,内部列表视图监听器无法触发。

initState() {
   super.initState();

  _scrollController.addListener(() {
  if (_scrollController.position.maxScrollExtent ==
      _scrollController.position.pixels) {function();}
}

Container(
 child: Listview(
  children: <Widget>[
    Container(),
    ListView.builder(
      controller: _scrollController,
      physics: NeverScrollableScrollPhysics(),
      shrinkWrap: true,
      itemCount: list.length,
      itemBuilder: (BuildContext context, int index) {
         return Container();
      },
   ),
  ]
 )
)

有没有什么理由在另一个ListView中放置ListView?从你的代码来看,这毫无意义。 - LonelyWolf
1
这里还有一些其他的小部件,我没有在这里包含。 - afsal.an
你正在将ListView.builder()扩展到具有无限高度的ListView()中,因此滚动视图无法找到最大滚动范围。请尝试删除父级ListView()。 - Jayesh Choudhary
2个回答

13

在任何小部件之前,您可能已经附加了SingleChildScrollView

因此,请将_scrollController附加到SingleChildScrollView而不是ListView

body: SingleChildScrollView(
        controller: _scrollController,
        child: Column(
          children: [
            _chips(),
            SizedBox(
              height: 10,
            ),
            _slider(),
            _showGrid(),
          ],
        ),
      ),

7

列表视图必须滚动,否则它将无法工作。不仅要移除NeverScrollableScrollPhysics(),还要将该列表视图添加到某个容器中,并设置其高度小于ListView的总高度。然后,ListView开始滚动,函数将被触发。

  ScrollController _scrollController = ScrollController();
  List<int> list = [1, 2, 3, 4, 5];
  initState() {
    super.initState();

    _scrollController.addListener(() {
      if (_scrollController.position.maxScrollExtent ==
          _scrollController.position.pixels) {
        print('firing');
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: ControlBar(
          title: Text('Home'),
        ),
      ),
      body: ListView(
        children: <Widget>[
          Container(
            height: 150,
            child: ListView.builder(
              controller: _scrollController,
              shrinkWrap: true,
              itemCount: list.length,
              itemBuilder: (BuildContext context, int index) {
                return ListTile(title: Text(list[index].toString()));
              },
            ),
          ),
        ],
      ),
    );
  }

问题是关于为什么不能滚动。作者并没有要求指出如何重新设置第二个ListView的父级。 - Sergey Salnikov
4
@SergeySalnikov,OP的问题是当滚动位置到达其末尾时,内部ListView侦听器不会触发,这意味着内部ListView已经扩展到父Listview,这意味着内部ListView永远不会滚动,但父Listview会滚动,这意味着它无法触发内部ListView侦听器。 - LonelyWolf
问题不在于如何使其可滚动,而是为什么它无法滚动(没有回调触发)。 - Sergey Salnikov
@SergeySalnikov请仔细阅读问题。我在先前的评论中已经为您突出了部分内容。 - LonelyWolf
谢谢!这正是我遇到的问题。但我通过动态计算分页的获取限制,使用屏幕高度,并多获取一些数据以便始终有可滚动的项目来解决它。 - Syed Umair

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接