Flutter学习日记-log3
本文最后更新于:2 年前
日志随笔
一、复习
- 命名路由
- 路由传参
二、状态管理
Widget
管理自身状态- 父
Widget
管理子Widget
状态,在子Widget
上包裹一层父Widget
,子Widget
把状态调整的方法对外提供成参数给父Widget
GestureDetector
手势,onTap
等方法Container
绘制矩形区域,decoration
属性设置背景、边框等,decoration
里面color
字段和Container
本身的color
字段不能同时设置,会报错,使用padding
调整位置,或者使用Center
包裹居中
- 混合管理状态
- 全局状态管理,例如国际化等操作,此处暂不学习
1 |
|
三、组件和组件样式
1、文本
- 基础样式:
textAlign
、maxLines
、overflow
、textScaleFactor
等 - 高级一点的直接定制
TextStyle
属性 TextSpan
实现富文本样式DefaultTextStyle
样式继承- 字体:使用
Google Fonts
中的字体,首先在pubspec.yaml
中声明,然后通过TextStyle
属性使用
2、按钮
此处学习基于
Android
端的Material
组件,所有Material
库中的按钮都是直接或间接的RawMaterialButton
组件的包装定制,都有如下相同点:
- 按下时都会有“水波动画”(又称“涟漪动画”,就是点击时按钮上会出现水波荡漾的动画)
- 有一个
onPressed
属性来设置点击回调,当按钮按下时会执行该回调,如果不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击
RaisedButton
漂浮按钮,文字+图标FlatButton
扁平按钮,文字+图标highlightColor
和splashColor
冲突,前者设置后,后者的效果就没了,暂不研究shape
属性是ShapeBorder
类的,但ShapeBorder
不直接使用,应该使用该类的子类,子类提供了具体的样式效果1
2
3
4
5
6
7
8
9
10
11
12
13
14const FlatButton({
...
@required this.onPressed, //按钮点击回调
this.textColor, //按钮文字颜色
this.disabledTextColor, //按钮禁用时的文字颜色
this.color, //按钮背景颜色
this.disabledColor,//按钮禁用时的背景颜色
this.highlightColor, //按钮按下时的背景颜色
this.splashColor, //点击时,水波动画中水波的颜色
this.colorBrightness,//按钮主题,默认是浅色主题
this.padding, //按钮的填充
this.shape, //外形
@required this.child, //按钮的内容
})
OutlineButton
边框按钮,文字+图标IconButton
图标按钮,没有文字
1 |
|
3、图片和图标
1. 图片
ImageProvider
是一个抽象类,从不同的数据源获取图片使用不同的方法,从Asset
中加载图片使用AssetImage
,从网络加载图片使用NetworkImage
fit
属性fill
:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。cover
:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。contain
:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。fitWidth
:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。fitHeight
:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。none
:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。
Flutter
框架对加载过的图片是有缓存的(内存),默认最大缓存数量是1000
,最大缓存空间为100M
,此处暂不学习
2. 图标
Flutter
默认包含了一套Material Design
的字体图标iconfont
,pubspec.yaml
文件中配置默认打开,官网地址:https://material.io/tools/icons/
4、单选和复选框
Switch
Checkbox
5、输入框
onChange
方法通知输入框文本发生变化- 创建
TextEditingController
控制器,绑定输入框- 设置占位文本,比输入框本身的属性优先级高
- 获取绑定的输入框内的文本
- 创建
FocusNode
,绑定输入框,来控制键盘焦点
6、Form
表单
Form
表单是基于输入框封装的一个功能更完善的控件,需要对应TextFormField
的使用,可以实现validate
方法对所有输入框条件的一键验证
1 |
|
7、进度条指示器
1 |
|
四、布局
1、线性布局(Row
和Column
)
Row
和Column
会在主轴方向占用尽可能大的空间,而纵轴的长度则取决于他们最大子元素的长度- 如果
Row
里面嵌套Row
,或者Column
里面再嵌套Column
,那么只有最外面的Row
或Column
会占用尽可能大的空间,里面Row
或Column
所占用的空间为实际大小
2、弹性布局(Flex
)
Row
和Column
都继承自Flex
Expanded
可以按比例“扩伸”Row
、Column
和Flex
子组件所占用的空间Spacer
的功能是占用指定比例的空间
3、流式布局(Wrap
和Flow
)
- 超出屏幕显示范围会自动折行的布局称为流式布局
- 一般很少会使用
Flow
4、层叠布局(Stack
和Positioned
)
Stack
允许子组件堆叠Positioned
用于根据Stack
的四个角来确定子组件的位置Stack
和Positioned
最好一起搭配使用
5、对齐与相对定位(Align
)
1. Alignment
Alignment
会以矩形的中心点作为坐标原点,即Alignment(0.0, 0.0)
,x
、y
的值从-1
到1
分别代表矩形左边到右边的距离和顶部到底边的距离- 计算公式:
(Alignment.x*childWidth/2+childWidth/2, Alignment.y*childHeight/2+childHeight/2)
2. FractionalOffset
FractionalOffset
继承自Alignment
,它和Alignment
唯一的区别就是坐标原点不同,FractionalOffset
的坐标原点为矩形的左侧顶点- 计算公式:
实际偏移 = (FractionalOffse.x * childWidth, FractionalOffse.y * childHeight)
3. Align
和Stack
对比
- 定位参考系统不同
Stack
可以有多个子元素,并且子元素可以堆叠,而Align
只能有一个子元素,不存在堆叠Center
继承自Align
,可以认为Center
组件其实是对齐方式确定(Alignment.center)
了的Align
未完待续