IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> flutter学习(6)常见布局组件 -> 正文阅读

[移动开发]flutter学习(6)常见布局组件

flutter学习(6)常见布局组件

一.Padding组件

在html 中常见的布局标签都有padding 属性,但是Flutter 中很多Widget 是没有padding 属性。这个时候我们可以把那些组件设置为Padding组件的子组件,用Padding 组件的padding 属性来处理容器与子元素直接的间距

Padding组件属性

image-20220220100936752

padding属性是Padding组件和它的子组件之间的距离

demo

import 'package:flutter/material.dart';
import './res/listData.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
            appBar: AppBar(title: Text('Flutter列表')), body: LayoutDemo()));
  }
}

class LayoutDemo extends StatelessWidget {
  const LayoutDemo({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // return Container();
    return Padding(
        padding: EdgeInsets.fromLTRB(0, 0, 10, 0),
        child: GridView.count(
          crossAxisCount: 2,
          childAspectRatio: 1.5,
          children: <Widget>[
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
              child: Image.network(
                  'https://www.itying.com/images/flutter/1.png',
                  fit: BoxFit.cover),
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
              child: Image.network(
                  'https://www.itying.com/images/flutter/2.png',
                  fit: BoxFit.cover),
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
              child: Image.network(
                  'https://www.itying.com/images/flutter/3.png',
                  fit: BoxFit.cover),
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
              child: Image.network(
                  'https://www.itying.com/images/flutter/4.png',
                  fit: BoxFit.cover),
            ),
            Padding(
              padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
              child: Image.network(
                  'https://www.itying.com/images/flutter/5.png',
                  fit: BoxFit.cover),
            ),
            Padding(
                padding: EdgeInsets.fromLTRB(10, 10, 0, 0),
                child: Image.network(
                    'https://www.itying.com/images/flutter/6.png',
                    fit: BoxFit.cover)),
          ],
        ));
  }
}

image-20220220102054226

二、Row 水平布局组件

Row组件属性

image-20220220113154961

image-20220301203708452

该截图来自:Flutter中MainAxisAlignment和CrossAxisAlignment详解

demo

先自定义一个按钮组件

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(title: Text('FlutterDemo')),
      body: LayoutDemo(),
    ));
  }
}

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return IconContainer(
      Icons.search,
      color: Colors.black,
    );
  }
}

//动态生成不同按钮组件
class IconContainer extends StatelessWidget {
  double? size;
  IconData icon;
  Color color = Colors.red; //默认
  //size 、color是可选参数
  IconContainer(this.icon, {this.size, required this.color}) {
    this.size = 32.0;
  }
  @override
  Widget build(BuildContext context) {
    return Container(
        width: this.size! + 60.0,
        height: this.size! + 60.0,
        color: this.color,
        child: Center(
            child: Icon(this.icon, size: this.size, color: Colors.white)));
  }
}

image-20220301201850775

使用Row布局

调用刚刚自定义的按钮组件

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return Row(
      mainAxisAlignment: MainAxisAlignment.center, //居中显示

      children: <Widget>[
        IconContainer(Icons.search, color: Colors.black),
        IconContainer(Icons.home, color: Colors.blueAccent),
        IconContainer(Icons.select_all, color: Colors.cyanAccent)
      ],
    );
  }
}
image-20220301202800290

image-20220301202515945

该截图来自:Flutter中MainAxisAlignment和CrossAxisAlignment详解

把Row布局放到Container里

把之前的mainAxisAlignment: MainAxisAlignment.center,给注释掉

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return Container(
        height: 400.0,
        width: 400.0,
        color: Colors.pink,
        child: Row(
          // mainAxisAlignment: MainAxisAlignment.center, //居中显示

          children: <Widget>[
            IconContainer(Icons.search, color: Colors.black),
            IconContainer(Icons.home, color: Colors.blueAccent),
            IconContainer(Icons.select_all, color: Colors.cyanAccent)
          ],
        ));
  }
}

效果如下:

image-20220301203601596

修改mainAxisAlignment和crossAxisAlignment的值:

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return Container(
        height: 400.0,
        width: 400.0,
        color: Colors.pink,
        child: Row(
          // mainAxisAlignment: MainAxisAlignment.center, //居中显示
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            IconContainer(Icons.search, color: Colors.black),
            IconContainer(Icons.home, color: Colors.blueAccent),
            IconContainer(Icons.select_all, color: Colors.cyanAccent)
          ],
        ));
  }
}

效果

image-20220301211300927

image-20220301211021976

该截图来自:Flutter中MainAxisAlignment和CrossAxisAlignment详解

