2、Flutter布局和状态管理

news2024/9/21 14:45:05

一、Flutter布局之Row&Column

1.1 Container的center属性: 让子控件在父控件的中间显示

Container(
     color: Colors.yellow,
     //1.Center让子部件在父控件中间
     child: Center(
       child: Text('Layout Center')),
 );

1.2 alignment让子控件相对父控件位置,取值范围在-1~1,(0,0)位于中心,(-1.0,-1.0)位于左上角

alignment: Alignment(0.0, 0.0)

1.3三种主要的布局方式

  • Row横向布局:从左往右 X轴
  • Column纵向布局:从上往下 Y轴
  • Stack栈布局:依次层叠

1.4 Row布局总结

  • mainAxisAlignment主轴方向:start居左、center居中、end居右,
    • spaceAround:主轴方向剩下的空间平均分配在周围。
    • spaceBetween: 主轴方向剩下的空间平均分布到小部件中间,
    • spaceEvenly: 主轴方向剩下的空间平均分配
  • crossAxisAlignment交叉轴方向
    • 当设置CrossAxisAlignment.baseline时,需要再设置textBaseline属性,设置相对文本控件的基线
textBaseline: TextBaseline.alphabetic,
  • Expanded是一种填充布局,其中的child可以设置Text,或者Container去做UI
  • 使用案例如下
class RowDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Row(
      //主轴方向:start居左、center居中、end居右,
      // spaceAround:主轴方向剩下的空间平均分配在周围。
      // spaceBetween: 主轴方向剩下的空间平均分布到小部件中间,
      // spaceEvenly: 主轴方向剩下的空间平均分配
      mainAxisAlignment: MainAxisAlignment.spaceEvenly,
      // 交叉轴方向:
      // crossAxisAlignment: CrossAxisAlignment.end,
      crossAxisAlignment: CrossAxisAlignment.baseline,
      // 相对于文本控件,作为基线
      textBaseline: TextBaseline.alphabetic,
      children: <Widget>[
        // 填充布局
        Expanded(child:
        Container(
          child: Text('Hello1212',style: TextStyle(fontSize: 15),),
          color: Colors.pink,
          height: 60,
        ),
        ),
        Container(
          child: Text('Hello',style: TextStyle(fontSize: 15),),
          color: Colors.purple,
          height: 60,
        ),
        Container(child: Icon(Icons.add,size: 60),color: Colors.red,),
        Container(child: Icon(Icons.ac_unit,size: 40),color: Colors.green,),
        Container(child: Icon(Icons.access_alarm,size: 20),color: Colors.blue,),
      ],
    );
  }
}

二、Flutter布局之Stack

2.1 Stack层叠式布局使用总结

  • Stack层叠式布局
  • 当在Stack中使用时,Alignment 属性会取最大的Container的area,取相对位置
  • Positioned位置组件
class StackDemo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // 1.Stack 层叠式布局
    return Stack(
      // 2.取最大的Container的area,取相对位置
      // alignment: Alignment(0.0, -1.0),
      children: <Widget>[
        //3.位置组件
        Positioned(
          child: Container(
            color: Colors.red,
            width: 200,
            height: 200,
          ),
        ),
        Positioned(
          right: 0,
          child: Container(
            color: Colors.green,
            width: 100,
           height: 100,
          ),
        ),
        Positioned(
          left: 10,//相对于Stack的距离
          top: 20,//相对于Stack的top、向下20px
          child: Container(
            color: Colors.blue,
            width: 50,
           height: 50,
          ),
        ),
      ],
    );
  }
}

2.2 宽高约束比 AspectRatio

  • 使用AspectRatio 来设置宽高约束比例
class LayoutStack extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Container(
      color: Colors.white,
      alignment: Alignment(0.0, 0.0),
      child: Container(
        color: Colors.blue,
        width: 300,
        // AspectRatio用来设置宽高比例
        child: AspectRatio(
          aspectRatio: 2/1,
          child: Icon(Icons.add, size: 30,),
        ),
      ),
      // child: StackDemo(),
    );
  }
}

三、Flutter的状态管理

3.1 状态管理使用总结

  • 当定义一个StatefulWidget状态部件时,需要重写createState方法,
  • floatingActionButton悬浮按钮 onPressed 为响应事件
  • 当操作按钮时、UI上数据没有刷新、
    • 点击调试控制台上的 hot reload就会更新数据
    • 也可调用setState 方法,从新调用createState渲染方法,来刷新数据
