当前位置: 首页 > news >正文

【Flutter】页面布局:线性布局(Row 和 Column)

在 Flutter 中,布局(Layout)是应用开发的核心之一。通过布局组件,开发者可以定义应用中的控件如何在屏幕上排列。RowColumn 是 Flutter 中最常用的两种线性布局方式,用于水平和垂直排列子组件。在本教程中,我们将详细介绍这两个布局组件的用法,并通过实例帮助理解如何使用它们来构建灵活、响应式的用户界面。

线性布局简介

线性布局是指组件按一定方向依次排列,方向可以是水平(Row)或者垂直(Column)。在 Flutter 中,Row 用于水平排列,Column 用于垂直排列。它们都可以包含多个子组件,按照一定规则依次布局。

RowColumn 的基本属性:

  • children: 这是它们最主要的属性,用于指定要排列的子组件,通常是一个 Widget 的列表(List<Widget>)。
  • mainAxisAlignment: 控制主轴(Row 的主轴是水平轴,Column 的主轴是垂直轴)上的对齐方式。
  • crossAxisAlignment: 控制交叉轴(Row 的交叉轴是垂直轴,Column 的交叉轴是水平轴)上的对齐方式。
  • mainAxisSize: 决定主轴的尺寸大小,是占满可用空间还是仅包裹内容。

Row:水平布局

Row 是一个水平方向的布局组件,它允许子组件在水平轴上依次排列。通过 Row,你可以很容易地实现按钮栏、图标栏等常见的水平布局场景。

Row 基本示例

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Row 示例')),body: Row(children: <Widget>[Icon(Icons.home, size: 40, color: Colors.blue),Icon(Icons.favorite, size: 40, color: Colors.red),Icon(Icons.settings, size: 40, color: Colors.green),],),),);}
}

在这个例子中,Row 组件水平排列了三个图标。Row 中的 children 属性是一个 List<Widget>,每个子组件会按顺序从左到右进行排列。

Row 主要属性详解

  1. mainAxisAlignment
    控制子组件在主轴(水平方向)上的对齐方式。mainAxisAlignment 提供了几种常用的对齐方式:

    • MainAxisAlignment.start: 子组件从主轴起始位置排列(默认)。
    • MainAxisAlignment.end: 子组件从主轴结束位置排列。
    • MainAxisAlignment.center: 子组件在主轴上居中排列。
    • MainAxisAlignment.spaceBetween: 子组件在主轴上平均分布,首尾组件紧贴两端,中间均匀间隔。
    • MainAxisAlignment.spaceAround: 子组件在主轴上均匀分布,每个组件两侧有相同的间距。
    • MainAxisAlignment.spaceEvenly: 子组件均匀分布,子组件之间以及两端的间距都相同。

    示例

    Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[Icon(Icons.home, size: 40),Icon(Icons.favorite, size: 40),Icon(Icons.settings, size: 40),],
    )
    
  2. crossAxisAlignment
    控制子组件在交叉轴(垂直方向)上的对齐方式:

    • CrossAxisAlignment.start: 子组件在交叉轴起始位置对齐。
    • CrossAxisAlignment.end: 子组件在交叉轴结束位置对齐。
    • CrossAxisAlignment.center: 子组件在交叉轴上居中对齐(默认)。
    • CrossAxisAlignment.stretch: 拉伸子组件以占满交叉轴。

    示例

    Row(crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[Icon(Icons.home, size: 40),Icon(Icons.favorite, size: 60),Icon(Icons.settings, size: 40),],
    )
    
  3. mainAxisSize
    控制 Row 在主轴方向的尺寸大小,默认是 MainAxisSize.max,即尽可能占用主轴的全部空间。如果只想让 Row 根据子组件的宽度进行调整,可以设置为 MainAxisSize.min

    示例

    Row(mainAxisSize: MainAxisSize.min,children: <Widget>[Icon(Icons.home, size: 40),Icon(Icons.favorite, size: 40),Icon(Icons.settings, size: 40),],
    )
    

Column:垂直布局

Row 类似,Column 用于将子组件按垂直方向排列。它适用于需要将多个组件上下堆叠的场景,例如表单、列表项等。

Column 基本示例

import 'package:flutter/material.dart';void main() {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(home: Scaffold(appBar: AppBar(title: Text('Column 示例')),body: Column(children: <Widget>[Text('Flutter', style: TextStyle(fontSize: 24)),Icon(Icons.favorite, size: 50, color: Colors.red),Text('Dart', style: TextStyle(fontSize: 24)),],),),);}
}

在此示例中,Column 将三个子组件按垂直方向依次排列。与 Row 类似,Column 也有一些控制排列和对齐的属性。

