Flutter Row 小部件通过切断剩余区域解决 RenderFlex 溢出问题

Posted

技术标签:

【中文标题】Flutter Row 小部件通过切断剩余区域解决 RenderFlex 溢出问题【英文标题】:Flutter Row widget solve RenderFlex overflow by cutting off remaining area 【发布时间】:2020-09-03 08:43:43 【问题描述】:

这里已经有很多关于Renderflex 溢出的问题,但我相信我的用例可能有点不同。

只是常见的问题 - 在 Row 小部件中有一个太大的 Widget,我得到了 A RenderFlex overflowed by X pixels ... 错误。

我想创建一个 Row 来切断它溢出的子 Widget,如果它们会在它的区域之外呈现而不会出现错误。

首先,在我的情况下,ExpandedFlexible 包装Row 小部件中的最后一个元素不起作用,推荐here 和here 和许多其他地方。请看代码和图片:

class PlayArea extends StatelessWidget 
  @override
  Widget build(BuildContext context) 
    final dummyChild = Container(
      color: Colors.black12,
      width: 100,
      child: Text('important text'),
    );

    final fadeContainer = Container(
      decoration: BoxDecoration(
        gradient: LinearGradient(
          begin: Alignment.centerLeft,
          end: Alignment.centerRight,
          colors: [
            Colors.black26,
            Colors.black87,
          ],
        ),
      ),
      width: 600,
    );

    return Padding(
      padding: const EdgeInsets.all(20.0),
      child: Container(
        color: Colors.redAccent,
        child: Column(children: [
          Expanded(
            child: Row(
              children: <Widget>[
                dummyChild,
                fadeContainer,
              ],
            ),
          ),
          Expanded(
            child: Row(
              children: <Widget>[
                dummyChild,
                Expanded(
                  child: fadeContainer,
                ),
              ],
            ),
          ),
          Expanded(
            child: Row(
              children: <Widget>[
                Container(
                  color: Colors.black12,
                  width: 1100,
                  child: Text('important text'),
                ),
                Expanded(
                  child: fadeContainer,
                ),
              ],
            ),
          ),
        ]),
      ),
    );
  

要点:

使用Expanded 改变Container 的宽度,从而改变渐变的斜率。我想保持渐变原样 即使使用 Expanded 小部件,Row 也无法应对 important text 的区域太宽且水平不适合屏幕的情况 - 该小部件会出现溢出错误 从技术上讲,它在第一种情况下有效,因为在绿色区域的右侧没有绘制红色,它“只是”有一个错误

我如何动态地切断剩余空间而不会出现任何错误 - 无论屏幕大小和内容如何?

【问题讨论】:

【参考方案1】:

我找到的一个解决方案是

Row(
    children: <Widget>[
        dummyChild,
        fadeContainer,
    ],
)

可以转换成

ListView(
    scrollDirection: Axis.horizontal,
    physics: const NeverScrollableScrollPhysics(),
    children: <Widget>[
        dummyChild,
        fadeContainer,
    ],
)

创建一个水平列表并防止滚动。


edit.:刚刚发现you'll get unbounded vertical height,所以不一样。

【讨论】:

以上是关于Flutter Row 小部件通过切断剩余区域解决 RenderFlex 溢出问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Flutter 中让 Row 子节点尽可能宽(父节点的剩余宽度)?

10 个派上用场的 Flutter 小部件

Flutter:小部件压缩优先级

Flutter:需要解释为啥 Expanded() 修复了由 Row() 小部件作为受约束的 Column() 小部件的子项引起的异常

Flutter Container 在 Row 小部件内定位或对齐

Flutter Layout Row / Column - 共享宽度,扩展高度