(原创)Flutter基础入门:各种常用容器类组件

news2024/12/28 11:13:28

前言

上篇博客主要讲了Flutter的Shape实现
Flutter基础入门:实现各种Shape效果
今天主要讲下Flutter中常用的一些容器组件
Flutter中组件数量很多,分类方式也各有不同
比如可以分为有态组价和无态组件
又可以分为容器组件、功能组件等
拿功能组件来说
有用来显示文字的TextView
显示图片的Image
显示列表的ListView等等
不过今天主要讲的还是一些容器组件
那么何为容器组件呢?
容器组件指的是可以容纳下级组件(1个或多个),
使用时以独立组件形式被运用的组件。
比如Row组件,刚刚提到的ListView组件等。
今天讲的容器组件
主要侧重点在于讲他们所支持的一些功能
通过介绍他们需要传入的参数的含义
来更清晰地了解这些容器的功能
而不仅仅是介绍用法
当然,这边也是选择一些常用并且功能强大的组件来介绍
下面正式开始

各种容器

Container

Container会是我们进行Flutter开发中用到的最强大也是最常用的单容器类控件
它可以实现装饰、定位、背景颜色、对齐方式、变换、裁剪等等一系列功能
我们先看下它的构造方法

  Container({
    super.key,
    this.alignment,
    this.padding,
    this.color,
    this.decoration,
    this.foregroundDecoration,
    double? width,
    double? height,
    BoxConstraints? constraints,
    this.margin,
    this.transform,
    this.transformAlignment,
    this.child,
    this.clipBehavior = Clip.none,
  })

可以看到,这里可以传入很多的可选入参,我们逐一介绍

alignment

对齐方式,可以设置子组件的对齐方式
举例如下:

  
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      height: 200,
      alignment: Alignment.center,
      color: Colors.grey,
      child: Text('文字控件'),
    );
  }

Alignment.center点进去会看到,其实是
center = Alignment(0.0, 0.0);
同理:
topLeft = Alignment(-1.0, -1.0);
bottomRight = Alignment(1.0, 1.0);
这样我们就知道了:
Alignment构造方法的第一个参数代表左右位置,第二个参数代表上下位置
0代表中心点,-1代表最左/最上,1代表最右/最下
比如:Alignment(0,1) 就是左右居中,靠下对齐
也就是:
bottomCenter = Alignment(0.0, 1.0);

padding & margin

padding是内边距,margin是外边距
比如:

  
  Widget build(BuildContext context) {
    return Container(
      width: 200,
      height: 200,
      padding: EdgeInsets.all(10),
      margin: EdgeInsets.only(top: 10),
      alignment: Alignment.topLeft,
      color: Colors.grey,
      child: Text('文字控件'),
    );
  }

出来效果就是:
在这里插入图片描述
这里要注意,padding & margin需要传入的都是EdgeInsetsGeometry类型
EdgeInsetsGeometry抽象类有两个子类:EdgeInsets和EdgeInsetsDirectional
可以理解为这个类就是用来设置一些间距的

decoration & foregroundDecoration

foregroundDecoration是绘制在child前面的装饰。如果设置decoration, 此时foregroundDecoration 样式会叠加在decoration样式上边
装饰器可以看我这个系列下专门的博客
Flutter基础入门:装饰器Decoration

constraints

constraints是一个BoxConstraints类型
主要用来控制子控件的最小宽高,如下:

  Container(
    width: 200,
    height: 200,
    color: Colors.grey,
    alignment: Alignment.center,
    child: Container(
      child: Text('文字控件'),
      constraints: BoxConstraints(minWidth: 100,minHeight: 100),
      color: Colors.red,
    ),
  );

限制了最小宽高为100后,文字的背景大小就变成100了,而不再是之前紧紧包裹着文字
在这里插入图片描述

transform & transformAlignment

transform主要是通过一个4*4的变换矩阵来对子组件就行变换
可以实现的效果如:斜切,缩放,平移,旋转,透视等
transformAlignment则是变换的位置,
这个参数的类型和对齐方式alignment参数的类型是一样的
都是AlignmentGeometry类型
默认是Alignment.topLeft
比如我们可以以组件中心位置对Z轴进行旋转变换:

  Container(
  width: 200,
  height: 200,
  transformAlignment: Alignment.center,//变换位置:中心点旋转
  transform: Matrix4.rotationZ(-0.5),//z轴旋转
  color: Colors.grey,
  alignment: Alignment.center,
  child: Text('文字控件'),
);

效果如下:
在这里插入图片描述

clipBehavior