Column 主要属性详解

  1. mainAxisAlignment
    控制子组件在主轴(垂直方向)上的对齐方式,属性和 Row 中的 mainAxisAlignment 用法相同。

    示例

    Column(mainAxisAlignment: MainAxisAlignment.spaceAround,children: <Widget>[Text('上方文本', style: TextStyle(fontSize: 24)),Icon(Icons.favorite, size: 50),Text('下方文本', style: TextStyle(fontSize: 24)),],
    )
    
  2. crossAxisAlignment
    控制子组件在交叉轴(水平方向)上的对齐方式,属性与 Row 中的 crossAxisAlignment 类似。

    示例

    Column(crossAxisAlignment: CrossAxisAlignment.center,children: <Widget>[Text('文本1', style: TextStyle(fontSize: 24)),Text('文本2', style: TextStyle(fontSize: 24)),],
    )
    
  3. mainAxisSize
    控制 Column 在主轴方向的尺寸大小,默认是 MainAxisSize.max,即尽可能占用垂直方向的全部空间。如果只想让 Column 根据子组件的高度进行调整,可以设置为 MainAxisSize.min

    示例

    Column(mainAxisSize: MainAxisSize.min,children: <Widget>[Text('文本1', style: TextStyle(fontSize: 24)),Text('文本2', style: TextStyle(fontSize: 24)),],
    )
    

使用 Expanded 调整布局

Expanded 是一个非常实用的组件,它可以让某个子组件在主轴方向上占据尽可能多的空间。在 RowColumn 布局中,使用 Expanded 可以灵活调整子组件的大小和占比。

示例:使用 Expanded

Row(children: <Widget>[Expanded(child: Container(color: Colors.red,height: 50,),),Container(color: Colors.green,width: 100,height: 50,),],
)

在这个示例中,Expanded 让第一个子组件(红色容器)在 Row 的水平方向上占据尽可能多的空间,而第二个子组件(绿色容器)固定宽度为 100 像素。

RowColumn 组合使用

在实际开发中,你经常需要将 `

RowColumn组合使用来创建复杂的布局结构。通过将RowColumn` 嵌套在一起,可以轻松构建出网格布局、表单布局等复杂界面。

示例:嵌套使用 RowColumn

Column(children: <Widget>[Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[Icon(Icons.home, size: 40),Icon(Icons.favorite, size: 40),Icon(Icons.settings, size: 40),],),Row(mainAxisAlignment: MainAxisAlignment.spaceEvenly,children: <Widget>[Text('Home'),Text('Favorite'),Text('Settings'),],),],
)

这个示例展示了如何将 RowColumn 组合使用,一个 Row 中放置了图标,另一个 Row 中放置了对应的文本。

总结

RowColumn 是 Flutter 中最基础、最常用的布局组件,它们分别用于水平和垂直排列子组件。通过合理地使用这些线性布局组件,并结合属性如 mainAxisAlignmentcrossAxisAlignmentExpanded,开发者可以轻松构建出灵活、响应式的用户界面。

掌握 RowColumn 的使用技巧,是 Flutter 布局系统中非常重要的一部分。在后续的开发中,随着需求的复杂化,线性布局通常会与其他布局组件如 StackFlex 等组合使用,构建出更加复杂的界面。

相关文章:

【Flutter】页面布局:线性布局(Row 和 Column)

在 Flutter 中&#xff0c;布局&#xff08;Layout&#xff09;是应用开发的核心之一。通过布局组件&#xff0c;开发者可以定义应用中的控件如何在屏幕上排列。Row 和 Column 是 Flutter 中最常用的两种线性布局方式&#xff0c;用于水平和垂直排列子组件。在本教程中&#xf…...

C语言巨难题:执行操作可获得的最大总奖励 I(C语言版)

1.题目&#xff1a; 给你一个整数数组 rewardValues&#xff0c;长度为 n&#xff0c;代表奖励的值。 最初&#xff0c;你的总奖励 x 为 0&#xff0c;所有下标都是 未标记 的。你可以执行以下操作 任意次 &#xff1a; 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。如果…...

【力扣】GO解决子序列相关问题

文章目录 一、引言二、动态规划方法论深度提炼子序列问题的通用解法模式 三、通用方法论应用示例&#xff1a;最长递增子序列&#xff08;LeetCode题目300&#xff09;Go 语言代码实现 四、最长连续递增序列&#xff08;LeetCode题目674&#xff09;Go 语言代码实现 五、最长重…...

Ubuntu20.04安装VM tools并实现主机和虚拟机之间文件夹共享

1、Ubuntu20.04安装VM tools 参考这个&#xff0c;很详细&#xff1a;Ubuntu 20.04 安装 VMwareTools 教程 2、实现主机与VMware虚拟机共享文件夹 设置共享文件夹参考&#xff1a;windows和虚拟机互传文件的三种方式 挂载操作参考&#xff1a;主机与VMware虚拟机共享文件夹&…...

Linux 学习笔记(十七)—— 文件系统

终极目标&#xff1a;理解 inode 和 软硬连接&#xff1b; 文件系统&#xff1a;Ext2; 文件 文件内容 文件属性; ——> 磁盘上存储的文件 存储的文件内容 存储的文件属性&#xff1b; Linux系统中&#xff1a;文件内容使用数据块存储&#xff0c;文件属性使用inode(固定…...

