Flutter容器

news2024/11/18 19:34:10

内边距padding

class MyBody extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return Container(//为了可以看出内边距,将容器设置成红色
      color: Colors.red,
      child: Padding(
        padding: EdgeInsets.all(15),
        child: MyImage('https://raw.githubusercontent.com/think-ing/flutter_demo/master/images/a.jpg'),
      ),
    );
  }
}
 
 
//定义一个 公共类
class MyImage extends StatelessWidget {
  String imgUrl;
  MyImage(this.imgUrl);
  
  Widget build(BuildContext context) {
    return Container(
      height: 100,
      width: 100,
      child: Image.network(this.imgUrl,fit: BoxFit.cover,),
    );
  }
}

布局限制类容器

  • 布局限制类容器是用来限制子元素的,并不是用来限制自身的
body: ConstrainedBox(
	constraints: BoxConstraints. expandO.//编辑剩余空间
constraints: BoxConstraints(
	minWidth: double. infinity,
	minHeipht: 200,
	maxHeight: 300
),
child: Container(
	width: 1,
	color: Colors. red
)
)
);

装饰容器

  • DecoratedBox可以在其子组件绘制前后增加一些装饰,如背景、边框等。
body: DecoratedBox(decoration: BoxDecoration(
	gradient: LinearGradient (colors: [Colors. yellow, Colors. red]),
	borderRadius: BorderRadius. all(Radius. circular(3. 0)),
	boxShadow: [
		BoxShadow(
			color: Colors. black,
			offset: Offset(3, 3),
			blurRadigs: 4.0
		)
	]
),
child: FlatButton(onPressed: null, child: Text ('test button')))

在这里插入图片描述

  • BoxDecoration是DecoratedBox的子类:
BoxDecoration({
  Color color, //颜色
  DecorationImage image,//图片
  BoxBorder border, //边框
  BorderRadiusGeometry borderRadius, //圆角
  List<BoxShadow> boxShadow, //阴影,可以指定多个
  Gradient gradient, //渐变
  BlendMode backgroundBlendMode, //背景混合模式
  BoxShape shape = BoxShape.rectangle, //形状
})

变换transform

  • Transform可以在其子组件绘制时对其应用一些矩阵变换来实现一些特效。Matrix4是一个4D矩阵,通过它我们可以实现各种矩阵操作
Container(
  margin: const EdgeInsets.fromLTRB(20, 100, 20, 20),
  color: Colors.green,
  child: Transform(
    alignment: Alignment.bottomRight, //原点
    transform: Matrix4.skewY(0.5), //沿Y轴倾斜0.5弧度
    child: Container(
      padding: const EdgeInsets.all(10),
      color: Colors.brown,
      child: Text("Flutter NB"),
    ),
  ),
  width: 100,
  height: 50,
),

  • Transform.translate接收一个offset参数,可以在绘制时沿x、y轴对子组件平移指定的距离。
Text("平移"),
DecoratedBox(
  decoration: BoxDecoration(color: Colors.purple),
  child: Transform.translate(
    //原点为左上角  往右平移 50  往下平移10
    offset: Offset(50, 10),
    child: Text("谁是最可爱的人?"),
  ),
),

  • Transform.rotate可以对子组件进行旋转变换
Container(
  margin: const EdgeInsets.only(top: 50),
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      Text("旋转"),
      DecoratedBox(
        decoration: BoxDecoration(color: Colors.purple),
        child: Transform.rotate(
          angle: pi / 2,
          child: Text("是他是他就是他"),
        ),
      ),
    ],
  ),
),

  • Transform.scale可以对子组件进行缩小或放大
Container(
  margin: const EdgeInsets.only(left: 100, top: 50),
  child: Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      Text("缩放"),
      DecoratedBox(
        decoration: BoxDecoration(color: Colors.purple),
        child: Transform.scale(
          scale: 2, //放大2倍
          child: Text("大大泡泡糖"),
        ),
      ),
    ],
  ),
),

