Listview滚动到具有可变高度的小部件

Posted

技术标签:

【中文标题】Listview滚动到具有可变高度的小部件【英文标题】:Listview Scrolling to widget with variable height 【发布时间】:2019-07-18 08:53:24 【问题描述】:

我有一个列表视图,其中填充了可变高度的文本小部件:

ListView.builder(
    controller: _controller,
    itemCount: items.length,
    itemBuilder: (context, index) 
        return Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(items[index].text));
    )

我使用 ScrollController (_controller) 为列表设置动画,并在用户单击按钮时向下滚动。

_moveDown() 
    _controller.animateTo(_controller.offset + 100,
    curve: Curves.linear, duration: Duration(milliseconds: 100));

我以固定增量滚动(上例中为 100 像素)没有问题,但我不知道如何计算列表中小部件的高度,以便用户可以在列表项之间滚动。

有没有办法获取列表中每个元素的高度?

【问题讨论】:

【参考方案1】:

是的,有。

您需要为您的子小部件提供Key,例如GlobalKey,在您的示例中,它看起来像Padding,然后您可以找到渲染小部件的height。您处理滚动的方法可能是这样的,其中myKey 是每个项目的键。

 void _moveDown(GlobalKey myKey) 
    final keyContext = myKey.currentContext;

    if (keyContext != null) 
      final box = keyContext.findRenderObject() as RenderBox;
      _scrollController.animateTo(_scrollController.offset + box.size.height,
          duration: Duration(milliseconds: 100), curve: Curves.linear);
    
  

【讨论】:

谢谢@miguelpruvio - 我如何分配这些键?我已经看到完全按照您的解释进行操作的示例,但它们不处理多个项目 列表中的项目都是一样高的吗? 不,这就是问题 ;)

以上是关于Listview滚动到具有可变高度的小部件的主要内容,如果未能解决你的问题,请参考以下文章

ListView 不在定位的小部件中滚动

Flutter - 可滚动页面中的列表视图

我的 ListView 构建器的 ListTile 小部件不可滚动并且显示渲染问题

如何将带有列表视图的小部件限制为其子项的大小?

Flutter ListView 与不同的小部件和列表项

在 Flutter 应用程序中的 ListView 滚动上隐藏/关闭键盘