flutter布局详解及代码示例(上)

布局

基本布局

  • Row(水平布局):在水平(X轴)方向上排列子widget的列表。
  • Column(垂直布局):在垂直(Y轴)方向上排列子widget的列表。
  • Stack(可重叠布局):可以允许其子widget简单的堆叠(Z轴)在一起。
  • IndexedStack(单一显示可重叠布局):相比Stack后面编码的widget显示在Z轴上方,IndexedStack通过index可以控制显示哪个widget显示在Z轴的上方,注意,只显示一个。
  • ListView(滚动列表):最常用的滚动widget。

Row

  • 不带滚动属性,如果超出约束范围,在debug版本下会提示溢出。

代码

Row(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[new Text('1'),new Text('2'),new Text('3'),],
)

常用参数

mainAxisAlignment
  • X轴方向上的对齐方式
  • spaceBetween:沿X轴方向均分,子widget之间的空白区域相等,两侧贴边,比如只有两个子widget就在两边,三个就左中右这样。
  • spaceAround:沿X轴方向均分,左右两侧不贴边,有空白区域,但空白区域是子widget之间的空白区域的1/2。
  • spaceEvenly:沿X轴方向均分,左右两侧不贴边,有空白区域,空白区域和子widget之间的空白区域大小一致。
crossAxisAlignment
  • Y轴方向上的对齐方式
  • stretch:让子widget充满Y轴。
  • baseline:在Y轴上和基线适配,搭配textBaseline用
textBaseline
  • 文本内容的基线类型,就是文本的水平边界线,注意,只有水平
  • alphabetic:以字母字符底部的水平线对齐(不论中英文,都是用文字的最底部对齐)
  • ideographic:以表意字符的水平线对齐。(英文如pgj这些底部会比中文矮一些)
mainAxisSize
  • X轴方向应占用多少空间,默认最大化的占用主轴空间。
  • 若为MainAxisSize.min,则mainAxisAlignment只能为start。
verticalDirection
  • 垂直方向上的排列顺序
  • up:子widget从bottom开始往top排列;
  • down:子widget从top开始往bottom排列。
  • 搭配crossAxisAlignment的start和end属性有如下不同:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
textDirection
  • 与verticalDirection类似,水平方向上的排列顺序
  • ltr:left to right,从左到右排列;
  • rtl:rigth to left,从右到左排列;
  • 同verticalDirection类似,搭配mainAxisAlignment使用,如下:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Column

  • 不带滚动属性,如果超出约束范围,在debug版本下会提示溢出。

代码

Column(crossAxisAlignment: CrossAxisAlignment.start,children: <Widget>[new Text('1'),new Text('2'),new Text('3'),],
)

常用参数

mainAxisAlignment
  • Y轴方向上的对齐方式
  • spaceBetween:沿Y轴方向均分,子widget之间的空白区域相等,比如只有两个子widget就在上下,三个就上中下这样。
  • spaceAround:沿Y轴方向均分,上下两侧不贴边,有空白区域,但空白区域是子widget之间的空白区域的1/2。
    • spaceEvenly:沿Y轴方向均分,上下两侧不贴边,有空白区域,空白区域和子widget之间的空白区域大小一致。
crossAxisAlignment
  • X轴方向上的对齐方式
  • stretch:让子widget充满X轴。
  • baseline:相当于start,因为textBaseline只有水平,因为没有文字是需要人歪头90度看的。
mainAxisSize
  • Y轴方向应占用多少空间,默认最大化的占用主轴空间。
  • 若为MainAxisSize.min,则mainAxisAlignment只能为start。
verticalDirection
  • 垂直方向上的排列顺序
  • up:子widget从bottom开始往top排列;
  • down:子widget从top开始往bottom排列。
  • 搭配mainAxisAlignment的start和end属性有如下不同:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
textDirection
  • 与verticalDirection类似,水平方向上的排列顺序
  • ltr:left to right,从左到右排列;
  • rtl:rigth to left,从右到左排列;
  • 同verticalDirection类似,搭配crossAxisAlignment使用,如下:
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Stack

  • 可以子widget无视位置压在另一个子widget的布局
  • 内部使用Positioned定位子widget位置宽高
    • width,left和right三个属性不能同时使用,必须至少有一个属性是null;
    • height,top和bottom三个属性不能同时使用,必须至少有一个属性是null。