Container

  • 是flutter里面一个很重要的容器,相当于html中的div
    属性:
  1. key:Container唯一标识符,用于查找更新。
  2. alignment:控制child的对齐方式,如果container或者container父节点尺寸大于child的尺寸,这个属性设置会起作用,有很多种对齐方式。
  3. padding:decoration内部的空白区域,如果有child的话,child位于padding内部。padding与margin的不同之处在于,padding是包含在content内,而margin则是外部边界,设置点击事件的话,padding区域会响应,而margin区域不会响应。
  4. color:用来设置container背景色,如果foregroundDecoration设置的话,可能会遮盖color效果。
  5. decoration:绘制在child后面的装饰,设置了decoration的话,就不能设置color属性,否则会报错,此时应该在decoration中进行颜色的设置。
  6. foregroundDecoration:绘制在child前面的装饰。
  7. width:container的宽度,设置为double.infinity可以强制在宽度上撑满,不设置,则根据child和父节点两者一起布局。
  8. height:container的高度,设置为double.infinity可以强制在高度上撑满。
  9. constraints:添加到child上额外的约束条件。
  10. margin:围绕在decoration和child之外的空白区域,不属于内容区域。
  11. transform:设置container的变换矩阵,类型为Matrix4。
  12. child:container中的内容widget。
    在这里插入图片描述

可滚动widgets

  • 在Flutter中, 当内容超过显示视图时,如果没有特殊处理,Flutter则会提示Overflow错误
  • Flutter提供了多种可滚动(Scrollable Widget)用于显示列表和长布局
  • 可滚动Widget都直接或间接包含一个Scrollable, 下面是常用的几个可滚动的Widget
    1. SingleChildScrollView
    2. ListView
    3. GridView
    4. CustomScrollView
    5. 滚动监听及控制ScrollController

1.SingleChildScrollView,使用的时候外边需要Scrollbar包裹

body: Scrollbar(
	child: SingleChildScrollView(
		child: Container(
			height: 3000,
			color: Colors.red
		)
	),
)

2.ListView

  • ListView是最常用的可滚动widget,它可以沿一个方向线性排布所有子widget, 类似于ReactNative中的ListView

  • ListView共有四种构造函数

      1. ListView()默认构造函数
      2. ListView.builder()
      3. ListView.separated()
      4. ListView custom()
    
ListView({
    Key key,
    Axis scrollDirection = Axis.vertical,
    bool reverse = false,
    ScrollController controller,
    bool primary,
    ScrollPhysics physics,
    EdgeInsetsGeometry padding,
    
    // 是否根据子widget的总长度来设置ListView的长度,默认值为false
    bool shrinkWrap = false,
    // cell高度
    this.itemExtent,
    // 子widget是否包裹在AutomaticKeepAlive中
    bool addAutomaticKeepAlives = true,
    // 子widget是否包裹在RepaintBoundary中
    bool addRepaintBoundaries = true,
    bool addSemanticIndexes = true,
    // 设置预加载的区域, moren 0.0
    double cacheExtent,
    //子widget列表
    List<Widget> children = const <Widget>[],
    // 子widget的个数
    int semanticChildCount,
})

例子

class ScrollView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return ListView(
      itemExtent: 60,
      cacheExtent: 100,
      addAutomaticKeepAlives: false,
      children: renderCell(),
    );
  }

  List<Widget> renderCell() {
    String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    return str.split("")
    .map((item) => ListTile(
      title: Text('字母--$item'),
      subtitle: Text('这是字母列表'),
      leading: Icon(Icons.wifi),
    )).toList();
  }
}

