Flutter 中所有的UI界面都是widget构建的。widget用来描述元素配置数据,然后会被渲染成对应UI界面。 当widget的状态修改时, 它会重新渲染UI。
widget
Flutter 官网对 widget 描述
Flutter从React中吸取灵感,通过现代化框架创建出精美的组件。它的核心思想是用widget来构建你的UI界面。 Widget描述了在当前的配置和状态下视图所应该呈现的样子。当widget的状态改变时,它会重新构建其描述(展示的 UI),框架则会对比前后变化的不同,以确定底层渲染树从一个状态转换到下一个状态所需的最小更改。
一个新的组件通常是继承 StatelessWidget 或 StatefulWidget
- StatelessWidget 是状态不可变的 widget, 其中的展示内容不会随着数据的变化而变化(非响应式)。
- StatefulWidget 可以进行状态管理, 数据更新, 页面中的内容可以随之变化(响应式)。
使用 StatefulWidget 时候, 对状态进行更改时候, 会触发 build 方法对组件进行重绘, 也会连同子组件的一起触发。当一个组件数据中途不需要更改的时候,尽可能的使用 StatelessWidget, 对性能有较好提升。或者将需要更新部分尽可能拆分成子节点。
基础 widget
Text
Text使用还是比较常用的,用于显示简单样式文本。
Text( |
使用自定义字体
# 定义好自定义字体文件 pubspec.yaml |
// 使用字体 |
有时我们还会需要一段文本中,可能需要不同的字体样式。这个时候可以使用 Text.rich 或者 RichText
Text.rich( |
Button
Flutter 内置了很多按钮,Material 中大致分为 RawMaterialButton 和 IconButton 两类
// RawMaterialButton 常见的有 RaisedButton / FlatButton / OutlineButton /FlatButton |
Image
Image 日常开发中的使用频率也非常高,Image 可以加载本地,网络,缓存的图片。
// 本地加载图片 需要在 pubspec.yaml 添加图片资源 |
Icon
使用内置图标,Flutter 内置提供了一套 material-icon 图标
//需要一个IconData类型图标数据 |
使用自定义图标
- 下载好图标文件
- 加入在项目中
- 在pubspec.yaml中引入字体文件ttf(不同版本的flutter可能有差异)
#pubspec.yaml
flutter:
fonts:
- family: IconFont
fonts:
- asset: asset/fonts/iconfont.ttf - 编写自定义 IconData 类型
//IconFont:是引入时候设置字体名称,0xe611 为对应图标的Unicode
IconData li = IconData(0xe611, fontFamily: 'IconFont') // 设置自定义IconData
Icon(
li,
size: 30,
color: Colors.black,
)
AppBar
AppBar 是一个顶端导航栏
AppBar({ |
布局类 widget
常用布局 widget 有 Row、Column、Flex、Warp、Flow、Stack、Positioned 等。
弹性布局
Flutter 使用的 Flex 模型基本上跟 CSS 类似。
//Row |
流式布局
在介绍 Row 和 Colum 时,如果子 widget 超出屏幕范围, 则会报溢出错误, 并不会自动换行。Flutter 中提供了 Wrap 和 Flow 来支持溢出部分后会自动折行。
// Wrap 的示例 |
Flow 布局需要一个 FlowDelegate 类型的 delegate 对象, 但是 Flutter 没有现成实现的类, 需要我们自己实现。
//继承FlowDelegate 只需要实现paintChildren 和 shouldRepaint |
叠层布局
Stack 结合 Positioned 进行叠层布局,和 css 中的绝对定位类似。Positioned 组件通过 left,top ,right,bottom 四个方向上的属性值来决定其在 Stack 中的位置。
Stack( |
对齐和相对定位
Align 组件可以调整子组件位置,同过一个 AlignmentGeometry 类型的值,表示子组件在父组件中的起始位
Container( |
Alignment 对应坐标系, |
容器类型
Container
Container 是一个组合类容器的组装的多功能容器。了解一个 Container 其他也就很清楚了
Container({ |
其他容器类
- SizedBox 固定宽高
- AspectRatio 宽高比
- UnconstrainedBox 取消限制