今天来学学更多的flutter的组件
弹性布局-Flex

Expanded
1 | import 'package:flutter/material.dart'; |

Flexible
1 | import 'package:flutter/material.dart'; |

Flex布局受其父组件传递的约束影响。确保父组件提供了适当的布局约束
Expanded与Flexible的区别:
——– Expanded强制子组件填满所有剩余空间,
——– Flexible根据自身大小调整,不强制占满空间
我们来练习一下
1 | import 'package:flutter/material.dart'; |

流式布局-Wrap

当子组件内容是根据数据动态生成时,使用wrap可以确保布局始终适配
1 | import 'package:flutter/material.dart'; |

List.generate是一个构造器,用于快速创建长度固定且每个元素可以通过索引号确定的列表语法:
List.generate(int count, E generator(int index), {bool growable: false})
层叠布局-Stack/Positioned


可以看出这个是层叠式的,一层叠一层

1 | import 'package:flutter/material.dart'; |
Positioned
1 | import 'package:flutter/material.dart'; |

还有一个很奇葩的玩法就是,我们在之前学习的padding这里可以用positioned来代替效果
首先先了解positioned的一个特性,如果我们同时输入上下左右四个方向
1 | Positioned( |
此时代码不会报错,而是子组件往四个方向延伸来覆盖容器

而且取值为0的时候甚至全部覆盖body
1 | Positioned( |

同理,我们也可以制造单方向延伸的条
1 | Positioned( |

文本组件-Text


1 | import 'package:flutter/material.dart'; |
我们普通的文字排列是默认的换行

但是我们也可以指定显示的行号
1 | import 'package:flutter/material.dart'; |

TextSpan
如果需要在同一段本中显示不同样式,可用Text.rich构造函数配合TextSpan来实现

1 | import 'package:flutter/material.dart'; |

图片组件-image


image.asset(本地资源)
pubspec.yaml启用图片文件夹
将资源assets功能启用
1 | assets: |
这个需要一些配置

例如我们将图片放到这个images文件夹

然后在main.dart中启用资源,同时重新run执行
1 | import 'package:flutter/material.dart'; |

当然也可以使用width和hight来控制图片的大小
1 | child: Image.asset("lib/images/01.png", width: 500, fit: BoxFit.contain), |
image.network(网络资源)
这个不需要在pubspec.yaml 直接使用就行了,把网址或者库粘贴进去
1 | Image.network('https://example.com/image.png') |
但是问题是,这个东西需要联网,否则图片会显示不出来, 除此之外, Android/HarmonyOS/iOS使用Image.network需要配置网络权限
而且如果图片的源头断了也不会显示出来
文本输入组件-TextField


这里我们可以写一个登录界面,使用有状态组件StatefulWidget(因为这个是动态刷新的)

1 | import 'package:flutter/material.dart'; |
常用滚动组件

SingleChildScrollView

包裹个组件,让单个组件具备滚动能
1 | import 'package:flutter/material.dart'; |
然后我们可以增加一个回到首页的按钮
1 | import 'package:flutter/material.dart'; |

其中这里面涉及的两个方法—jumpTo和animateTo这里细说一下
jumpTo(直接跳转)
1 | _scrollController.jumpTo(0); |
本质:瞬间跳转到指定滚动位置(没有动画)
参数只有一个
| 值 | 含义 |
|---|---|
0 |
顶部 |
_scrollController.position.maxScrollExtent |
底部 |
| 任意数字 | 指定位置 |
特点
- 不会有任何过渡效果
- 立即生效
- 用户体验比较“生硬”
- 适合:
- 初始化位置
- 强制修正滚动位置
- 不关心动画的场景
举例
1 | _scrollController.jumpTo( |
效果就是: 一点击直接“啪”一下到底,没有滚动过程
animateTo(动画平滑)
1 | animateTo( |
第一个参数offset(滚动位置)
| 值 | 含义 |
|---|---|
0 |
顶部 |
_scrollController.position.maxScrollExtent |
底部 |
| 任意数字 | 指定位置 |
这个和jumpTo是一样的
第二个参数duration(动画时长)
1 | Duration(seconds: 1) |
即动画持续时间为1秒
你可以这样写:
1 | Duration(milliseconds: 300) |
效果:
- 时间越短 → 越快
- 时间越长 → 越慢
第三个参数curves(动画曲线)
1 | Curves.bounceIn |
控制动画“运动方式”(非常重要)
常见曲线:
| 曲线 | 效果 |
|---|---|
Curves.linear |
匀速(最死板) |
Curves.ease |
平滑(推荐) |
Curves.easeIn |
先慢后快 |
Curves.easeOut |
先快后慢 |
Curves.easeInOut |
两头慢中间快 |
Curves.bounceIn |
弹跳进入(你现在用的) |
Curves.elasticOut |
弹簧效果 |
ListView


评论区