body: Column(
	children: <Widget>[
		ListTile(title:Text(因定的表头”)),
		Container(
			height: 400,
			child: ListView. builder(
				itemCount: 50,
				itemExtent: 50,
				itemDuilder: (BuildContext context, int index) {
					return Text (' + index. toString0);
				)),
			)
	],
)

3.GridView

GridView可以构建二维网格列表, 系统给出了五中构造函数

  • GridView()
  • GridView.count
  • GridView.extent
  • GridView.builder
  • GridView.custom
// 默认构造函数
GridView({
    Key key,
    Axis scrollDirection = Axis.vertical,
    bool reverse = false,
    ScrollController controller,
    bool primary,
    ScrollPhysics physics,
    bool shrinkWrap = false,
    EdgeInsetsGeometry padding,
    @required this.gridDelegate,
    bool addAutomaticKeepAlives = true,
    bool addRepaintBoundaries = true,
    bool addSemanticIndexes = true,
    double cacheExtent,
    List<Widget> children = const <Widget>[],
    int semanticChildCount,
})

  • 可以看到, 除了gridDelegate属性外, 其他属性和ListView的属性都一样, 含义也都相同
  • SliverGridDelegate是一个抽象类,定义了GridView排列相关接口,子类需要通过实现它们来实现具体的布局算法
  • Flutter中提供了两个SliverGridDelegate的子类SliverGridDelegateWithFixedCrossAxisCount和SliverGridDelegateWithMaxCrossAxisExtent, 下面我们分别介绍

1. SliverGridDelegateWithFixedCrossAxisCount
该子类实现了一个横轴为固定数量子元素的排列算法,其构造函数为:

const SliverGridDelegateWithFixedCrossAxisCount({
    // 横轴子元素的数量,此属性值确定后子元素在横轴的长度就确定了,即ViewPort横轴长度/crossAxisCount。
     this.crossAxisCount,
    // 主轴方向的间距
    this.mainAxisSpacing = 0.0,
    // 侧轴方向子元素的间距
    this.crossAxisSpacing = 0.0,
    // 子元素在侧轴长度和主轴长度的比例, 由于crossAxisCount指定后子元素横轴长度就确定了,然后通过此参数值就可以确定子元素在主轴的长度
    this.childAspectRatio = 1.0,
})

从上面的个属性可以发现,子元素的大小是通过crossAxisCountchildAspectRatio两个参数共同决定的。注意,这里的子元素指的是子widget的最大显示空间,注意确保子widget的实际大小不要超出子元素的空间, 代码示例如下

class ScrollView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView(
      padding: EdgeInsets.all(10),
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 3,
        childAspectRatio: 1,
        mainAxisSpacing: 10,
        crossAxisSpacing: 10
      ),
      children: <Widget>[
        Container(color: Colors.orange),
        Container(color: Colors.blue),
        Container(color: Colors.orange),
        Container(color: Colors.yellow),
        Container(color: Colors.pink)
      ],
    );
  }
}

2.GridView.count
GridView.count构造函数内部使用了
SliverGridDelegateWithFixedCrossAxisCount,我们通过它可以快速的创建横轴固定数量子元素的GridView

GridView.count({
    Key key,
    Axis scrollDirection = Axis.vertical,
    bool reverse = false,
    ScrollController controller,
    bool primary,
    ScrollPhysics physics,
    bool shrinkWrap = false,
    EdgeInsetsGeometry padding,
     int crossAxisCount,
    double mainAxisSpacing = 0.0,
    double crossAxisSpacing = 0.0,
    double childAspectRatio = 1.0,
    bool addAutomaticKeepAlives = true,
    bool addRepaintBoundaries = true,
    bool addSemanticIndexes = true,
    double cacheExtent,
    List<Widget> children = const <Widget>[],
    int semanticChildCount,
})

上面SliverGridDelegateWithFixedCrossAxisCount中给出的示例代码等价于:

class CountGridView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    // TODO: implement build
    return GridView.count(
      padding: EdgeInsets.all(10),
      crossAxisCount: 3,
      mainAxisSpacing: 10,
      crossAxisSpacing: 10,
      childAspectRatio: 1,
      children: <Widget>[
        Container(color: Colors.orange),
        Container(color: Colors.blue),
        Container(color: Colors.orange),
        Container(color: Colors.yellow),
        Container(color: Colors.pink)
      ],
    );
  }
}

3.GridView.extent
同样GridView.extent构造函数内部使用了SliverGridDelegateWithMaxCrossAxisExtent,我们通过它可以快速的创建侧轴子元素为固定最大长度的的GridView

