一统天下 flutter - widget 布局类(可以有多个子): Row - 水平弹性布局

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

一统天下 flutter - widget 布局类(可以有多个子): Row - 水平弹性布局

示例如下:

lib\widget\layout\row.dart

/*
 * Row - 水平弹性布局
 *
 * Row 在布局其子元素时,可以通过 Expanded 按比例指定每个元素的宽度,因为 Row 继承自 Flex(关于在 Row 中使用弹性布局 Expanded, Flexible, Spacer 请参见 flex.dart)
 */

import 'package:flutter/material.dart';
import 'package:flutter_demo/helper.dart';

class RowDemo extends StatefulWidget {
  const RowDemo({Key? key}) : super(key: key);

  @override
  _RowDemoState createState() => _RowDemoState();
}

class _RowDemoState extends State<RowDemo> {

  var _mainAxisAlignment = MainAxisAlignment.start;
  var _crossAxisAlignment = CrossAxisAlignment.center;

  void _changeMainAxisAlignment() {
    setState(() {
      var index = _mainAxisAlignment.index + 1;
      if (index >= MainAxisAlignment.values.length) {
        index = 0;
      }
      _mainAxisAlignment = MainAxisAlignment.values[index];
    });
  }

  void _changeCrossAxisAlignment() {
    setState(() {
      var index = _crossAxisAlignment.index + 1;
      if (index >= CrossAxisAlignment.values.length - 1) {
        index = 0;
      }
      _crossAxisAlignment = CrossAxisAlignment.values[index];
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Container(
          height: 200,
          color: Colors.red,
          child: Row(
            /// mainAxisSize - 主轴尺寸(对于 Row 来说就是水平方向的宽度)
            ///   max - 宽度为父的宽度,默认值
            ///   min - 宽度为所有子占用的水平空间的总和
            mainAxisSize: MainAxisSize.max,
            /// textDirection - 水平排列方向
            ///   ltr - 左到右,默认值
            ///   rtl - 右到左
            textDirection: TextDirection.ltr,
            /// mainAxisAlignment - 主轴方向的排列方式(对于 Row 来说就是每个元素水平方向的排列方式),以下说明以 TextDirection.ltr 为例
            ///   start - 线性排列,整体居左
            ///   end - 线性排列,整体居右
            ///   center - 线性排列,整体居中
            ///   spaceBetween - 每个元素中间的空白相同,两侧屏幕边缘和元素之间无空白
            ///   spaceAround - 每个元素中间的空白相同,两侧屏幕边缘和元素之间的空白为元素间空白的二分之一
            ///   spaceEvenly - 每个元素中间的空白相同,两侧屏幕边缘和元素之间的空白与元素间空白相同
            mainAxisAlignment: _mainAxisAlignment,
            /// verticalDirection - 垂直排列方向
            ///   down - 上到下,默认值
            ///   up - 下到上
            verticalDirection: VerticalDirection.down,
            /// crossAxisAlignment - 交叉轴方向的元素对齐方式(对于 Row 来说就是每个元素垂直方向的对齐方式),以下说明以 VerticalDirection.down 为例
            ///   start - 顶部对齐
            ///   end - 底部对齐
            ///   center - 中线对齐,默认值
            ///   stretch - 将每个元素的高度拉伸到与 Row 同高
            ///   baseline - 基线对齐
            crossAxisAlignment: _crossAxisAlignment,
            children: [
              MyText("a"),
              Container(
                height: 50,
                color: Colors.green,
                child: MyText("bb"),
              ),
              MyText("ccc"),
              Container(
                height: 100,
                color: Colors.green,
                child: MyText("dddd"),
              ),
            ],
          ),
        ),
        MyButton(
          onPressed: _changeMainAxisAlignment,
          child: Text("mainAxisAlignment: ${_mainAxisAlignment.name}"),
        ),
        MyButton(
          onPressed: _changeCrossAxisAlignment,
          child: Text("crossAxisAlignment: ${_crossAxisAlignment.name}"),
        ),
      ],
    );
  }
}

源码 https://github.com/webabcd/flutter_demo
作者 webabcd

posted @ 2023-03-22 10:11  webabcd  阅读(29)  评论(0编辑  收藏  举报