Flutter-UI

一、Widget

在flutter中大部分类都是继承于widget,widget的作用就是描述一个UI的配置数据。可以这样说,flutter就是一个个widget以树形结构构建的UI。

widget分为statefulWidget和statelessWidget。statelessWidget不需要维护状态的变化,而statefulWidget需要维护状态的变化。选择的标准:是否需要重绘制widget。重点看下statefulWidget。
statefulWidget.png
  • 从上面的代码可以看出,一个statefulWidget类会对应有一个State类
  • state可以在build的时候同步被读取
  • state可以在生命周期期间被改变,当state改变的时候,会调用setState()方法通知Flutter Framework去改变,当Flutter Framework接受到消息之后,会重新buildUI树,从而达到更新UI的作用

二、state生命周期

  1. void initState( ) { } // 初始化状态,只执行一次
  2. void didChangeDependencies( ) { } // 当widget依赖的对象发生变化时调用,例如全局的主题或者语言等
  3. void didUpdateWidget( covariant T oldWidget ) { } // 当widget重新构建的时候调用,根据canUpdate方法判断
  4. void build( ) { } // 构建UI
  5. void reassemble( ) { } // 调试模式下,热重载执行,release模式下不会执行
  6. void deactivate( ) { } // 当widget被移除的时候调用
  7. void dispose( ) { } // 当widget永久一处的时候调用,可以作为释放资源


    state图解.png

三、基础的控件Widget

flutter除了提供一套基础的widget,还提供了一套Material风格(android风格)和Cupertino风格(iOS风格),官网:https://api.flutter.dev/flutter/material/material-library.html

1、Text

Tip:显示文本,有些样式属性和android的textView类似,例如对齐、大小、颜色等

  • 使用方法
Text(‘这是一个文本信息’)
  • 属性介绍
属性 含义
style 样式,TextStyle类型,可以设置文本的颜色,大小,背景颜色
textAlign 对齐方式,TextAlign.left/center/right
textDirection 文本方向,TextDirection.ltr/rtl,从左到右/从右到左
softWrap 是否自动换号
overflow 当softWrap设置成false的时候,显示不全的文字以什么样子展示。TextOverflow.clip/fade/ellipsis/visible,多余部分剪裁/越来越透明/省略号结尾/一直显示会超出父视图
textScaleFactor 文字缩放系数

2、按钮

Tip:Material库提供了很多按钮,例如ElevatedButton、TextButton、OutlinedButton等,这些都是直接或者间接对ButtonStyleButton
的包装定制,所以大多数属性和ButtonStyleButton一样。另外所有的MaterialButton都有两个共同特征:1、按下时会有水波动画 2、都有一个onPress回调方法,若不提供回调方法,则按钮时禁止状态,不响应用户点击

button.png

  • 使用方法
      ElevatedButton(
            onPressed: () {},
            child: Text('ElevatedButton'),
       )
      OutlinedButton(
            onPressed: () {},
            child: Text('OutlinedButton'),
       )
      TextButton(
            onPressed: () {},
            child: Text('TextButton'),
       )
  • 属性说明
    Button的样式根据它的属性style通过MaterialStateProperty设置,MaterialStateProperty具有以下属性
属性 含义
textStyle 字体样式
backgroundColor 背景颜色
foregroundColor 字体颜色
overlayColor 高亮颜色,当按钮处于focused, hovered, or pressed时的颜色
shadowColor 阴影颜色
elevation 阴影值
padding 间距
minimumSize 最小尺寸
side 边框
shape 形状
mouseCursor 鼠标停留在上面时
visualDensity 按钮布局紧凑程度
tapTargetSize 相应区域
animationDuration 【shape】和【elevation】的动画更改时间
enableFeedback 检测手势是否提供音效提示

3、图片

Tip:使用Image来加载并显示图片,Image的数据源可以是asset、文件、内存或者网络。ImageProvider是一个抽象类,主要定义了图片数据获取的接口load( ),从不同的数据源中获取数据。如AssetImage可以加载本地图片资源,NetworkImage可以加载网络图片。

  • 加载本地图片
Image(image: AssetImage(‘assets/images/cat.webp’)) //注意此处是图片相对路径
Image.asset(‘assets/images/cat.webp’)
  • 加载网络图片
Image(image: NetworkImage(‘https://img0.baidu.com/it/u=3870964477,3746012709&fm=26&fmt=auto&gp=0.jpg’))
Image.network(‘https://img0.baidu.com/it/u=3870964477,3746012709&fm=26&fmt=auto&gp=0.jpg’)
  • 系统图标
Icon(Icons.ac_unit)
  • Image其他属性
属性 含义
width 宽度
height 高度
fit 填充方式,fill(完全填充)、contain(等比拉伸,直至一边充满),Cover(等比拉伸,直至两边充满,可能有一边超出)、fitwidth(等比拉伸,宽充满)、fitHeight(等比拉伸,高度充满)、None(当组件比图片小时,不拉伸,超出范围截取)、scaleDown(当组件比图片小时,图片等比缩放,效果和contain一样)
repeat 重复模式,repeat(x,y方向都重复)、repeatX(x方向重复)、repeatY(Y方向重复)、noRepeat(不重复)
frameBuilder 加载图片的回调
loadingBuilder 图片加载进度,相比frameBuilder更加精细

4、输入框

  • 使用方法
TextField(
          maxLength: 11,
          decoration: InputDecoration(
              enabledBorder: OutlineInputBorder(
                /*边角*/
                borderRadius: BorderRadius.all(
                  Radius.circular(30), //边角为30
                ),
                borderSide: BorderSide(
                  color: Colors.amber, //边线颜色为黄色
                  width: 2, //边线宽度为2
                ),
              ),
              isDense: true,
              icon: Icon(Icons.ten_k),
              labelText: '手机号',
              hintText: '请输入手机号',
              helperText: '请输入数字',
              prefixIcon: Icon(Icons.phone),
              suffixIcon: Icon(Icons.remove_red_eye)),
          inputFormatters: <TextInputFormatter>[
            FilteringTextInputFormatter.digitsOnly
          ],
        )
textField.png
  • 属性介绍
属性 含义
controller 控制器,控制输入框文字 ,一般需要自己设置来获取输入框文字
focusNode 用于控制TextField是否占有当前键盘的输入焦点
decoration 用于控制输入框外观,如提示文本、背景、边框等
keyboardType 键盘类型, text(文本输入)、 multiline(多行文本,需要配合 maxLines使用)、number(数字)、phone(电话)、dateTime(日期)、emailAddress(电子邮箱)、url(网址)
style 正在编辑的文本样式
textAlign 输入文字的对齐方式
autofocus 是否自动获取焦点
obscureText 是否隐藏正在输入的文字
maxLines 最大行数
maxLength 最大长度
maxLengthEnforced 决定达到最大长度之后是否阻止输入,默认true
onChanged 输入框文字发生改变时的回调
onSubmitted 输入框完成或者搜索的时候回调,带有参数
onEditingComplete 输入框完成或者搜索的时候回调,没有参数
inputFormatters 用于输入内容检测
cursorWidth 光标宽度
cursorRadius 光标圆角
cursorColor 光标颜色

End:代码之技在于练

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容