class ExtentScrollView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.extent(
      padding: EdgeInsets.all(10),
      maxCrossAxisExtent: 100,
      childAspectRatio: 1,
      mainAxisSpacing: 10,
      crossAxisSpacing: 10,
      children: <Widget>[
        Container(color: Colors.orange),
        Container(color: Colors.blue),
        Container(color: Colors.orange),
        Container(color: Colors.yellow),
        Container(color: Colors.pink)
      ],
    );
  }
}

4.GridView.builder

class BuilderGridView extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return GridView.builder(
      itemCount: 50,
      gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
        crossAxisCount: 4,
        mainAxisSpacing: 10,
        crossAxisSpacing: 10
      ),
      itemBuilder: (content, index) {
        return Container(
          color: Colors.orange,
          child: Center(
            child: Text('$index'),
          ),
        );
      },
    );
  }
}

5.GridView.custom

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

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

相关文章

SpheroGPT: 声控自然语言编程 AI 玩具 Demo 具身智能 图文解说 完全开源机器人

背景介绍 因为生病请了长假. 一周前状态开始恢复, 于是尝试用 LLM (ChatGPT3.5) + Sphero 开发一个可以声控自然语言编程的 AI 玩具, 作为学习 ChatGPT 应用开发的方法. 差不多十天时间把开发目标基本都实现了, 这里和大家分享一下心得体会. Demo 示例视频 先把录制的几个 d…

企业软件商城:管理路径与价值的全面解析

在现代企业的运营中&#xff0c;软件资产管理&#xff08;SAM&#xff09;的实施不仅仅是为了应对审计需要&#xff0c;更重要的是其对于企业持续健康发展的深远影响。本文将详细探讨软件合规性管理的多重意义&#xff0c;并分析如何通过恰当的环境选择和高效系统&#xff0c;提…

WPS PPT学习笔记 1 排版4原则等基本技巧整理

排版原则 PPT的排版需要满足4原则&#xff1a;密性、对齐、重复和对比4个基本原则。 亲密性 彼此相关的元素应该靠近&#xff0c;成为一个视觉单位&#xff0c;减少混乱&#xff0c;形成清晰的结构。 两端对齐&#xff0c;1.5倍行距 在本例中&#xff0c;19年放左边&#x…

淄博公司商标驳回复审条件及流程

商标是人工审查的&#xff0c;所以不同的人会有不同的想法和意见&#xff0c;导致同一案件的审查结果不同。特别是商标审查周期缩短到5个月&#xff0c;全国平均每个工作日有1万多个商标提交申请&#xff0c;而全国只有一个商标审查单位——国家商标局提交申请。这种情况下&…

AI图书推荐:用100个ChatGPT提示词掌握Python编程

《用100个ChatGPT提示词掌握Python编程》&#xff08;ChatGPT:Your Python Coach Mastering the Essentials in 100 Prompts&#xff09; 塞尔吉奥罗哈斯-加莱亚诺&#xff08;Sergio Rojas-Galeano&#xff09;是一位热情的计算机科学家&#xff0c;对人工智能、机器学习、进化…

OceanBase数据库诊断调优,与高可用架构——【DBA从入门到实践】第八期

在学习了《DBA从入门到实践》的前几期课程后&#xff0c;大家对OceanBase的安装部署、日常运维、数据迁移以及业务开发等方面应当已经有了全面的认识。若在实际应用中遇到任何疑问或挑战&#xff0c;欢迎您在OceanBase社区问答论坛中交流、讨论。此次&#xff0c;《DBA从入门到…

在线投票系统源码 网上投票平台创建 安全稳定 支持自定义投票规则+礼物道具功能

分享一款在线投票系统源码&#xff0c;是一款功能丰富、安全稳定的网络投票平台解决方案。通过本源码&#xff0c;用户可以轻松创建并管理各种在线投票活动&#xff0c;支持自定义投票规则&#xff0c;同时集成礼物道具功能&#xff0c;增强用户参与度和投票活动的趣味性&#…

# 全面解剖 消息中间件 RocketMQ-(2)