代码

Stack(alignment: Alignment(-1.0,0.0),//等价于Alignment.centerLeftchildren: <Widget>[Positioned(child: Container(width: 100.0,height: 100.0,color: Colors.red,),),Positioned(child: Container(width: 90.0,height: 90.0,color: Colors.green,),),Positioned(child: Container(width: 80.0,height: 80.0,color: Colors.blue,),),new Text('-1,0\ncenterLeft',textAlign: TextAlign.left,),],
)

完整示例

Container(width: 200,height: 200,child: Stack(children: <Widget>[Positioned(// 若是不指定位置就是(0,0)// 若是不指定size就是子view的size// top: 50.0,// left: 50.0,child: Container(width: 200,height: 200,),),Positioned(top: 0.0,left: 190.0,child: Container(width: 10.0,height: 10.0,color: Colors.green,),),],),
);

常用参数

alignment
  • 可以传递AlignmentDirectional、Alignment、FractionalOffset三大类,主要用的是带方向的AlignmentDirectional。
textDirection
  • 搭配AlignmentDirectional的start或者end实现类似Row的mainAxisAlignment+textDirection的效果。
fit
  • loose:从Stack传递过来的约束被解除,即:
    • 当Stack大小被限制为300*400,子widget元素的大小将可设置为,宽:0到300,高:0到400。
  • expand:从Stack传递过来的约束被锁定到最大,即:
    • 当Stack大小被限制为300*400,子widget元素的大小将锁定为,宽:300,高:400。
  • passthrough:不改变子组件约束条件。和loose一致。
overflow
  • 是否裁剪溢出的子widget元素
  • clip:裁剪溢出部分
  • visible:显示溢出部分

IndexedStack

  • 相比Stack多了一个index参数,控制显示哪个子widget
  • 内部使用Positioned定位子widget位置宽高
    • width,left和right三个属性不能同时使用,必须至少有一个属性是null;
    • height,top和bottom三个属性不能同时使用,必须至少有一个属性是null。

代码

IndexedStack(sizing: StackFit.expand,index: 1,children: <Widget>[Positioned(child: Container(width: 100.0,height: 100.0,color: Colors.red,),),Positioned(child: Container(width: 130.0,height: 90.0,color: Colors.green,),),Positioned(child: Container(width: 80.0,height: 120.0,color: Colors.blue,),),],
),

index就是children的length的区间之中的值。
比如上面的代码,就只显示index为1的子widget,也就是第二个。

常用参数
  • 因为只显示一个,所以Stack的常用参数基本用不到

ListView

    • listview需要拓展长度,比如是纵向的listview,就需要指定父view的height。
  • 可以理解为可以滚动的Column。
  • 有四种构造方式
    • List():默认构造;
      • 直接把子widget硬编码,如果子widget较多,有性能风险。
    • ListView.builder();
      • 不带分割线
      • 懒加载,只会渲染可见的条目。
    • ListView.separated;
      • 带分割线
      • separatorBuilder是必传参数,用于构造分割线view
      • 分割线返回的是一个widget(不必一定是Divider),所以可以自定义
    • ListView.custom。
      • 搭配SliverChildBuilderDelegate自定义实现不同类型子widget,比如子widget和分割线交替出现等复杂场景。

代码

/// 默认构造
ListView(children: [ new Text('1'),Divider(),new Text('2'),Divider(),new Text('3'),Divider(),],
),
/// ListView.builder()构造
final List<String> name = <String>['1','2','3',];
ListView.builder(itemCount: name.length,itemBuilder: (context, index) {return Text(name[index]);},
),
/// ListView.separated()构造
ListView.separated(itemBuilder: (context, index) {return Text(name[index]);},separatorBuilder: (context, index) {return Divider();//分割线},itemCount: name.length,
),
/// ListView.custom()
ListView.custom(childrenDelegate: SliverChildBuilderDelegate((context, index) {return Text(name[index]);},childCount: name.length,),
),

详细代码

var lv1 = ListView(//主轴滚动方向:垂直vertical,竖直horizontal ,默认为垂直vertical,scrollDirection: Axis.vertical,//是否反向 默认为false,正常顺序从起始点开始正序,true为从末尾开始排列reverse: false,//滚动控制器,默认为nullcontroller:null,//是否强制滚动(顶部或底部时是否可以滚动),默认是false,如果为true,Controller必须为nullprimary: false,//视图如何响应用户的手势滑动,有内置实现强制可以滚动 const AlwaysScrollableScrollPhysics();和强制不可以滚动const ScrollPhysics(),可忽略primary属性physics: const AlwaysScrollableScrollPhysics(),//默认为false,滚动视图在[滚动方向]中的范围是否应由正在查看的内容决定。shrinkWrap: true,//item的padding值padding: const EdgeInsets.all(10.0),//item交叉轴方向的大小,默认自适应,vertical时为高度,horizontal时为高度itemExtent: 50.0,//是否自动保存滑出屏幕外的字widget的状态,保证widget不被回收,可复用,false的手动保存。默认为trueaddAutomaticKeepAlives: true,//是否放置到重绘列表中,复杂widget可提高性能,默认为trueaddRepaintBoundaries: true,//缓存区大小,默认为250cacheExtent: 250.0,//默认构造函数中特有,直接将子widget放置内,一次性渲染完成,适合少量数据children: [new Text('测试1'),Divider(),new Text('测试2'),Divider(),new Text('测试3'),Divider(),new Text('测试4'),Divider(),new Text('测试5'),Divider(),],
);

每个item不同的listview

  • 用switch-case返回不同的item来实现不同的item的view
import 'package:flutter/material.dart';class MyListPage extends StatelessWidget {final List<Item> itemList = [Item(type: ItemType.button, data: ['Button 1', 'Button 2']),Item(type: ItemType.text, data: 'Hello World'),Item(type: ItemType.image,data: 'https://example.com/images/image.jpg'),];@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('My List Page'),),body: ListView.builder(itemCount: itemList.length,itemBuilder: (BuildContext context, int index) {Item item = itemList[index];Widget itemWidget;// 根据item类型构建不同的widgetswitch (item.type) {case ItemType.button:List<String> buttonTexts = item.data;itemWidget = Row(children: [ElevatedButton(onPressed: () {},child: Text(buttonTexts[0]),),ElevatedButton(onPressed: () {},child: Text(buttonTexts[1]),),],);break;case ItemType.text:String textData = item.data;itemWidget = Text(textData);break;case ItemType.image:String imageUrl = item.data;itemWidget = Image.network(imageUrl);break;}return ListTile(title: itemWidget,);},),);}
}class Item {final ItemType type;final dynamic data;Item({required this.type,required this.data,});
}enum ItemType {button,text,image,
}

垂直滑动里嵌套水平滑动

class _PageBizCertificateState extends eState<PageBizCertificate> {final List<String> items = List.generate(20, (index) => 'Item $index');@overrideWidget pageBody(BuildContext context) {return ListView.builder(itemCount: items.length,itemBuilder: (context, index) {return MyListItem(title: items[index]);},);}Widget MyListItem({required String title}) {return Container(padding: EdgeInsets.all(16.0),child: Column(crossAxisAlignment: CrossAxisAlignment.start,children: [Text('第一行文本'),SizedBox(height: 8.0),MyHorizontalScrollList(),SizedBox(height: 8.0),Text('第三行文本'),],),);}Widget MyHorizontalScrollList() {return Container(height: 100.0,child: ListView.builder(scrollDirection: Axis.horizontal,itemCount: 10,itemBuilder: (context, index) {return Container(width: 100.0,margin: EdgeInsets.all(4.0),color: Colors.blue,child: Center(child: Text('水平项 $index'),),);},),);}}

参数列表

  • scrollDirection:主轴滚动方向;默认垂直滚动Axis.vertical,还可水平滚动Axis.horizontal
  • reverse:是否反向排列,默认false,即正序排列
  • controller:滚动控制器,默认为null
  • primary:是否强制滚动,默认false
  • physics:响应用户滑动。
    • NeverScrollableScrollPhysics(), // 禁止滑动
  • shrinkWrap:滚动视图在滚动方向中的范围是否应由正在查看的内容决定。默认为false
  • padding:距边框item边间距
  • cacheExtent:缓存大小,默认250.0
  • itemExtent:item在交叉轴方向上的长度;null时为自适应
  • addAutomaticKeepAlives:是否自动保存滑出屏幕外的字widget的状态,默认true,保存,可复用
  • addRepaintBoundaries:是否放置到重绘列表中;默认true,可提高性能
  • itemBuilder:builder和separated构造函数特有要传入参数,定义item的样式
  • separatorBuilder:separated构造函数特有要传入的参数,定义分割线的样式
  • itemCount:列表可滚动的item数量,默认构造没有
  • childrenDelegate:内部都是靠此类实现滚动和布局,但只有custom构造函数需要传入,其余都内部实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/175564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有一种浪漫,叫接触Linux

大家好&#xff0c;我是五月。 嵌入式开发 嵌入式开发产品必须依赖硬件和软件。 硬件一般使用51单片机&#xff0c;STM32、ARM&#xff0c;做成的产品以平板&#xff0c;手机&#xff0c;智能机器人&#xff0c;智能小车居多。 软件用的当然是以linux系统为蓝本&#xff0c…

顺子日期(14)

顺着日期 public class Main {public static void main(String[] args) {int res 0;//2022年int[] days new int[] {31,28,31,30,31,30,31,31,30,31,30,31};//31,28,31,30,31,30,31,31,30,31,30,31//一三五七八十腊//构造2022年每一天的日期yyyymmddStringBuffer date new…

【计算机网络笔记】ARP协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

3D点云目标检测:VoxelNex解读(带源码/未完)

VoxelNext 通用vsVoxelNext一、3D稀疏卷积模块1.1、额外的两次下采样1.2、稀疏体素删减 二、高度压缩三、稀疏池化四、head五、waymo数据集训练六、训练自己的数据集bug修改 通用vsVoxelNext 一、3D稀疏卷积模块 1.1、额外的两次下采样 使用通用的3D sparse conv&#xff0c;…

window关于下载anaconda 2023年以后的版本,jupyter notebook闪退,没有内核的问题

这种问题的解决办法&#xff1a; 下载anaconda较早版本&#xff0c;比如我下载的是&#xff1a;2022年5月的版本。 下载之后&#xff0c;打开jupyter好像也会没有内核和闪退。 下面解决步骤&#xff1a; 1.注意&#xff1a;打开anaconda powershell prompt 2.重点来了&#xf…

【GO】k8s 管理系统项目16[前端部分--项目初始化]-学习记录

学习链接 https://blog.csdn.net/qq_29974229/article/details/129119279?spm1001.2014.3001.5502 nvm use v16.15.0 npm install vue -g npm install -g vue/clivue create k8s-plantform-fe选择 Default cd k8s-plantform-fe npm run servecd ./src mkdir views mkdir r…

Java-认识异常

本章重点&#xff1a; 1. 异常概念与体系结构 2. 异常的处理方式 3. 异常的处理流程 4. 自定义异常类 1. 异常的概念与体系结构 1.1 异常的概念 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算术异常 2. 数组…

Python网络爬虫练习

爬取历年中国大学排名(前20名)&#xff0c;并随机选取一所高校画图展示其历年总分变化,并计算平均分&#xff0c;在图上展示该平均分直线&#xff1a; 代码如下&#xff1a; import matplotlib.pyplot as plt import pandas as pd import requests import randomdef main(yea…

普乐蛙绵阳科博会一场VR科普航天科学盛宴科普知识

普乐蛙绵阳科普展&#xff1a;一场科学盛宴&#xff0c;点燃孩子探索欲望的火花! 普乐蛙绵阳科普展正在如火如荼地进行中&#xff0c;吸引了无数孩子和家长的热情参与。这场科普盛宴以独特的内外视角&#xff0c;让人们感受到科学的魅力&#xff0c;激发了孩子们对知识的渴望和…

【挑战业余一周拿证】二、在云中计算 - 第 3 节 - Amazon EC2 定价

目录 第 3 节 - Amazon EC2 定价 一、按需 适用场景 二、Savings Plans 适用场景 三、预留实例 三种付款模式 四、Spot 实例 适用场景 五、专用主机 适用场景 关注订阅号 首页&#xff1a;【挑战业余一周拿证】AWS 认证云从业者 - 基础 课程目录&#xff1a;【挑…

【阅读记录】《联邦学习》杨强

第2章 隐私、安全及机器学习 2.3 威胁与安全模型 2.3.1 隐私威胁模型 对机器学习系统的攻击可能在任何阶段发生&#xff0c;包括数据发布、模型训练和模型推理。 模型训练阶段&#xff1a;重构攻击&#xff08;避免使用寻存储显式特征值的模型&#xff0c;SVM KNN等&…

深度学习之循环神经网络

视频链接&#xff1a;6 循环神经网络_哔哩哔哩_bilibili 给神经网络增加记忆能力 对全连接层而言&#xff0c;输入输出的维数固定&#xff0c;因此无法处理序列信息 对卷积层而言&#xff0c;因为卷积核的参数是共享的&#xff0c;所以卷积操作与序列的长度无关。但是因为卷积…

人工智能与供应链行业融合:预测算法的通用化与实战化

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 让我们一起深入探索人工智能与供应链的融合&#xff0c;以及预测算法在实际应用中的价值&#xff01;&#x1f50d;&#x1f680; 文章目录 前言供应链预测算法的基本流程统计学习模型与机…

【亚马逊云】基于EC2以 All-in-One 模式快速部署 KubeSphere 和 Kubernetes

文章目录 1. 云实例配置说明2. SSH连接云实例3. 查看系统版本4. 修改主机名5. 安装依赖项6. 安全组和DNS修改7. 下载KubeKey8. 同时安装Kubesphere和Kubernetes[可选]单独安装Kubernetes[可选]单独安装KubeSphere9. 验证KubeSphere安装结果10. 登录KubeSphere控制台[可选]安装K…

C/C++字节对齐

C/C字节对齐 C/C字节对齐1.G_PACKED2.1 pack(push)2.2 pack(1) 全部例子 C/C字节对齐 1.G_PACKED #ifdef __GNUC__#define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed)) #else#define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Decla…

sqli-labs靶场详解(less11-less16)

目录 less-11 less-12 less-13 less-14 less-15 less-16 提交参数后 动态参数不存在url中 存在于post表单中 于是在表单中进行注入点测试 先看一看这种提交数据的关卡输入提交后会有什么反应 unameadmin&passwdadmin&submitSubmit 输出 usernameadmin passwordadmin un…

seata集成springboot的一些错误小计

1 seata依赖没找到 dependencies.dependency.version for com.alibaba.cloud:spring-cloud-starter-alibaba-seata:jar is missing. line 126, column 21错误原因:未指定具体的seata版本 解决 <!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-st…

稳定视频扩散数据管理解密【stable video diffusion】

Stability AI 最近于 2023 年 11 月 21 日推出了其最新模型—稳定视频扩散&#xff08;SVD&#xff09;。视频生成模型的这一突破取决于数据管理的关键作用。 除了模型检查点之外&#xff0c;他们还发布了一份技术报告。 让我们在 Stability AI 的技术报告和一些引人注目的示例…

js的数组去重方法

目录 es6数组中对象去重 1. filter()用法 2. findIndex()用法 3. 去重 其他方法&#xff1a; 方法二&#xff1a;reduce()去重 1. reduce()用法 1.1 找出字符长度最长的数组成员。 1.2 扁平化二维数组 1.3 扁平化多维数组 三、总结方案&#xff1a; 使用Set&#xf…

k8s-deployment控制器 5

K8s控制器是Kubernetes&#xff08;简称k8s&#xff09;系统中一个重要的组成部分&#xff0c;它是一个管理Pod的中间层&#xff0c;可以创建和管理多个Pod副本&#xff0c;确保它们按照预定的数量和行为进行运行。 通过编写yaml文件将信息全部存到etcd中&#xff0c;控制器通…