Flutter——常用布局

news2024/11/27 19:55:22

Flutter—常用布局

  • 效果图
  • widget 树形图
    • 左布局
      • Text
      • 评分条
      • 提示内容
    • 右布局
    • 应用
  • Stack布局
    • 效果图
  • 示例
    • 效果图
      • 电影封面
      • 电影信息
      • 电影演员
      • 电影简介
    • 应用

效果图

widget 树形图

整个界面由一行组成,分为两列;左列包括电影介绍,由上到下垂直排列;右列由GridView布局组成3行2列的效果

左布局

将每一部分定义成一个变量,然后通过调用变量,减少层级嵌套,避免编码时视觉混乱;左边部分分为四个部分:标题,内容,评分条,提示。其中评分条,和提示由化为多个子组件

 var leftColumn = Container(
   padding: const EdgeInsets.all(10.0),
   child: Column(
     children: [
       defaultText(20.0, Colors.black, "《万里归途》", FontStyle.italic),
       defaultText(12.0, Colors.grey, movieContent, FontStyle.normal),
       rating,
       tips
     ],
   )
 );

Text

将Text组件定义成一个方法,在内容差不多的情况下,可以减少层级,使用时,就调用方法,然后获取返回Text即可,因为Flutter和原生Android存在差距,并不需要声明组件ID,所以很多时候可以通过某些方法,减少重复编写。

defaultText(20.0, Colors.black, "《万里归途》", FontStyle.italic),
Text defaultText(double textSize,Color textColor,String content,FontStyle fontStyle){
   return Text(
     content,
     style: TextStyle(
       fontSize:  textSize,
       color: textColor,
       fontStyle: fontStyle,
     ),
   );

评分条

评分条由一行两列组成,左列为星星组成,右列由Text组成

  final rating = Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    crossAxisAlignment: CrossAxisAlignment.center,
    children:<Widget> [
      stars,
      defaultText(12.0, Colors.black, "1024赞同", FontStyle.normal)
    ],
  );

评分星星久直接使用Row布局排列即可,可以使用其内置图标,其中mainAxisSize: MainAxisSize.min代表按照其大小自适应排列

 var stars = Row(
   mainAxisSize: MainAxisSize.min,
   children: const [
     Icon( Icons.star, color: Colors.red),
     Icon( Icons.star, color: Colors.red),
     Icon( Icons.star, color: Colors.red),
     Icon( Icons.star, color: Colors.grey),
     Icon( Icons.star, color: Colors.grey)
   ],
 );

提示内容

提示内容列由Container包裹,其中Container带表单布局,其意为只需有一个组件存在,然后又划分为3行3列,顾名思义,Row为横向排列,Column为纵向排列,这俩布局在日常开发中,使用较多

final tips = Container(
  padding: const EdgeInsets.all(10),
  child: Row(
    mainAxisAlignment: MainAxisAlignment.spaceEvenly,
    children: [
      Column(
        children: const [
          Icon(Icons.timer_outlined,color: Colors.green),
          Icon(Icons.price_change_outlined,color: Colors.green),
          Icon(Icons.people_outline,color: Colors.green)
        ],
      ),
      Column(
        children: [
          defaultText(14.0, Colors.black, "时长", FontStyle.normal),
          defaultText(14.0, Colors.black, "票价", FontStyle.normal),
          defaultText(14.0, Colors.black, "人数", FontStyle.normal)
        ],
      ),
      Column(
        children: [
          defaultText(14.0, Colors.black, "1h 30min", FontStyle.normal),
          defaultText(14.0, Colors.black, "¥30.8", FontStyle.normal),
          defaultText(14.0, Colors.black, "1人", FontStyle.normal)
        ],
      )
    ],
  )
);

右布局

右列主要应用GridView布局,通过插入图片内容,形成一个3行2列布局形式