全面解剖 消息中间件 RocketMQ-&#xff08;2&#xff09; 一、RocketMQ – RocketMQ 各角色介绍 1、RocketMQ 各角色介绍 Producer : 消息的发送者; 举例:发信者。Consumer : 消息接收者; 举例:收信者。Broker : 暂存和传输消息; 举例:邮局。NameServer : 管理 Broker; 举例…

数字人实训室解决方案

前言 近年来&#xff0c;政策层面的积极推动为数字人产业铺设了坚实的基石。2021年&#xff0c;“十四五”规划将虚拟数字技术纳入其中&#xff0c;强调技术创新引领行业应用的革新&#xff0c;加速数字人在各领域的实际应用。紧接着的《“十四五”数字经济发展规划》进一步明确…

CVE-2024-1561 Gradio component_server存在任意文件读取漏洞

声明&#xff1a; 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 简介 Gradio是一个用于构建快速原型和部署机器学习模型的…

集成环境 ClassNotFound 分析与排查

项目场景&#xff1a; 最近项目在集成环境&#xff0c;经常会报 ClassNotFound 异常&#xff0c; 而在开发环境通过IDEA查看项目&#xff0c;类是不缺的 原因分析&#xff1a; 经过排查&#xff0c;发现是项目中引用的 API jar包更新了&#xff0c;但是集成环境却没有成功更…

ATA-2081高压放大器的结构组成及原理是什么

高压放大器是一种电子设备&#xff0c;用于将低电压信号增强到高电压水平&#xff0c;以满足特定应用的需求。它们在各种领域中都有广泛的用途&#xff0c;包括医学成像、科学研究、通信系统和声学应用。下面西安安泰电子来为大家介绍高压放大器的结构组成和工作原理。 高压放大…

kafka Kerberos集群环境部署验证

背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…

国家开放大学Java语言程序设计实验2:分支、循环和跳转语句的使用

作业答案 联系QQ:1603277115 实验目的 通过本实验&#xff0c;了解和掌握分支、循环和跳转语句的使用及常见问题处理。 问题描述 杂物店正在做促销活动&#xff0c;很多商品都在进行特价促销&#xff0c;针对特价商品的购买数量做了限制&#xff0c;具体的促销办法是&#…

基于物理的AlGaN/GaN高电子迁移率晶体管的紧凑直流和交流模型

来源&#xff1a;A Physics-Based Compact Direct-Current and Alternating-Current Model for AlGaN/GaN High Electron obility Transistors&#xff08;中国物理快报 07年&#xff09; 摘要 一套针对 AlGaN/GaN 高电子迁移率晶体管 (HEMT) 的直流和小信号特性的分析模型被…

2024年商业管理与文化传播国际学术会议(ICBMCC 2024)

2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024) 2024 International Conference on Business Management and Cultural Communication 一、【会议简介】 2024年商业管理与文化传播国际学术会议&#xff08;ICBMCC 2024&#xff09;是一次汇集全球商业管理领域…

Java与GO语言对比分析

你是不是总听到go与java种种对比&#xff0c;其中在高并发的服务器端应用场景会有人推荐你使用go而不是 java。 那我们就从两者运行原理和基本并发设计来对比分析&#xff0c;看看到底怎么回事。 运行原理对比 java java 中 jdk 已经帮我们屏蔽操作系统区别。 只要我们下载并…

【MySQL数据库】CRUD 增 删 改 查 超详解,有这一篇就够了!

​ ​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 目录 ⚗️一.CRUD &#x1f9ea;二.新增&#xff08;Create&#xff09; &#x1f9eb;1.基本操作 &#x1f9ec;2.使用SELECT插入 &#x…

【虚拟机软件】 VMware Workstation Pro 17 新建 Linux 虚拟机教程(CentOS 7 版本)

文章目录 下载安装 VMware Workstation Pro 17 软件下载 Linux 的 ISO 映像文件Linux版本选择 新建虚拟机准备配置新建安装 后续设置文章导航 我是一名立志把细节说清楚的博主&#xff0c;欢迎【关注】&#x1f389; ~ 原创不易&#xff0c; 如果有帮助 &#xff0c;记得【点赞…

css动画之hamburgers

动效1 代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div><label class"hamburger"><input type"checkbox"><…