Flutter:裁剪列或行以防止溢出

问题描述 投票:5回答:1

非常简单的问题,但我一直找不到答案。

我在Flutter中有这样的布局结构:

Inkwell
  Card
    ScopedModelDescendant
      Column
        Container[]

该列中的容器数是可变的。

目标是应该看起来像这样:

expected look

但是相反,它最终会这样做:

actual look

我能够通过在SingleChildScrollViewScopedModelDescendant之间放置一个Column来创建“理想”外观,但是这当然不是我想要的,因为我不想它滚动。

我尝试在clipBehavior中添加Card属性,并且尝试在结构中的任何位置混入ClipRects,但似乎无济于事。我最好的猜测是,在ClipRect上方的Column并没有帮助,因为溢出发生在列[[within中。

这是我得到的错误:

flutter: ══╡ EXCEPTION CAUGHT BY RENDERING LIBRARY ╞═════════════════════════════════════════════════════════ flutter: The following message was thrown during layout: flutter: A RenderFlex overflowed by 15 pixels on the bottom. flutter: flutter: The overflowing RenderFlex has an orientation of Axis.vertical. flutter: The edge of the RenderFlex that is overflowing has been marked in the rendering with a yellow and flutter: black striped pattern. This is usually caused by the contents being too big for the RenderFlex. flutter: Consider applying a flex factor (e.g. using an Expanded widget) to force the children of the flutter: RenderFlex to fit within the available space instead of being sized to their natural size. flutter: This is considered an error condition because it indicates that there is content that cannot be flutter: seen. If the content is legitimately bigger than the available space, consider clipping it with a flutter: ClipRect widget before putting it in the flex, or using a scrollable container rather than a Flex, flutter: like a ListView. flutter: The specific RenderFlex in question is: flutter: RenderFlex#094c9 OVERFLOWING flutter: creator: Column ← ScopedModelDescendant<EventModel> ← Semantics ← DefaultTextStyle ← flutter: AnimatedDefaultTextStyle ← _InkFeatures-[GlobalKey#5fe8b ink renderer] ← flutter: NotificationListener<LayoutChangedNotification> ← CustomPaint ← _ShapeBorderPaint ← PhysicalShape flutter: ← _MaterialInterior ← Material ← ⋯ flutter: parentData: <none> (can use size) flutter: constraints: BoxConstraints(w=56.0, h=104.3) flutter: size: Size(56.0, 104.3) flutter: direction: vertical flutter: mainAxisAlignment: start flutter: mainAxisSize: max flutter: crossAxisAlignment: stretch flutter: verticalDirection: down flutter: ◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤◢◤ flutter: ════════════════════════════════════════════════════════════════════════════════════════════════════

感谢您的帮助。
flutter flutter-layout
1个回答
10
投票
Wrap小部件解决了您的问题。如果列或行中没有空间,请使用Wrap,它也具有对齐和间距属性。

这是简单的示例:

class WrapExample extends StatelessWidget { @override Widget build(BuildContext context) { return SizedBox( width: 200, height: 180, child: Card( child: Wrap( direction: Axis.horizontal, spacing: 8.0, // gap between adjacent chips runSpacing: 4.0, // gap between lines children: <Widget>[ Chip( avatar: CircleAvatar( backgroundColor: Colors.blue.shade900, child: Text('AH')), label: Text('Hamilton'), ), Chip( avatar: CircleAvatar( backgroundColor: Colors.blue.shade900, child: Text('ML')), label: Text('Lafayette'), ), Chip( avatar: CircleAvatar( backgroundColor: Colors.blue.shade900, child: Text('HM')), label: Text('Mulligan'), ), Chip( avatar: CircleAvatar( backgroundColor: Colors.blue.shade900, child: Text('JL')), label: Text('Laurens'), ), ], ), ), ); } }

这是输出:

Screenshot

© www.soinside.com 2019 - 2024. All rights reserved.