GridView属性释义
crossAxisCount列数
mainAxisSpacing行间距
crossAxisSpacing列间距
childAspectRatio宽高比
 var rightColumn = Container(
     padding: const EdgeInsets.all(10.0),
     child:GridView(
       gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
         crossAxisCount: 2,
         mainAxisSpacing: 10.0,
         crossAxisSpacing: 10.0,
         childAspectRatio: 0.7,
       ),
       children: [
         Image.network('https://puui.qpic.cn/vcover_vt_pic/0/mzc00200qv892j31664769964603/260', fit: BoxFit.cover),
         Image.network('https://puui.qpic.cn/vcover_hz_pic/0/mzc0020081yfj601667638704638/0', fit: BoxFit.cover,),
         Image.network('https://puui.qpic.cn/vcover_hz_pic/0/mzc00200dxhbjfd1666584195007/0', fit: BoxFit.cover,),
         Image.network('http://img21.mtime.cn/mt/2010/07/02/161110.98639415_1280X720X2.jpg', fit: BoxFit.cover,),
         Image.network('https://puui.qpic.cn/vcover_hz_pic/0/mzc00200mjy32e71663670004536/0', fit: BoxFit.cover,),
         Image.network('https://puui.qpic.cn/vcover_hz_pic/0/mzc00200977rx4h1665298676133/0', fit: BoxFit.cover,),
       ],
     )
 );

应用

最后在body中引用左右俩布局即可,其中Card为卡片布局,可以生成一个圆角矩形的背景,可以通过其color属性更改,背景颜色

 body: Container(
          padding: const EdgeInsets.all(10.0),
          height: 450,
          alignment: Alignment.center,
          child: Card(
            color: Colors.brown,
            clipBehavior: Clip.antiAlias,
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceEvenly,
              crossAxisAlignment: CrossAxisAlignment.start,
              children:[
                Expanded(child: leftColumn),
                Expanded(child: rightColumn)
              ],
            ),
          ),
        )

Stack布局

效果图

官方解释如下:

  • 用于覆盖另一个 widget
  • 子列表中的第一个 widget 是基础 widget;后面的子项覆盖在基础 widget 的顶部
  • Stack 的内容是无法滚动的
  • 你可以剪切掉超出渲染框的子项

简单说,就是应用Stack布局,其中的子布局会层叠在一起
下列列出三个子组件,一个为背景、一个为图像、一个为名称,效果如上图所示

var buildStack = Stack(
  alignment: Alignment.center,
  children: [
    Container(
      width: 150.0,
      height: 150.0,
      decoration: const BoxDecoration(
          gradient: LinearGradient(colors: [Colors.grey, Colors.grey]),
          shape: BoxShape.rectangle,
          borderRadius: BorderRadius.all(Radius.circular(10.0))),
    ),
    const CircleAvatar(
      backgroundImage: NetworkImage(
          'https://puui.qpic.cn/vcover_vt_pic/0/pxehhgycon4rixh1664499664/260'),
      radius: 50,
    ),
    const Text(
      'FranzLiszt1847',
      style: TextStyle(fontSize: 16.0, color: Colors.white),
    ),
  ],
);

示例

效果图

父布局为Column布局,形成一个4行1列的布局,分为:电影封面、电影信息、电影演员、电影简介四个部分

电影封面

封面较为简单,直接将图片装进一个盒子里面,并赋于大小即可

var bg = SizedBox(
  height: 250.0,
  child: Image.network('https://puui.qpic.cn/vcover_hz_pic/0/mzc00200whsp9r61623030200228/0',fit: BoxFit.cover),
);

电影信息

分为左右两部分,左边又分为上下两部分,为了让左边和右边有足够多的空间,让左边被Expanded布局包裹,即左边默认权重是1,那么右边就自适应内容大小,其余空间被左边占据

var title = Container(
  padding: const EdgeInsets.all(20.0),
  child: Row(
    children: [
      Expanded(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            defaultText(18.0, Colors.black, "繁华", FontStyle.normal,FontWeight.bold),
            defaultText(12.0, Colors.grey, "内地·2022·剧情", FontStyle.normal,FontWeight.normal)
          ],
        ),
      ),
      const Icon(Icons.star, color: Colors.red),
      const Text('100')
    ],
  ),
);

电影演员

因为有三个演员,每一个演员是一列,用一个公共方法包裹,然后复用即可

Container getActList(String actor,String url){
  return Container(
    margin: const EdgeInsets.only(left: 20.0),
    child: Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        CircleAvatar(
          backgroundImage: NetworkImage(url),
          radius: 50,
        ),
        defaultText(12.0, Colors.black, actor, FontStyle.normal,FontWeight.bold)
      ],
    ),
  );
}

采用 mainAxisSize: MainAxisSize.min,属性让三个演员自适应大小,然后外面使用Row布局进行包裹,最终形成2航3列的效果