import 'package:flutter/material.dart';
class StateManagerDemo extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _StateManager();
  }
}
  • 创建_StateManager子类继承于State状态管理类,并通过范型约束当前State为StateManageDemo类.
//1.StateManagerDemo这个类的状态管理者
class _StateManager extends State<StateManagerDemo> {
  int count = 0;
  //重写build渲染方法
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('StateManagerDemo'),
      ),
      body: Center(
          child: Chip(label: Text('$count'),)
      ),
      // 2.悬浮按钮: 当操作按钮时、UI上数据没有刷新、点击 hot reload就会更新数据。
      floatingActionButton: FloatingActionButton(
        child: Icon(Icons.add),
        //3.按钮的响应方法
        onPressed: () {
          count += 1;
          // 4.调用该方法、就会重新调用渲染方法、刷新UI数据
          setState(() {});
          print('count = $count');
        },
      ),
    );
  }
}
  1. StateManagerDemo这个类的状态管理者
  2. 悬浮按钮: 当操作按钮时、UI上数据没有刷新、点击 hot reload就会更新数据
  3. 按钮的响应方法onPressed
  4. 调用该方法、就会重新调用渲染方法、刷新UI数据; setState(() {});

四、项目搭建之底部TabBar

1.首先创建一个wechat_demo的Flutter项目

  • 将要设置的TabBar根页面抽离成为一个模块叫做 rootpage
  • 因此main主程序入口调用如下:
import 'package:flutter/material.dart';
import 'rootpage.dart';

void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "Flutter Demo",//1.针对Android的title,可以设置后台显示的应用名称和主界面不一致
      theme: ThemeData(primarySwatch: Colors.blue),
      home: RootPage(),
    );}
}
  • 在rootpage中的实现为
import 'package:flutter/material.dart';
class RootPage extends StatefulWidget {
  const RootPage({Key? key}) : super(key: key);
  @override
  State<RootPage> createState() => _RootPageState();
}
class _RootPageState extends State<RootPage> {
  //6.设置当前BarItems的默认选中Item, 当某一个被选中的时候,这个index值会发生变化.
  int _currentIndex = 0;
  @override
  Widget build(BuildContext context) {
    return  Container(
      child: Scaffold(
        //2.bottomNavigationBar相当于iOS中的TabBar
        bottomNavigationBar: BottomNavigationBar(
          //4.如果没有设置相应的type、那么默认情况下BarItem设置的都为白色.设置BarType之后默认为蓝色
          type: BottomNavigationBarType.fixed,
          //5.设置fixed类型后,需要添加一个填充色.这样一个TabBar就设置完毕了.
          fixedColor: Colors.green,
          //6.设置当前选中的值
          currentIndex: _currentIndex,
          //7.当前点击BarItem的响应事件, index为当前选中的Item
          onTap: (int index){
            //8.设置当前的索引为选中的Item索引
             _currentIndex = index;
             //9.刷新数据
            setState(() {});
          },
          //3. 这里相当于tabbarItem
          items: const <BottomNavigationBarItem>[
            BottomNavigationBarItem(icon: Icon(Icons.chat), label: "微信",),
            BottomNavigationBarItem(icon: Icon(Icons.bookmark), label: "通讯录",),
            BottomNavigationBarItem(icon: Icon(Icons.history), label: "发现",),
            BottomNavigationBarItem(icon: Icon(Icons.person_outline), label: "我",),
          ],
        ),),);
  }
}
  1. 在MaterialApp属性中,针对Android的title,可以设置后台显示的应用名称和主界面不一致
  2. Scaffold中的bottomNavigationBar相当于iOS中的TabBar
  3. Scaffold中的items需要设置BottomNavigationBarItem相当于TabBarItem.
  4. bottomNavigationBar中如果没有设置相应的type、那么默认情况下BarItem设置的都为白色.设置BottomNavigationBarType之后默认为蓝色
  5. bottomNavigationBar中设置fixed类型后,需要添加一个填充色.这样一个TabBar就设置完毕了.
  6. bottomNavigationBar中的currentIndex设置当前选中的值
  7. bottomNavigationBar中的onTap: 当前点击BarItem的响应事件, index参数为当前选中的Item
  8. onTap中设置当前的索引为选中的Item索引
  9. onTap响应事件中设置setState刷新UI数据

展示效果如下

