Flutter学习日记-log3
本文最后更新于:2 年前
日志随笔
一、复习
- 命名路由
- 路由传参
二、状态管理
Widget管理自身状态- 父
Widget管理子Widget状态,在子Widget上包裹一层父Widget,子Widget把状态调整的方法对外提供成参数给父WidgetGestureDetector手势,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,从网络加载图片使用NetworkImagefit属性fill:会拉伸填充满显示空间,图片本身长宽比会发生变化,图片会变形。cover:会按图片的长宽比放大后居中填满显示空间,图片不会变形,超出显示空间部分会被剪裁。contain:这是图片的默认适应规则,图片会在保证图片本身长宽比不变的情况下缩放以适应当前显示空间,图片不会变形。fitWidth:图片的宽度会缩放到显示空间的宽度,高度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。fitHeight:图片的高度会缩放到显示空间的高度,宽度会按比例缩放,然后居中显示,图片不会变形,超出显示空间部分会被剪裁。none:图片没有适应策略,会在显示空间内显示图片,如果图片比显示空间大,则显示空间只会显示图片中间部分。

Flutter框架对加载过的图片是有缓存的(内存),默认最大缓存数量是1000,最大缓存空间为100M,此处暂不学习
2. 图标
Flutter默认包含了一套Material Design的字体图标iconfont,pubspec.yaml文件中配置默认打开,官网地址:https://material.io/tools/icons/
4、单选和复选框
SwitchCheckbox
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都继承自FlexExpanded可以按比例“扩伸”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
未完待续