var actors = Row(
  mainAxisSize: MainAxisSize.min,
  mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  children: [
    getActList('胡歌','https://puui.qpic.cn/vstar_pic/0/name_77904_688t1467970955.jpg/0?max_age=7776000'),
    getActList('唐嫣','https://puui.qpic.cn/media_img/0/null1515833526/0?max_age=7776000'),
    getActList('马伊琍','https://puui.qpic.cn/media_img/0/801701537252577/0?max_age=7776000')
  ],
);

电影简介

直接给予一个Container布局,申明一个外边距即可

var introduction = '《繁花》将围绕阿宝展开,'
    '上世纪九十年代初,煌煌大时代,'
    '人人争上游,阿宝也变成了宝总,成功过,失败过,在沪上弄潮儿女中留下一段传奇。'
    '有过金碧辉煌,有过细水长流,男男女女,涨涨跌跌,道尽一个时代的情义与至真。';

var brief = Container(
  margin: const EdgeInsets.all(20.0),
  child: defaultText(14.0, Colors.black, introduction, FontStyle.normal,FontWeight.normal),
);

应用

最后将申明的四个部分使用Column布局包裹即可

      body: Column(
        children: [
          bg,
          title,
          actors,
          brief
        ],
      )

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

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

相关文章

java计算机毕业设计ssm+jsp线上授课系统

项目介绍 通篇文章的撰写基础是实际的应用需要&#xff0c;然后在架构系统之前全面复习线上授课的相关知识以及网络提供的技术应用教程&#xff0c;以线上授课的实际应用需要出发&#xff0c;架构系统来改善现线上授课工作流程繁琐等问题。不仅如此以操作者的角度来说&#xf…

【JavaSE】关于数组

文章目录数组的创建与初始化数组的初始化静态初始化动态初始化数组的存储null打印数组的三种方式循环遍历打印foreach打印Arrays.toString()打印数组的练习冒泡排序常用的API数组拷贝Arrays.copyOf()数组排序Arrays.sort()数组的快速初始化Arrays.fill()二维数组数组的创建与初…

mysql之MHA的高可用

一、MHA概述 1.什么是 MHA&#xff1a; MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作…

1分钟完成在线测试部署便捷收集班级同学文件的web管理系统

最近CSDN推出了一个新功能【云IDE】&#xff0c;个人对这个新功能(比赛奖金 )挺感兴趣的&#x1f92d;&#xff0c;于是瞬速地拿之前自己搞的一个便捷收集班级同学文件的web管理系统&#xff08;下面简称该项目为cfile&#xff09;体验了一下&#xff0c;发现功能还是挺好用的&…

Node.js 实战 第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 1.6 总结

Node.js 实战 文章目录Node.js 实战第1章 欢迎进入Node.js 的世界1.5 三种主流的Node 程序1.5.1 Web 应用程序1.5.2 命令行工具和后台程序1.5.3 桌面程序1.5.4 使用Node 的应用程序1.6 总结第1章 欢迎进入Node.js 的世界 1.5 三种主流的Node 程序 Node 程序主要可以分成三种类…

某网站视频播放花屏解密

某网站视频播放花屏解密样例网址&#xff1a;aHR0cHM6Ly90di5jY3R2LmNvbS8yMDIyLzA5LzMwL1ZJREVnZ0ZRYmZ6NmlMeXZjN0F4d0NlZjIyMDkzMC5zaHRtbA 站内之前也曾经发过相关的问题 1.CCTV视频m3u8视频下载&#xff0c;下载下来时长正确&#xff0c;有声音&#xff0c;但是画面是马…

聚沙成塔【45天玩转uni-app】初探uni-app

文章目录写在前面DCloud当下跨平台开发存在的问题为什么选择uni-app写在最后写在前面 聚沙成塔——每天进步一点点&#xff0c;大家好我是几何心凉&#xff0c;不难发现越来越多的前端招聘JD中都加入了uni-app 这一项&#xff0c;它也已经成为前端开发者不可或缺的一项技能了&…

ROS1可视化利器---Webviz

0. 简介 对于ROS1而言&#xff0c;rqt和plotjuggler是我们最常用的工具&#xff0c;这两个工具&#xff1a;rqt中嵌入了很多有用的小工具&#xff0c;但是它需要播放离线包&#xff0c;没有办法对离线包进行实时的分析。而plotjuggler支持对离线bag包进行分析&#xff0c;但是…

[C语言、C++]数据结构作业:用递归实现走迷宫(打印正确通路即可)