clipBehavior是是组件内容边缘的切割方式,当组件内容溢出时可以选择不同的裁剪方式
在这里插入图片描述

color & width &height & child

color就是用来设置容器填充色的,宽高传入double类型就好
child自然就是子组件了
这些简单的就不演示了

Padding

Padding主要是给子组件添加内边距的,可参考Container的padding

Align

Align用来设置子组件的对齐方式,可参考Container的alignment

ConstrainedBox

ConstrainedBox用来设置最小宽高,需要传入一个BoxConstraints类型,可参考Container的constraints

DecoratedBox

DecoratedBox可以在其子组件绘制前(或后)绘制一些装饰(Decoration),如背景、边框、渐变等。
它的构造函数如下:

  const DecoratedBox({
    super.key,
    required this.decoration,
    this.position = DecorationPosition.background,
    super.child,
  })

其中position属性主要是设置装饰位置的
分为:
(DecorationPosition.foreground)前景,(DecorationPosition.background)背景

Transform

Transform主要是给子组件添加变换效果的的,可参考Container的transform

RotatedBox

用来旋转子组件的容器

  const RotatedBox({
    super.key,
    required this.quarterTurns,
    super.child,
  })

quarterTurns代表旋转的次数,每次旋转的度数只能是90度的整数倍
所以RotatedBox旋转的角度也只能是90度的整数倍

Clip裁剪相关组件

Clip相关组件主要用来进行对子组件的裁剪,如:
ClipOval:子组件为正方形时剪裁成内贴圆形;为矩形时,剪裁成内贴椭圆
ClipRRect:将子组件剪裁为圆角矩形
ClipRect:默认剪裁掉子组件布局空间之外的绘制内容(溢出部分剪裁)
ClipPath:按照自定义的路径剪裁
下面看具体例子:

class _ClipWidget extends StatelessWidget {
  final Image photo = Image.network(
    'https://tse1.mm.bing.net/th/id/OET.5272002b31e349ca8b7f061d2d17466f?w=135&h=272&c=7&rs=1&o=5&dpr=2&pid=1.9',
    height: 100,
    width: 100,
    fit: BoxFit.cover,
  );

  
  Widget build(BuildContext context) => MaterialApp(
    home: Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            photo,
            const SizedBox(
              height: 20,
            ),
            ClipOval(
              child: photo,
            ),
            const SizedBox(
              height: 20,
            ),
            ClipRRect(
              child: photo,
              borderRadius: const BorderRadius.all(Radius.circular(20)),
            ),
            const SizedBox(
              height: 20,
            ),
            Container(
              color: Colors.red,
              child: Row(
                children: [
                  Align(
                    alignment: Alignment.centerRight,
                    widthFactor: 0.5,
                    child: ClipRect(
                      child: photo,
                    ),
                  ),
                  const Text('我是文本')
                ],
              ),
            ),
          ],
        ),
      ),
    ),
  );
}

效果如下:
在这里插入图片描述

FittedBox

当子组件的宽高比和父组件的宽高比不一样时,我们等比拉伸或者填充父组件,这时我们可以使用FittedBox

  Container(
    height: 200,
    width: 200,
    color: Colors.green,
    child: FittedBox(
      fit: BoxFit.contain,
      child: Container(
        height: 50,
        width: 80,
        color: Colors.red,
      ),
    ),
  );

如图:
在这里插入图片描述
其中fit参数表示了子控件的填充方式,说明如下:
fill:填充父组件,宽高比发生变化。
contain:等比拉伸,但子控件不能超出父控件。
cover:尽可能的小,等比拉伸充满父控件。
fitWidth:等比拉伸,宽充满父控件。
fitHeight:等比拉伸,高充满父控件。
none:默认子控件居中,不做拉伸处理,超出父控件的部分裁剪。
scaleDown:在子控件为Image且缩小的情况和contain一样,否则和none一样。

card

用来把子组件做成卡片类的样式
也可以用来实现一些Shape的效果
主要属性如下:

  const Card({
    super.key,
    this.color,//背景色
    this.shadowColor,//阴影颜色
    this.surfaceTintColor,
    this.elevation,//阴影高度
    this.shape,
    this.borderOnForeground = true,//是否在 child 前绘制 border,默认为 true
    this.margin,
    this.clipBehavior,
    this.child,
    this.semanticContainer = true,
  })

可以看到大部分还是和Container类似的

Row & Column

这两个类似Android的LinearLayout
他们的children属性可以传入一个子组件数组
Row是对子组件进行横向布局
Column则是对子组件进行纵向布局

