Flutter 组件之 Padding、Row、Column、F

2023-10-10  本文已影响0人  Abner_XuanYuan

1、Padding

Padding 组件用来处理容器与子元素之间的间距。

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return GridView.count(
      crossAxisSpacing: 10,
      mainAxisSpacing: 10,
      crossAxisCount: 2,
      children: <Widget>[
        Padding(
          padding: const EdgeInsets.all(10),
          child: Image.network(
            'https://www.itying.com/images/flutter/1.png',
            fit: BoxFit.cover,
          ),
        ),
        Padding(
          padding: const EdgeInsets.all(10),
          child: Image.network(
            'https://www.itying.com/images/flutter/2.png',
            fit: BoxFit.cover,
          ),
        ),
        Padding(
          padding: const EdgeInsets.all(10),
          child: Image.network(
            'https://www.itying.com/images/flutter/3.png',
            fit: BoxFit.cover,
          ),
        ),
      ],
    );
  }
}

2、Row 水平布局组件

Row Row({
  Key? key,
  //主轴对齐方式,可以选择start、end、center、spaceBetween、spaceAround、spaceEvenly
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,  
  //主轴大小,可以选择min、max;
  MainAxisSize mainAxisSize = MainAxisSize.max,
  //横轴的对齐方式
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center, 
  //文字方向
  TextDirection? textDirection,
  //垂直方向
  VerticalDirection verticalDirection = VerticalDirection.down,
  //项目对齐基线
  TextBaseline? textBaseline,
  List<Widget> children = const <Widget>[],
})

示例

///Row
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: double.infinity,
      width: double.infinity,
      color: Colors.lightBlue,
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer(
            Icons.home,
            size: 100,
          ),
          IconContainer(
            Icons.home_filled,
            color: Colors.black,
            size: 50,
          ),
          IconContainer(
            Icons.home_mini,
            color: Colors.orange,
          ),
        ],
      ),
    );
  }
}

// ignore: must_be_immutable
class IconContainer extends StatelessWidget {
  Color color;
  double size;
  IconData icon;
  IconContainer(this.icon,
      {super.key, this.color = Colors.red, this.size = 32.0});
  @override
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      width: 100,
      color: color,
      child: Center(
        child: Icon(
          icon,
          size: size,
          color: Colors.white,
        ),
      ),
    );
  }
}

3、Column 垂直布局组件

Column Column({
  Key? key,
  //主轴对齐方式,可以选择start、end、center、spaceBetween、spaceAround、spaceEvenly
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
  //主轴大小,可以选择min、max;
  MainAxisSize mainAxisSize = MainAxisSize.max,
  //横轴的对齐方式
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
  //文字方向
  TextDirection? textDirection,
  //垂直方向
  VerticalDirection verticalDirection = VerticalDirection.down,
  //项目对齐基线
  TextBaseline? textBaseline,
  List<Widget> children = const <Widget>[],
})

示例

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: double.infinity,
      height: double.infinity,
      color: Colors.lightGreen,
      child: Column(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          IconContainer2(Icons.home),
          IconContainer2(
            Icons.search,
            color: Colors.black,
            size: 50,
          ),
          IconContainer2(
            Icons.send,
            color: Colors.green,
          ),
          IconContainer2(
            Icons.back_hand,
            size: 50,
          ),
        ],
      ),
    );
  }
}

// ignore: must_be_immutable
class IconContainer2 extends StatelessWidget {
  // late IconData iconData;
  // late Color color;
  // late double size;
  IconData iconData;
  Color color;
  double size;
  IconContainer2(this.iconData,
      {super.key, this.color = Colors.orange, this.size = 30});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      width: 100,
      color: color,
      child: Center(
          child: Icon(
        iconData,
        size: size,
        color: Colors.white,
      )),
    );
  }
}

注:
double.infinity & double.maxFinite:可以让当前元素的 width 或者 height 达到父元素的尺寸。

4、Flex

Flex 组件可以沿着水平或垂直方向排列子组件,如果你知道主轴方向,使用 Row 或 Column 会方便一些,因为 Row 和 Column 都继承自 Flex ,参数基本相同,所以能使用 Flex 的地方基本上都可以使用 Row 或 Column 。 Flex 本身功能是很强大的,它也可以和 Expanded 组件配合实现弹性布局 。

