0

我有一个特殊的要求来允许一个标题小部件,通常包含静态内容出现在滚动视图的顶部。滚动视图应该与标题小部件重叠,以便可以使用剪辑形状来产生效果。我通过使用带有标题小部件的堆栈视图作为堆栈中的第一项,滚动视图作为顶部元素来实现此效果。滚动视图包含一个列,其中第一个子项是所需高度的空容器(标题小部件的高度减去重叠量)。这在将已知高度作为硬编码参数传递时达到了预期的效果。(注意:我尝试使用 Sliver 列表来完成此操作,但无法实现所需的重叠以满足产品要求。)

标题小部件包含通过 API 响应加载的图像。图像的高度可能会有所不同,因此我需要在运行时确定这一点并相应地调整 UI。我不认为这将是一项艰巨的任务,但到目前为止,我还没有找到一种方法来做到这一点。以下两张图片显示了所需的效果,右侧的图片显示了向上滚动的正确行为。请注意,滚动视图必须以与剪辑半径相同的量与标题图像重叠。

在此处输入图像描述 在此处输入图像描述

这会生成列表。_getComponents为 SingleChildScrollView 中包含的列提供子小部件:

  List<Widget> _getComponents(List<Section> sections, BuildContext context, double? height) {
    List<Widget> widgetList = [
      Container(height: 225) // need to obtain correct height here
    ];
    for (int i = 1; i < sections.length; i++) {
      Section section = sections[i];
      if (section.model != null) {
        switch (section.code) {
          case mediaTypeCode:
            if (section.model.runtimeType == MediaModel) {
              widgetList.add(HeaderComponent(section: section));
            }
            break;
          case articleTypeCode:
            if (section.model.runtimeType == ArticleSectionModel) {
              widgetList.add(TitleContentHeader(
                  model: section.model as ArticleSectionModel));
            }
            break;
        }
      }
    }
    return widgetList;
  }

然后在我的视图小部件中,堆栈构建如下:

return Container(
  color: Colors.white,
  child: Stack(
    children: [
      _getHeader(sections),
      SingleChildScrollView(
        child: Column(
          children: _getComponents(sections!, context, null),
        ),
      ),
    ],
  ),
);

我需要能够获取返回的标题的高度_getHeader(sections)并将其传递给_getComponents函数,以便我可以确定滚动视图的正确起始位置。

任何人都可以对此提供任何见解吗?

或者,你能推荐一个插件来允许上图中的行为显示吗?如上所述,Sliver List 并没有产生预期的效果。

谢谢!

4

1 回答 1

0

您可以使用以下方法获取小部件的大小RenderBox


    import 'package:flutter/material.dart';

    class WidgetPosition {
      getSizes(GlobalKey key) {
        final RenderBox renderBoxRed = key.currentContext.findRenderObject();
        final sizeRed = renderBoxRed.size;
        // print("SIZE: $sizeRed");
        return [sizeRed.width, sizeRed.height];
      }

      getPositions(GlobalKey key) {
        final RenderBox renderBoxRed = key.currentContext.findRenderObject();
        final positionRed = renderBoxRed.localToGlobal(Offset.zero);
        // print("POSITION: $positionRed ");
        return [positionRed.dx, positionRed.dy];
      }
    }

于 2021-06-27T18:40:08.420 回答