Wrap & Stack

Wrap 流式布局
Stack 类似Android中的帧布局FrameLayout

Scaffold

Scaffold翻译过来是脚手架的意思
其实也是为了方便我们快速搭建页面而提供给我们的一个模板组件

  const Scaffold({
    super.key,
    this.appBar,
    this.body,
    this.floatingActionButton,
    this.floatingActionButtonLocation,
    this.floatingActionButtonAnimator,
    this.persistentFooterButtons,
    this.persistentFooterAlignment = AlignmentDirectional.centerEnd,
    this.drawer,
    this.onDrawerChanged,
    this.endDrawer,
    this.onEndDrawerChanged,
    this.bottomNavigationBar,
    this.bottomSheet,
    this.backgroundColor,
    this.resizeToAvoidBottomInset,
    this.primary = true,
    this.drawerDragStartBehavior = DragStartBehavior.start,
    this.extendBody = false,
    this.extendBodyBehindAppBar = false,
    this.drawerScrimColor,
    this.drawerEdgeDragWidth,
    this.drawerEnableOpenDragGesture = true,
    this.endDrawerEnableOpenDragGesture = true,
    this.restorationId,
  })

Scaffold的属性特别多,我们挑一些常用的来讲
appBar:页面顶部栏,是一个PreferredSizeWidget抽象类,可以选择AppBar,TabBar这些实现类来作为顶部栏
body:主体部分,放入一个子组件即可
bottomNavigationBar:底部组件,一般用于实现首页底部的按钮切换功能
drawer & endDrawer:左右侧滑组件
backgroundColor:背景色
floatingActionButton:浮动按钮
floatingActionButtonLocation:浮动按钮位置
下面写一个Scaffold包裹的页面
实现一些基本的演示功能:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    title: "首页",
    home: CustomScaffold(),
  ));
}

class CustomScaffold extends StatefulWidget {
  const CustomScaffold({Key? key}) : super(key: key);

  
  State<StatefulWidget> createState() => _CustomScaffoldState();
}

// AppBar 默认的实例,有状态
class _CustomScaffoldState extends State with SingleTickerProviderStateMixin {
  final List<String> tabs = const ['实时新闻', '今日头条', '经济', '股票', '体育竞技', '国际风云'];
  int _position = 0;
  final Map<String,IconData> iconsMap = {
    "首页": Icons.home,
    "动态": Icons.toys,
    "收藏": Icons.favorite,
    "图鉴": Icons.class_,
    "我的": Icons.account_circle,
  };
  final List<Color> _colors = [
    Colors.blue,
    Colors.red,
    Colors.yellow,
    Colors.green,
    Colors.purple,
  ];

  late TabController _tabController;

  
  void initState() {
    super.initState();
    _tabController = TabController(vsync: this, length: tabs.length);
  }

  
  void dispose() {
    _tabController.dispose();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
    return SizedBox(
      width: MediaQuery.of(context).size.width,
      height: MediaQuery.of(context).size.height - 300,
      child: Scaffold(
        floatingActionButtonLocation: FloatingActionButtonLocation.endFloat,
        floatingActionButton: FloatingActionButton(
          child: const Icon(Icons.add),
          onPressed: () {},
        ),
        drawer: _buildLeftDrawer(),
        endDrawer: _buildLeftDrawer(),
        appBar: AppBar(
          title: const Text('首页'),
          backgroundColor: Colors.blue,
          centerTitle: true,
          bottom: _buildTabBar(),
        ),
        body: _buildTableBarView(),
        bottomNavigationBar: _buildBottomNavigationBar(),
      ),
    );
  }

  Drawer _buildLeftDrawer() => Drawer(
    elevation: 1,
    child: Image.network(
      'https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fc-ssl.duitang.com%2Fuploads%2Fitem%2F201907%2F22%2F20190722235951_J3aVw.thumb.1000_0.jpeg&refer=http%3A%2F%2Fc-ssl.duitang.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1684313785&t=63178f27b92b3cfc174d8354fe203c94',
      fit: BoxFit.cover,
    ),
  );

  PreferredSizeWidget _buildTabBar() => TabBar(
    isScrollable: true,
    controller: _tabController,
    indicatorColor: Colors.orangeAccent,
    tabs: tabs.map((e) => Tab(text: e)).toList(),
  );