五、总结

  1. 布局方面有三种布局方式
    1. Row横向
    2. Column纵向
    3. Stack层级
  2. 在横向和纵向布局中有主轴和交叉轴的概念
  3. Positioned 位置小部件,可以在布局的Children中使用,设置相对布局.
  4. Alignment(x,y) 取值范围为 -1.0 ~ 1.0
  5. 宽高比 AspectRatio
  6. 状态管理: 所有的界面都是不可变的(无状态的);
    • State是一个状态管理者,可以用来刷新界面,继承于StatefulWidget(描述外观的).当数据发生变化时,通过setState将界面重新渲染.
  1. 搭建项目
    1. Scaffold中的bottomNavigationBar相当于iOS中的TabBar
    2. Scaffold中的items需要设置BottomNavigationBarItem相当于TabBarItem.
    3. bottomNavigationBar中如果没有设置相应的type、那么默认情况下BarItem设置的都为白色.设置BottomNavigationBarType之后默认为蓝色
    4. bottomNavigationBar中设置fixed类型后,需要添加一个填充色.这样一个TabBar就设置完毕了.
    5. bottomNavigationBar中的currentIndex设置当前选中的值
    6. bottomNavigationBar中的onTap: 当前点击BarItem的响应事件, index参数为当前选中的Item
    7. onTap中设置当前的索引为选中的Item索引
    8. onTap响应事件中设置setState刷新UI数据

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

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

相关文章

Mysql索引(1):索引概述

1 介绍 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&#xff0c; 这样就可以在这些数据结构上…

【半监督学习】Match系列.1

半监督学习(SSL) 半监督学习(SSL). 让学习器不依赖外界交互、自动地利用未标记样本来提升学习性能. 即在少量样本标签的引导下, 能够充分利用大量无标签样本提高学习性能, 避免了数据资源的浪费, 同时解决了有标签样本较少时监督学习方法泛化能力不强和缺少样本标签引导时无监…

YoloV8涨点神器:CFPNet-ECVBlock的小目标检测,即插即用,助力检测涨点

1.Centralized Feature Pyramid for Object Detection 论文地址: https://arxiv.org/abs/2210.02093 1.摘要: CFPNet简介 CFPNet即插即用,助力检测涨点,YOLOX/YOLOv5/YOLOV7均有效 1.3 Centralized Feature Pyramid (CFP) 如图2所示,CFP主要由以下部分组成:输入图像、…

<IBM AIX><ERRPT><No.001>《出现E86653C3、49183216、8003764C告警的处理 20230506》

《出现E86653C3、49183216、8003764C告警的处理 20230506》 1 现象2 分析3 结论4 引申 1 现象 服务器出现errpt告警&#xff0c;告警为E86653C3、49183216、8003764C。 2 分析 1、hdisk1对应的VG&#xff0c;为rootvg。 lspv |grep hdisk12、查看VG状态 lsvg rootvg说明…

聊聊压电材料高温介电温谱仪所知道的那些事(GWJDN-600A)

GWJDN-600A型压电材料高温介电温谱仪 关键词&#xff1a;单通道&#xff0c;双通道&#xff0c;四通道&#xff0c;高低温 GWJDN-600A压电材料高温介电温谱仪本高频介电温谱系统主要用于绝缘材料在不同温度不同频率下的电学性能测试&#xff0c;系统包含高温炉膛&#xff0c;阻…

【云原生】k8s集群部署Rook+Ceph云原生存储

文章目录 一、Rook介绍二、Ceph介绍三、部署Rook和Ceph3.1 前置准备3.2 部署Rook3.3 部署Ceph集群3.4 部署ceph dashboard 四、部署Rook工具箱五、部署RBD StorageClass 一、Rook介绍 Rook 官网地址&#xff1a;https://rook.io 是一个自管理的分布式存储编排系统&#xff0c;…

c++基础学习Num04

目录 基于for循环 一维数组 二维数组理解 c语言的null和c的null 基于for循环 for(ELEMTYPE val:array){}ELEMTYPE:是范围变量的类型。通常使用auto自动转换范围变量类型 val:范围变量的名称。通过迭代依次接收数组中的元素值 array:容器&#xff0c;注意这里的array必须是…

ctfshow 每周大挑战 RCE极限挑战 2

目录 题目解题步骤1.跑一下正则2.变量自增3.最终解题payload 一点多余的思考 题目 解题步骤 1.跑一下正则 本着能懒就懒的原则&#xff0c;就不写Python了&#xff08;提一下这个主要是我一开始想的是写Python呜呜呜&#xff09;&#xff0c;直接写php&#xff0c;还能复制粘…

C生万物 | 指针入门到进阶就看这篇了【十万字吐血整理,收藏学习】