三、Flutter Column 垂直布局组件

Column组件属性

image-20220302073336678

demo

把刚刚的Column组件换成Row

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return Container(
        height: 400.0,
        width: 400.0,
        color: Colors.pink,
        child: Column(
          // mainAxisAlignment: MainAxisAlignment.center, //居中显示
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            IconContainer(Icons.search, color: Colors.black),
            IconContainer(Icons.home, color: Colors.blueAccent),
            IconContainer(Icons.select_all, color: Colors.cyanAccent)
          ],
        ));
  }
}

效果:

image-20220301212436128

四、Flutter Expanded (类似Web 中的Flex 布局)

Expanded组件属性

image-20220302073227363

demo

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    //颜色是命名参数
    return Row(
      children: <Widget>[
        Expanded(
          flex: 1,
          child: IconContainer(Icons.search, color: Colors.blue),
        ),
        Expanded(
          flex: 1,
          child: IconContainer(Icons.search, color: Colors.blue),
        ),
      ],
    );
  }
}

//动态生成不同按钮组件
class IconContainer extends StatelessWidget {
  double? size;
  IconData icon;
  Color color = Colors.red; //默认
  //size 、color是可选参数
  IconContainer(this.icon, {this.size, required this.color}) {
    this.size = 32.0;
  }
  @override
  Widget build(BuildContext context) {
    return Container(
        width: this.size! + 60.0,
        height: this.size! + 60.0,
        color: this.color,
        child: Center(
            child: Icon(this.icon, size: this.size, color: Colors.white)));
  }
}

  • 效果

image-20220302073758369

  • 把flex分别改为2和3的效果:

    image-20220302074009945

  • 2 3 1

    class LayoutDemo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        //颜色是命名参数
        return Row(
          children: <Widget>[
            Expanded(
              flex: 2,
              child: IconContainer(Icons.search, color: Colors.blue),
            ),
            Expanded(
              flex: 3,
              child: IconContainer(Icons.search, color: Colors.orange),
            ),
            Expanded(
              flex: 1,
              child: IconContainer(Icons.search, color: Colors.red),
            ),
          ],
        );
      }
    }
    
    image-20220302074053094
  • 左侧固定宽度,右侧自适应

    
    class LayoutDemo extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        //颜色是命名参数
        return Row(
          children: <Widget>[
            IconContainer(Icons.search, color: Colors.blue),
            Expanded(
              flex: 3,
              child: IconContainer(Icons.search, color: Colors.orange),
            ),
            Expanded(
              flex: 1,
              child: IconContainer(Icons.search, color: Colors.red),
            ),
          ],
        );
      }
    }
    
    //动态生成不同按钮组件
    class IconContainer extends StatelessWidget {
      double? size;
      IconData icon;
      Color color = Colors.red; //默认
      //size 、color是可选参数
      IconContainer(this.icon, {this.size, required this.color}) {
        this.size = 32.0;
      }
      @override
      Widget build(BuildContext context) {
        return Container(
            width: this.size! + 60.0,
            height: this.size! + 60.0,
            color: this.color,
            child: Center(
                child: Icon(this.icon, size: this.size, color: Colors.white)));
      }
    }
    
    

五.例子

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        home: Scaffold(
      appBar: AppBar(title: Text('FlutterDemo')),
      body: LayoutDemo(),
    ));
  }
}

class LayoutDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Row(
          children: <Widget>[
            Expanded(
                child: Container(
              height: 180,
              color: Colors.black,
              child: Text('hello'),
            ))
          ],
        ),
        SizedBox(height: 10),
        Row(
          children: <Widget>[
            Expanded(
                flex: 2,
                child: Container(
                  height: 180,
                  child: Image.network(
                    "https://www.itying.com/images/flutter/1.png",
                    fit: BoxFit.cover,
                  ),
                )),
            SizedBox(width: 10),
            Expanded(
                flex: 1,
                child: Container(
                    height: 180,
                    child: ListView(
                      children: <Widget>[
                        Container(
                          height: 85,
                          child: Image.network(
                            "https://www.itying.com/images/flutter/2.png",
                            fit: BoxFit.cover,
                          ),
                        ),
                        SizedBox(height: 10),
                        Container(
                          height: 85,
                          child: Image.network(
                            "https://www.itying.com/images/flutter/3.png",
                            fit: BoxFit.cover,
                          ),
                        )
                      ],
                    )))
          ],
        )
      ],
    );
  }
}

image-20220303152623070

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:44:08  更:2022-03-04 15:46:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 17:40:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码