  Widget _buildBottomNavigationBar() => BottomNavigationBar(
    onTap: (position) => setState(() => _position = position),
    currentIndex: _position,
    elevation: 1,
    backgroundColor: Colors.white,
    iconSize: 25,
    selectedLabelStyle: const TextStyle(fontWeight: FontWeight.bold),
    showUnselectedLabels: false,
    showSelectedLabels: true,
    items: iconsMap.keys
        .map((key) => BottomNavigationBarItem(
        label: key,
        icon: Icon(iconsMap[key]),
        backgroundColor: _colors[_position]))
        .toList(),
  );

  Widget _buildTableBarView() => TabBarView(
      controller: _tabController,
      children: tabs
          .map((e) => Center(
          child: Text(
            e,
            style: const TextStyle(color: Colors.blue, fontSize: 20),
          )))
          .toList());
}

效果如下:
在这里插入图片描述

资料分享

最后给大家推荐一个不错的项目:
Flutter_unit
大部分的组件都可以在这个项目里面学习
里面不仅仅有组件的介绍,还有实实在在的代码和效果演示

还有一个网站也可以学习到更多的组件:
Flutter | 老孟

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

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

相关文章

docker网络详解,自定义docker网络

文章目录一、初识docker网络1、docker0虚拟网桥2、docker网络常用基本命令3、docker网络可以解决的问题二、docker网络模式1、四种网络模式2、容器实例内默认网络IP生产规则3、bridge模式4、host模式5、none模式6、container模式五、自定义网络模式1、过时的docker link2、使用…

【英语】大学英语CET考试,词汇语法导学方法论笔记(50h+)

文章目录1、谭剑波-词汇直播课1-2&#xff08;词汇学习3个关键&#xff09;1.1 看不懂句子的原因&#xff08;词汇的重要性&#xff09;1.2 记不住单词的原因&#xff08;死记硬背70%&#xff09;1.3 理解单词的本质&#xff08;词根词缀&#xff0c;26字母&#xff0c;联想辅助…

D3D11和D3D12共享资源

最近碰到个伪需求: 游戏串流。 游戏引擎用D3D12渲染&#xff0c; 再把游戏画面做视频编码&#xff0c; 通过网络发送到远端做解码显示。 第一反应就是走全GPU的流程&#xff0c; 不要用CPU把显存里的数据拷来拷去。 所以先获取渲染完的D3D12的frame buffer&#xff0c; 然后送给…

进程管理 - 银行家算法

文章目录1 概述2 银行家算法2.1 原理2.2 例题1 概述 #mermaid-svg-7QKAqjQpckpStO9Q {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QKAqjQpckpStO9Q .error-icon{fill:#552222;}#mermaid-svg-7QKAqjQpckpStO9Q .e…

android framework-PackageManagerService(PKMS)包管理服务

一、概述 Android系统启动过程中&#xff0c;会启动一个包管理服务PackageManagerService(PKMS)&#xff0c;这个服务主要负责扫描系统中指定目录&#xff0c;找出里面以apk结尾的文件&#xff0c;通过对这些文件进行解析&#xff0c;得到应用程序的所有信息并完成应用程序的安…

算法学习day59

算法学习day591.力扣503.下一个更大元素II1.1 题目描述1.2 分析1.3代码2.力扣42. 接雨水2.1 题目描述2.2 分析2.3 代码3.参考资料1.力扣503.下一个更大元素II 1.1 题目描述 题目描述&#xff1a; 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&a…

【大数据Hadoop】HDFS3.3.1-Namenode-租约管理

租约管理前言LeaseManager.LeaseLeaseManager添加租约 - addLease租约检查 - FsNamesystem.checkLease租约更新 - renewLease删除租约 - removeLease租约检查 - Monitor 线程租约恢复 - Monitor 线程发起租约恢复 - 其他方式发起前言 我们知道 HDFS 文件是 write-once-read-man…

CloudCompare插件开发之点云如何创建、保存并显示?

文章目录0.引言1.创建插件工程2.代码编写3.显示点云4.保存点云0.引言 CloudCompaer是一款优秀的开源软件&#xff0c;在点云处理时可以根据实际要求开发合适的插件&#xff0c;在实际使用中&#xff0c;创建点云、保存点云、显示点云的操作较为基础&#xff0c;为了使这些操作得…

施工组织设计合集

