可滚动的自定义多子布局

est*_*vez 8 dart flutter flutter-layout

我无法使 CustomMultiChildLayout 可滚动。

目前,我的 CustomMultiChildLayout 只是将子项布置在一列中。将来我会让它变得更复杂,但现在我想让它可滚动。我试着把它放进去ListView,但还是不行RenderIndexedSemantics object was given an infinite size during layout.。我尝试将其放入其中,SingleChildScrollViewIntrinsicHeight在这种情况下它无法滚动,并且它的高度与视口相同。

以下是一些无法正常工作的示例:

return SingleChildScrollView(
        child: IntrinsicHeight(
          child: CustomMultiChildLayout(
            delegate: ViewLayoutBuilder(itemCount: cards.length),
            children: _buildChildren(context),
          ),
        ),
      );
Run Code Online (Sandbox Code Playgroud)

return ListView(
        children: <Widget>[
          CustomMultiChildLayout(
            delegate: ViewLayoutBuilder(itemCount: cards.length),
            children: _buildChildren(context),
          )
        ],
      )
Run Code Online (Sandbox Code Playgroud)

这是我的ViewLayoutBuilder代表:

class ViewLayoutBuilder extends MultiChildLayoutDelegate {
  final int itemCount;

  ViewLayoutBuilder({@required this.itemCount});

  @override
  void performLayout(Size size) {
    Offset position = Offset(0,0);
    Size firstSize = layoutChild('card_0', BoxConstraints.tightFor(width: size.width));
    positionChild('card_0', position);
    position = position.translate(0, firstSize.height);
    for (int i = 1; i < itemCount; i++) {
      final String cardId = 'card_$i';

      if (hasChild(cardId)) {
        Size newSize = layoutChild('$cardId', BoxConstraints.tightFor(width: size.width));
        positionChild('$cardId', position);
        position = position.translate(0, newSize.height);
      }
    }
  }

  @override
  bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) => false;
}
Run Code Online (Sandbox Code Playgroud)

我所有尝试中的主要错误是我CustomMultiChildLayout给出了无穷大的高度。在其他情况下,它会被裁剪到视口高度并且无法滚动。