Flutter完全开发手册
  • Flutter 页面布局 Wrap流式布局 实现电商App搜索页面布局

    我们在开发移动端界面的时候,经常会遇到一组尺寸不一的组件需要作为同一组展示,典型的 就是下面这种搜索历史。搜索内容的文字长短不一,导致显示的宽度不一致。而且,需要根据屏幕的宽度来自动换行显示。这个时候,用行布局或者网格布局都满足不了要求,那怎么办呢?其实 Flutter 为我们提供了很好的组件,那就是Wrap组件。

    Wrap组件

    Wrap可以实现流布局,单行的Wrap跟Row表现几乎一致,单列的Wrap跟Column都是单行单列的; Wrap则突破了这个限制,mainAxis上的空间不足时,则向crossAxis上去扩展

    Wrap流式布局组件,一行或者一列放不下子组件时,会自动换行。

    Flutter自学Wrap流式布局

    属性说明
    direction主轴方向,默认水平
    alignment主轴对齐方向
    spacing主轴方向上的间距
    verticalDirection定义了children摆放顺序,默认是down,见Fiex相关属性介绍
    runAlignmentrun的对齐方式。run可以理解为新的行或者列,如果水平方向布局的话run可以理解为新的一行
    runSpacingrun的间距

    Wrap流布局示例:

    
    class MyHomePage extends StatelessWidget {
      const MyHomePage({Key? key}) : super(key: key);
      @override
      Widget build(BuildContext context) {
        return Wrap(
          // 方位
          direction:Axis.horizontal,
          // 对齐方式
          alignment:WrapAlignment.start,
          // x轴间距
          spacing: 10.0,
          // Y轴间距
          runSpacing: 10.0,
          children: [
            MyButton(text: "《封神第一部》", pressed: () {}),
            MyButton(text: "变形金刚", pressed: () {}),
            MyButton(text: "暗杀风暴", pressed: () {}),
            MyButton(text: "消失的她", pressed: () {}),
            MyButton(text: "零号追杀", pressed: () {}),
            MyButton(text: "长安三万里", pressed: () {}),
            MyButton(text: "老板娘3", pressed: () {}),
            MyButton(text: "穷兄富弟", pressed: () {}),
            MyButton(text: "暗杀风暴", pressed: () {}),
            MyButton(text: "黄河守墓人", pressed: () {}),
            MyButton(text: "上海滩之风云正道", pressed: () {}),
            MyButton(text: "惊天侠盗团", pressed: () {}),
          ],
        );
      }
    }
    
    // 自定义按钮
    class MyButton extends StatelessWidget {
      final String text;
      final Function() pressed;
      const MyButton({super.key, required this.text, required this.pressed});
    
      @override
      Widget build(BuildContext context) {
        return ElevatedButton(
            style: ButtonStyle(
              elevation: MaterialStateProperty.all(0),
              backgroundColor: MaterialStateProperty.all(Colors.blue),
              foregroundColor: MaterialStateProperty.all(Colors.white),
            ),
            onPressed: pressed,
            child: Text(text));
      }
    }