文章篇幅较长&#xff0c;可前往电脑端进行学习&#x1f4bb; 之前很多粉丝私信我说C语言指针怎么这么难&#xff0c;看了很多视频都学不懂&#xff0c;于是我写了一篇有关指针从入门到进阶的教学&#xff0c;帮助那些对指针很困扰的同学有一个好的学习途径&#xff0c;下面是本…

基于JavaWeb实现的学生宿舍管理系统

【简介】 本系统是基于Java实现的学生宿舍管理系统&#xff0c;前端&#xff1a;Vue&#xff1b;后端&#xff1a;SpringBoot Mybatis Redis Mysql&#xff1b;系统环境&#xff1a;jdk1.8 | mysql | redis | nodejs14。有包含登录在内的十大功能模块&#xff0c;三个访问角…

详解事务模式和 Lua 脚本,带你吃透 Redis 事务

先说结论&#xff1a; Redis 的事务模式具备如下特点&#xff1a; 保证隔离性&#xff1b;无法保证持久性&#xff1b;具备了一定的原子性&#xff0c;但不支持回滚&#xff1b;一致性的概念有分歧&#xff0c;假设在一致性的核心是约束的语意下&#xff0c;Redis 的事务可以…

Vuex从了解到实际运用(一)彻底搞懂什么是Vuex

vuex从了解到实际运用——彻底搞懂什么是vuex 知识回调&#xff08;不懂就看这儿&#xff01;&#xff09;场景复现核心干货什么是vuex全局状态管理使用状态管理工具后的好处vuex的实现原理vuex的组件通信1.多级组件通信2.同级组件通信使用vuex进行组件通信 关于vuex的小结 知识…

总结842

学习目标&#xff1a; 5月&#xff08;张宇强化18讲&#xff0c;背诵25篇短文&#xff0c;熟词僻义300词基础词&#xff09; 每日必复习&#xff08;5分钟&#xff09; 学习内容&#xff1a; 暴力英语:背200个基础词阅读理解前两段语法 高等数学&#xff1a;强化课第一讲 小…

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的Pow伽马变换算法增强(C#)

Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的Pow伽马变换算法增强&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机使用图像算法增加图像的技术背景Baumer工业相机通过BGAPI SDK联合Halcon使用Pow伽马变换增强算法1.引用合适的类文件2.BGAPI SDK在图…

gtest之断言

目录 普通断言EXPECT_THAT 布尔条件断言EXPECT_TRUEEXPECT_FALSE 二进制断言EXPECT_EQEXPECT_NEEXPECT_LTEXPECT_LEEXPECT_GTEXPECT_GE 字符串比较EXPECT_STREQEXPECT_STRNEEXPECT_STRCASEEQEXPECT_STRCASENE 浮点型比较EXPECT_FLOAT_EQEXPECT_DOUBLE_EQEXPECT_NEAR 显式成功与…

k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容

文章目录 一、基本介绍二、应用程序生命周期2.1 部署应用2.2 应用升级2.2.1 修改YAML文件升级&#xff08;交互式&#xff09;2.2.2 命令指定镜像版本升级&#xff08;免交互式&#xff09;2.2.3 调用vim升级 2.3 滚动升级2.3.1 升级流程 2.4 应用回滚2.4.1 查看历史发布版本2.…

yolov5配置错误记录

这里是直接没有找到数据集&#xff0c;说明是路径错误。经过设置yaml后&#xff0c; # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: ../autodl-tmp/datasets/neu # dataset root dir tr…

闲鱼/支付宝 自动收货诈骗套路分析

闲鱼/支付宝 自动收货套路分析 他人闲鱼被骗经历 最近发现闲鱼有一种“自动收货”的套路&#xff0c;就是在闲鱼下单后&#xff0c;卖家发一个二维码&#xff0c;称让你支付运费&#xff0c;该二维码以闲鱼之类的logo为诱惑&#xff0c;让你相信是真的运费支付二维码 正如上文知…

Self-Attention结构细节及计算过程

一、结构 上面那个图其实不是那么重要&#xff0c;只要知道将输入的x矩阵转换成三个矩阵进行计算即可。自注意力结构的输入为 输入矩阵的三个变形 Q&#xff08;query矩阵&#xff09;、K&#xff08;key矩阵&#xff09;、V&#xff08;value矩阵&#xff09;构成&#xff0c;…

Java企业级信息系统02—利用组件注解符精简spring配置文件

文章目录 一、学习目标二、打开01的项目三、利用组件注解符精简spring配置文件&#xff08;一&#xff09;创建新包&#xff0c;复制四个类&#xff08;二&#xff09;修改杀龙任务类&#xff08;三&#xff09;修改救美任务类&#xff08;四&#xff09;修改勇敢骑士类&#x…