如何更轻松地实现一个 Flutter 布局?

Posted

技术标签:

【中文标题】如何更轻松地实现一个 Flutter 布局?【英文标题】:How to implement a flutter layout more easily? 【发布时间】:2019-06-09 01:28:30 【问题描述】:

我有一个布局效果,不知道怎么实现更方便?我有六个或 N 个子小部件,放置在一个父小部件中,每行有两个子小部件,每个小部件是父小部件宽度的 50%,高度是父小部件的高度/行。

我可以使用列、行扩展来做到这一点,但我认为它不够简单。如果我的子小部件是中间的,我不知道如何动态创建它们。

我想要达到的布局效果:

我想这样做的方式是以下伪代码 我可以在androidios中做到这一点,但我不知道如何用flutter做到。

var parentWidget = Widget()

for (var i = 0; i < 6; i++) 
    var child = Widget()
    parentWidget.add(child)

Flutter 实现如下。我可以使用列,行扩展来做到这一点,但我认为这还不够简单。如果我的子小部件不确定,我不知道如何动态创建它们。

Expanded(
      child: Column(
        children: <Widget>[
          Expanded(
            flex: 1,
            child: Row(children: <Widget>[
              Expanded(child: Text("1"),),
              Expanded(child: Text("1"),),
            ],)
          ),
          Expanded(
            flex: 1,
            child:Row(children: <Widget>[
              Expanded(child: Text("1"),),
              Expanded(child: Text("1"),),
            ],),
          ),
          Expanded(
            flex: 1,
            child: Row(children: <Widget>[
              Expanded(child: Text("1"),),
              Expanded(child: Text("1"),),
            ],),
          )
        ],
      ),
    )

【问题讨论】:

如果物品多,最好用ListView @PhucTran 是的,但是我不想要滚动效果,我只希望子小部件将父小部件拆分以适应不同的屏幕尺寸,所以不会有太多的孩子,可能六个,也许是八个 只有在项目数量足够大的情况下才能滚动(有些超出屏幕) 为什么不使用 GridView? docs.flutter.io/flutter/widgets/GridView-class.html ***.com/a/54079114/10269042 【参考方案1】:

我想出了一种方法来处理这个要求,方法是计算每个子小部件的宽度和高度,然后将它们放在 wrap 中以安排它们自己


class RowFixedWrap extends StatefulWidget 
  final double spacing;
  final double runSpacing;
  final int columnCount;
  final List<Widget> childern;

  RowFixedWrap(
      Key key, this.spacing, this.runSpacing, this.columnCount, this.childern)
      : super(key: key);

  @override
  State<StatefulWidget> createState() 
    return _FixedWrapState();
  


class _FixedWrapState extends State<RowFixedWrap> 
  @override
  Widget build(BuildContext context) 
    return LayoutBuilder(
      builder: (context, constraints) 
        var itemWidth =
            (constraints.maxWidth - widget.spacing * (widget.columnCount - 1)) /
                widget.columnCount;
        var rows = widget.childern.length % widget.columnCount != 0
            ? (widget.childern.length ~/ widget.columnCount) + 1
            : (widget.childern.length ~/ widget.columnCount);
        var itemHeight =
            (constraints.maxHeight - widget.runSpacing * (rows - 1)) / rows;

        return Wrap(
            spacing: widget.spacing,
            runSpacing: widget.runSpacing,
            children: widget.childern.map((widget) 
              return SizedBox(
                width: itemWidth,
                height: itemHeight,
                child: widget,
              );
            ).toList());
      ,
    );
  

Expanded(
        child: Padding(
      padding: const EdgeInsets.all(10.0),
      child: RowFixedWrap(
        spacing: 10,
        runSpacing: 10,
        columnCount: 2,
        childern: <Widget>[
          Container(
            color: Colors.red,
          ),
          Container(
            color: Colors.red,
          ),
          Container(
            color: Colors.red,
          ),
          Container(
            color: Colors.red,
          ),
        ],
      ),
    ));

【讨论】:

以上是关于如何更轻松地实现一个 Flutter 布局?的主要内容,如果未能解决你的问题,请参考以下文章

让移动开发更轻松 闲鱼基于Flutter构建跨端APP应用实践

只要状态没有被授予,如何一直询问位置权限-Flutter

Flutter开发--如何布局?

如何更高效地编写这个 Flutter 代码?

如何在键盘外观上为 Flutter 布局设置动画

我如何(更)轻松地比较两组数字?