Flex Flex({
  Key? key,
  //子组件在主轴上的布局方向
  required Axis direction, 
  //主轴对齐方式,可以选择start、end、center、spaceBetween、spaceAround、spaceEvenly
  MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
  //主轴大小,可以选择min、max;
  MainAxisSize mainAxisSize = MainAxisSize.max,
  //横轴的对齐方式
  CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
  //文字方向
  TextDirection? textDirection,
  //垂直方向
  VerticalDirection verticalDirection = VerticalDirection.down,
  //项目对齐基线
  TextBaseline? textBaseline,
  /*
  当子组件在主轴上的总空间在父 FlexBox 控件内有溢出部分,绘制孩子时的裁剪行为,分别为:
  Clip.none -- 不裁剪孩子们在父亲中的溢出部分,溢出部分会在父亲的范围外显示出来。
  Clip.hardEdge -- 速度最快,但保真度较低。
  Clip.antiAlias -- 坑锯齿裁剪(边缘更加平滑),裁剪后孩子们不会在新的画布上绘制,比    Clip.hardEdge稍慢。
  Clip.antiAliasWithSaveLayer - 坑锯齿裁剪(边缘更加平滑),裁剪后孩子们会在新的画布上绘制,速度最慢,很少被用到。
  */
  Clip clipBehavior = Clip.none,
  List<Widget> children = const <Widget>[],
})

示例

//水平布局
///Flex
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Row(  //此处的 Row 可以代替以下两行代码
    // return Flex(
    //   direction: Axis.horizontal,
    
      children: [
        Expanded(
          flex: 2,
          child: IconContainer3(Icons.home),
        ),
        Expanded(flex: 1, child: IconContainer3(Icons.search)),
      ],
    );
  }
}

// ignore: must_be_immutable
class IconContainer3 extends StatelessWidget {
  Color color;
  IconData icon;
  double size;
  IconContainer3(this.icon,
      {super.key, this.color = Colors.red, this.size = 50});

  @override
  Widget build(BuildContext context) {
    return Container(
      width: 100,
      height: 100,
      color: color,
      child: Center(
        child: Icon(
          icon,
          size: size,
          color: Colors.white,
        ),
      ),
    );
  }
}
//垂直布局
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return Column(//此行可以替换一下两行代码
    // return Flex(
    //   direction: Axis.vertical,

      children: [
        Expanded(
            flex: 2,
            child: IconContainer4(
              Icons.home,
              color: Colors.red,
            )),
        Expanded(
            flex: 1,
            child: IconContainer4(
              Icons.search,
              color: Colors.green,
            )),
        Expanded(
            flex: 3,
            child: IconContainer4(
              Icons.back_hand,
              color: Colors.orange,
            )),
      ],
    );
  }
}

// ignore: must_be_immutable
class IconContainer4 extends StatelessWidget {
  IconData icon;
  Color color;
  double size;

  IconContainer4(this.icon,
      {super.key, this.color = Colors.red, this.size = 30});

  @override
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      width: 100,
      color: color,
      child: Center(
        child: Icon(
          icon,
          size: size,
          color: Colors.white,
        ),
      ),
    );
  }
}
///混合布局
class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return ListView(
      padding: const EdgeInsets.all(10),
      children: [
        Container(
          width: double.infinity,
          height: 200,
          color: Colors.black,
        ),
        const SizedBox(height: 10),
        Row(
          children: [
            Expanded(
              flex: 2,
              child: SizedBox(
                height: 180,
                child: Image.network(
                    "https://www.itying.com/images/flutter/2.png",
                    fit: BoxFit.cover),
              ),
            ),
            const SizedBox(width: 10),
            Expanded(
                flex: 1,
                child: SizedBox(
                  height: 180,
                  child: Column(
                    children: [
                      Expanded(
                        flex: 1,
                        child: SizedBox(
                          width: double.infinity,
                          child: Image.network(
                              "https://www.itying.com/images/flutter/3.png",
                              fit: BoxFit.cover),
                        ),
                      ),
                      const SizedBox(height: 10),
                      Expanded(
                        flex: 2,
                        child: SizedBox(
                          width: double.infinity,
                          child: Image.network(
                              "https://www.itying.com/images/flutter/4.png",
                              fit: BoxFit.cover),
                        ),
                      )
                    ],
                  ),
                ))
          ],
        )
      ],
    );
  }
}
上一篇 下一篇

猜你喜欢

热点阅读