【计算机网络 - 基础问题】每日 3 题(五十八)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…...

Netty入门基础:IO模型中BIO\NIO概念及区别【附演示代码】

文章目录 &#x1f600;BIO&#x1f4a2;实战demo &#x1f308;NIO&#x1f3cd;Buffer核心属性核心方法 &#x1f397;Channel&#x1f388;Selector核心方法 &#x1f9e8;实战demo &#x1f3a8;粘包与半包 &#x1f600;BIO 传统IO模型&#xff0c;同步阻塞&#xff0c;每…...

vue2 使用环境变量

一. 在根目录下创建.env.xxx文件 .env 基础系统变量&#xff0c;无论何种环境&#xff0c;都可使用其中配置的值&#xff0c;其他环境中的变量会覆盖.env中的同名变量。 .env.development 开发环境 .env.production 生产环境 .env.staging 测试环境 二. 内容格式 vue2 使用是以…...

数据预处理

继续提取代码片段&#xff1a; 12. **导入iris数据集并查看前5行数据**&#xff1a; python from sklearn.datasets import load_iris iris load_iris() X iris.data print(iris数据集的维度为:, X.shape) print(iris数据集的前5行数据为:\n, X[:5]) …...

django宠物领养管理系统-计算机毕业设计源码26858

目录 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 系统总体设计 3…...

使用TeamViewer远程局域网内的两台电脑

有个场景&#xff0c;有人还不知道TV可以局域网操作&#xff0c;记录一下。 主要就是修改设置&#xff0c;将取消激活改为接受 然后输入受控端的ip即可...

GUI简介、Swing的常用组件、java程序的运行过程、class文件、JAR、runable_jar、双括号初始化

GUI简介 GUI&#xff1a;图形用户界面&#xff0c;在计算机中采用图形的方式显示用户界面 java的GUI开发 AWT&#xff1a;java最早推出的GUI编程开发包&#xff0c;界面风格跟随操作系统SWT&#xff1a;eclipse就是java使用SWT开发的Swing&#xff1a;在AWT的基础上扩充了功能…...

@Autowired和@Resource和getBean()区别

今天遇到一个对我来说很奇葩的错误&#xff0c;我想在Service中注入bean&#xff0c;我这里使用了Autowired和Resource都不能注入&#xff0c;导致初始化失败&#xff0c;使用了getBean()方法就可以注入。从来没有遇到过这个问题。后来我查询了一下&#xff0c;才明白了原理。我…...

Merlion笔记(四):添加一个新的预测模型

文章目录 1 模型配置类2 模型类3 运行模型&#xff1a;一个简单的例子4 可视化5 定量评估6 定义一个基于预测器的异常检测器 本文提供了一个示例&#xff0c;展示如何向 Merlion 添加一个新的预测模型,遵循 CONTRIBUTING.md 中的说明。建议在阅读本篇文章之前&#xff0c;先查…...

【论文阅读】ESRGAN

学习资料 论文题目&#xff1a;增强型超分辨率生成对抗网络&#xff08;ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks&#xff09;论文地址&#xff1a;[1809.00219] ESRGAN&#xff1a;增强型超分辨率生成对抗网络代码&#xff1a;xinntao / ESRGAN&am…...

电脑异常情况总结

文章目录 笔记本无症状息屏黑屏 笔记本无症状息屏黑屏 &#x1f34e; 问题描述&#xff1a; 息屏导致黑屏&#xff1b;依次操作计算机--》右键--》管理--》事件查看器--》Windows日志--》系统&#xff1b;从息屏到异常黑屏之间出现了很多错误&#xff0c;如下&#xff1a;事件…...

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…...

PL/I语言的起源?有C语言,有B语言和A语言吗?为什么shell脚本最开始可能有#!/bin/bash字样?为什么不支持嵌套注释?

PL/I语言的起源 在20世纪50~60年代&#xff0c;当时主流的编程语言是COBOL/FORTRAN/ALGOL等&#xff0c;IBM想要设计一门通用的编程语言&#xff0c;已有的编程语言无法实现此要求&#xff0c;故想要设计一门新语言&#xff0c;即是PL/I. PL/I是Programming Language/One的缩写…...

gin入门教程(3):创建第一个 HTTP 服务器

首先设置golang github代理&#xff0c;可解决拉取git包的时候&#xff0c;无法拉取的问题&#xff1a; export GOPROXYhttps://goproxy.io再查看自己的go版本&#xff1a; go version我这里的版本是&#xff1a;go1.23.2 linux/arm64 准备工作做好之后就可以进行开发了 3.…...

Vue+ECharts+iView实现大数据可视化大屏模板

Vue数据可视化 三个大屏模板 样式还是比较全的 包括世界地图、中国地图、canvas转盘等 项目演示&#xff1a; 视频&#xff1a; vue大数据可视化大屏模板...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...