34-6 施工组织设计02017-年亲曼旗大镇市政道路及广场公园园林绿化工程(第一.A1-1五中教学楼施工组织设计A2施工组织设计(方案) 报审表hasuploaded-中建施|组织设计 (22P)安徽大包庄125万吨疏铁矿斜坡道施工组织设计 (修改)宝山万科四季花城施T组织设计 (126P)对税信息培训中心装…

软件测试,月薪还没过万的进来看

目录 前言 一、技能提升 二、多语言掌握 三、团队协作 四、持续学习 五、提高测试效率 六、质量保障 七、职业发展 八、总结 前言 在当今IT行业中&#xff0c;软件测试是一个不可或缺的环节。随着互联网和移动应用的发展&#xff0c;对软件质量的要求也越来越高。因此…

前后端分离架构

前后端分离架构介绍 前后端分离已成为互联网项目开发的业界标准使用方式&#xff0c;将前端和后端的开发进行解耦。并且前后端分离会为以后的大型分布式架构、微服务架构、多端化服务&#xff08;各种客户端&#xff0c;比如浏览器、车载终端、安卓、IOS等&#xff09;打下坚实…

[Netty] FastThreadLocal (十四)

文章目录1.FastThreadLocal介绍2.FastThreadLocal分析3.FastThreadLocal结构分析4.FastThreadLocal方法分析4.1 FastThreadLocal.get()4.2 FastThreadLocal.set()1.FastThreadLocal介绍 FastThreadLocal是Netty中常用的一个工具类, FastThreadLocal所使用的InternalThreadLoca…

[架构之路-159]-《软考-系统分析师》-10-系统分析-6-现有业务流程分析, 系统分析最核心的任务

目录 第 10章 现有系统 分 析 1 0 . 6 现有业务流程分析 10.6.1 业务流程分析槪述 1 . 业务流程分析的步骤 2 . 业务流程分析的方法 10.6.2 业务-流程图TFD 1. T F D 的基本符号 2. TFD的绘制 10.6.3 业务 - 活动图 10.6.4 业务流程建模BPM 1. B P M 概述 2 . 标杆…

Pytest自动化测试框架一些常见的插件

Pytest拥有丰富的插件架构&#xff0c;超过800个以上的外部插件和活跃的社区&#xff0c;在PyPI项目中以“ pytest- *”为标识。 本篇将列举github标星超过两百的一些插件进行实战演示。 插件库地址&#xff1a;http://plugincompat.herokuapp.com/ 1、pytest-html&#xff1…

python机器学习决策树和SVM向量机算法实现红酒分类

1、红酒数据介绍 经典的红酒分类数据集是指UCI机器学习库中的Wine数据集。该数据集包含178个样本&#xff0c;每个样本有13个特征&#xff0c;可以用于分类任务。 具体每个字段的含义如下&#xff1a; alcohol&#xff1a;酒精含量百分比 malic_acid&#xff1a;苹果酸含量&a…

中科大ChatGPT学术镜像小白部署教程,全民都可以拥抱AI

docker…不会用…python不会用…服务器默认python版本3.6不会升级…代理也不会配置…各种命令不会用… 那么下面就是最简单办法&#xff0c;点点点即可【希望有帮助&#xff1f;】 文章目录一、体验镜像地址二、 基本配置2.1 config.py文件2.2 main.py文件三、下载项目四、项目…

FRP内网穿透配置

FRP内网穿透&#xff08;WIN&#xff09; 官方文档&#xff1a;点击进入 1.下载地址&#xff1a;点击进入 2.linux 压缩命令&#xff1a;tar -zxvf 包名&#xff0c;即可&#xff01; 3.linux配置服务端&#xff08;frps&#xff09; [common] bind_addr0.0.0.0 # frp监听的…

【NLP实战】基于Bert和双向LSTM的情感分类【下篇】

文章目录前言简介第一部分关于pytorch lightning保存模型的机制关于如何读取保存好的模型完善测试代码第二部分第一次训练出的模型的过拟合问题如何解决过拟合后记前言 本文涉及的代码全由博主自己完成&#xff0c;可以随意拿去做参考。如对代码有不懂的地方请联系博主。 博主…

TCP协议与UDP协议

1.TCP协议特点 1.1连接的建立与断开 TCP协议提供的是&#xff1a;面向连接、可靠的、字节流服务。使用TCP协议通信的双发必须先建立连接&#xff0c;然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源&#xff0c;以管理连接的状态和连接上数据的传输。TCP连接是全…

从C语言到C++(第一章_C++入门_下篇)内联函数+auto关键字(C++11)+范围for +nullptr

目录 1. 内联函数 1.1 内联函数的概念 1.2 内联函数的特性 1.3 宏的优缺点和替代方法 2. auto关键字&#xff08;C11&#xff09; 2.1 改版前的auto 2.2 改版后的auto 2.3 auto 的使用场景 2.3.1处理很长的数据类型 2.3.2 auto 与指针结合起来使用&#xff1a; 2.4…