如果是非递归情况 如果当前点&#xff08;方格&#xff09;为出口&#xff0c;则成功退出 &#xff08;否则&#xff09; 如果可继续走(向相邻点试探)&#xff0c;存在某个可前进 的相邻点(分支)则&#xff1a; 1、将当前点保存&#xff0c;以便回退 2、将相邻点作为当前点…

【数据结构】排序3——交换排序(冒泡排序、快速排序)

文章目录交换排序冒泡排序冒泡排序算法算法分析快速排序改进后的快速排序算法算法分析交换排序 【基本思想】 两两比较&#xff0c;如果发生逆序则交换&#xff0c;直到所有记录都排好序为止。 常见的交换排序方法&#xff1a; 冒泡排序T(n)O(n2) 快速排序T(n)O( nlog2n) 冒…

SpringSecurity Oauth2实战 - 06 获取用户登录信息并存储到本地线程

文章目录1. 获取用户登录信息1. 用户信息共享的ThreadLocal类 UserInfoShareHolder2. 写一个拦截器 UserInfoInterceptor3. 配置拦截器 CommonWebMvcAutoConfiguration2. 源码分析1. 认证用户通过access_token访问受限资源2. 进入过滤器 OAuth2AuthenticationProcessingFilter#…

源码分析:Transport 开发

有关 transport 相关队列的调用过程: 【T ransportService 】 TransportService.java 的所有接口由 DefaultTransportService.java 实现,里面包含四种接口: (1)发送到 ruleEngine 发送 TbProtoQueueMsg<ToRuleEngineMsg> 消息。 由 DefaultTbRuleEngineConsumerServic…

【攻破css系列——附加篇】vscode自动格式化

文章目录1. 快速格式化1.1 格式化的定义1.2 vscode的格式化组合键2. 自动格式化2.1 定义2.2 设置自动格式化的步骤1. 快速格式化 1.1 格式化的定义 格式化会让我们的代码正确缩进&#xff0c;同级标签的缩进空格一致&#xff0c;最后使我们代码更好看且易懂。 没有格式化我们…

Nginx学习

Nginx学习 nginx的基本概念 nginx是什么&#xff1f;做什么事情&#xff1f; Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;特点是占用内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力确实在同类型的网页服务器中表现较好。nginx专为…

gcc编程4步编译、调试c程序实操详解(Linux系统编程)

gcc编译可以执行程序4步骤:预处理、编译、汇编、链接 一、知识储备&#xff08;想看实战往下翻&#xff09; 在linux程序种&#xff0c;c程序需要用gcc进行编译&#xff0c;链接用ld程序&#xff0c;ggc编译完成后可自动调用ld程序完成链接。 调用gcc程序的语法格式&#xff…

Android Studio APP开发入门之对话框Dialog的讲解及使用(附源码 包括提醒对话框,日期对话框,时间对话框)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、提醒对话框 AlertDialog名为提醒对话框&#xff0c;它是Android中最常用的对话框&#xff0c;可以完成常见的交互操作&#xff0c;例如提示&#xff0c;确认&#xff0c;选择等功能&#xff0c;由于AlertDialog没有公开…

CLRNet: Cross Layer Refinement Network for Lane Detection——论文简述

一、简介 CLRNet充分利用了低层次特征和高层次特征&#xff0c;因为两者是互补的&#xff0c;先基于高层次特征侦测道路&#xff0c;再基于底层次特征进行调优&#xff1b;由于遮挡的存在&#xff0c;使用ROIGather进行全局信息的收集&#xff0c;在ROI道路特征和全局特征图之…

SaaS 架构基础理论(一)

SaaS架构基础理论1、背景2、SaaS商业模式2.1、什么是SaaS2.2、SaaS软件的优势&#xff1a;2.3、SaaS劣势&#xff1a;3.SaaS应用架构3.1、SaaS成熟度模型3.2、SaaS成熟模型分级3.2.1、Level1 定制开发3.2.2、Level2 可配置3.2.3、Level3 高性能的多租户架构3.2.4、Level4 可伸缩…

【Docker】Docker安装与入门

Docker入门与基础命令 Docker简介 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows操作系统的机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xf…

Zookeeper几种应用

分布式锁 master-worker模式 涉及三种角色&#xff1a; 1. master&#xff0c;用于检测新的task、worker的添加&#xff0c;将新的task分配给worker处理 2. worker&#xff0c;将自己注册到系统&#xff0c;被master发现后&#xff0c;监控task 3. client&#xff0c;客户…