Flutter
起步
安装
bash
git clone https://github.com/flutter/flutter.git
git clone -b stable https://gitee.com/mirrors/Flutter.git flutter
flutter --version
flutter doctor -v- 从GitHub 下载 Flutter 源码,可以使用第二个镜像,速度会快很多
- 配置环境变量
- 在
path环境变量下添加flutter/bin,如【D:\soft\flutter\bin】 - 添加环境变量:名称【
PUB_HOSTED_URL】值【https://pub.flutter-io.cn】 - 添加环境变量:名称【
FLUTTER_STORAGE_BASE_URL】值【https://storage.flutter-io.cn】
- 在
- 第一次正常初始化 Flutter 工具链,因为之前从 GitHub 下的 zip 缺少缓存文件,Flutter 会自动补齐运行必需的 Dart SDK、编译命令行工具、更新内部依赖,走完这一次,以后再执行 flutter --version 就会秒出版本,不再下载。
flutter doctor会全自动检测本地开发环境所有依赖,逐项校验:- Flutter SDK 本身是否正常
- Dart 版本匹配情况
- Git 是否可用
- Android SDK、Android 许可证、模拟器
- Windows 开发依赖(VS、Visual Studio)
- Chrome 浏览器、VS Code / Android Studio 编辑器插件
创建一个Flutter项目
先从web项目进行起步,使用下面命令创建一个项目,同时进行启动项目,可以看到这是一个简单计数器的一个功能Demo,运行命令通过-d可以指定运行环境,这里指定为chrome
bash
flutter create --platforms web my_flutter
cd my_flutter
flutter run -d chrome在WebStorm下使用flutter,安装一个Flutter插件,如果安装失败可以在https://plugins.jetbrains.com/search下载后再解压进行安装
- 运行
flutter devices命令,可以看到当前支持的运行环境
目录简单说明
.dart_tool- build:编译输出目录
- lib
main.dart: 入口文件
- test:测试目录
- web:web平台特定的配置和资源文件
- metadata:Flutter 元数据文件(自动生成)
- analysis_options.yaml:静态代码分析配置文件
- flutter_core.iml:用于存储模块(Module)的特定设置
- pubspec.yaml:项目配置文件
widget & 组件
MaterialApp + Scaffold
自定义组件 —— 无状态&有状态
- 无状态组件
- 继承
StatelessWidget类,重写build方法 - 只有一个生命周期方法
build
- 继承
- 有状态组件
- 继承
StatefulWidget类,重写createState方法,返回一个新组件 - 新组件继承
State类,类型为第一个组件的泛型,重写build方法 - 第一个类用来渲染,第二个类用来做动态数据处理&展示
- 生命周期
- 创建阶段
createState():Widget初始化调用,创建State对象initState():State对象插入Widget树立刻执行,仅执行一次didChangeDependencies():initState后立刻执行,当所依赖的InheritedWidget更新时调用,可能多次
- 构建与更新阶段
build():构建UI方法,初始化或更新后多次调用didUpdateWidget():父组件传入新配置时调用,用于比较新旧配置
- 销毁阶段
deactivate():当State对象从树中暂时移除时调用dispose():当State对象被永久移除时调用,释放资源,仅执行一次
- 创建阶段
- 继承
- 通过快捷键
stless和stful可以快速创建无状态、有状态组件 stanim带动画控制器的有状态组件,自带AnimationController模板
布局组件
| 组件类别 | 核心组件 | 主要特点 / 使用场景 |
|---|---|---|
| 基础容器 | Container Center Align Padding | 提供装饰、对齐、边距等基础样式和布局控制,是使用频率极高的组件 |
| 线性布局 | Row Column | 在水平或垂直方向线性排列子组件,是构建界面的基础 |
| 弹性布局 | Flex Expanded Flexible | 按照比例分配剩余空间,实现自适应布局,常与 Row 和 Column 配合使用 |
| 层叠布局 | Stack Positioned | 让子组件重叠堆叠,用于实现如图片上叠加文字、悬浮按钮等效果 |
| 流式布局 | Wrap Flow | 当主轴空间不足时自动换行或换列,常用于标签、滤镜等动态宽高内容的排列 |
| 滚动布局 | ListView GridView | 提供可滚动的列表或网格视图,高效展示大量数据 |
内容组件
- Text
- Image
- TextField
滚动组件
| 组件 | 特点 | 使用场景 |
|---|---|---|
| SingleChildScrollView | 让单个子组件可以滚动,所有内容一次性渲染 | 长表单、设置页、内容不固定但是总量不多的页面 |
| ListView | 线性列表,通过 builder 可以实现懒加载,性能优异 | 聊天记录、新闻、常见的单列滚动的数据列表 |
| GridView | 网格布局列表,支持懒加载,可以固定列数 | 图片墙、商品网格、应用图标列表 |
| CustomScrollView | 复杂布局方案,通过组合多个 Sliver 组件实现滚动 | 电商首页、社交 App 个人主页多个滚动紧密联动 |
| PageView | 整页滚动效果,支持横向和纵向 | 应用引导页、图片轮播图、书籍翻页 |
事件 Tap
组件通信
| 通信方式 | 方向 | 场景 |
|---|---|---|
| 构造函数 | 父传子 | |
| 回调 | 子传父 | |
| InheritedWidget | 祖先-->后代 | 跨层级数据共享 |
| Provider | 任意组件之间 | 状态管理推荐方案 |
| EventBus | 任意组件之间 | 全局事件通信 |
| Bloc、Riverpod | 任意组件之间 | 复杂状态管理 |
网络请求 Dio
bash
flutter pub add dioRouter 路由
- 基本路由
- 命名路由
Project 实战
项目结构
| 目录 | 说明 |
|---|---|
| api | 接口目录 |
| assets | 静态资源目录 |
| components | 组件目录 |
| constant | 常量目录 |
| pages | 页面目录 |
| router | 路由目录 |
| stores | 状态管理目录 |
| types | 类型定义目录 |
| utils | 工具目录 |
| index.dart | 入口文件 |
项目重、难点
- 轮播图组件
carousel_slider - 下拉刷新:
RefreshIndicator - 上拉加载:通过controller监听滚动位置,判断是否滚动到底部,然后请求数据
- GlobalKey
GlobalKey<T> - 状态管理:
GetX - Token持久化
- 退出登录弹框
- loading...
Android 适配
- 安装JDK
- JDK 21 x64 Compressed Archive
- 解压后配置环境变量:
JAVA_HOME值为刚解压的路径 - 再在path环境变量下添加:
%JAVA_HOME%\bin
- 解压后配置环境变量:
- IntelliJ IDEA
- JDK 21 x64 Compressed Archive
- 安装 Android Studio
- 选择自定义安装,更改SDK路径【改到c盘以外】后面都是默认选下一步即可,等待安装
- 在setting里面选择android sdk --> sdk tools --> 勾选 Android SDK Command-line Tools (latest) 进行安装
- 从上一步安装这里复制Android SDK Location路径来进行配置环境变量
ANDROID_HOME - 运行命令:
flutter doctor --android-licenses一直同意协议 - 安装Virtual Device Manager虚拟设备,这里就选一个Pixel 9 Pro然后进行安装【大小在2g左右,耗时比较久】
- 上两步弄好之后,通过命令查看状态:
flutter doctor -v - 补全其他平台代码:
flutter create . - 修改配置:
android/gradle/wrapper/gradle-wrapper.properties的distributionUrl改为国内镜像地址distributionUrl=https\://mirrors.cloudflare.com/gradle/gradle-9.1.0-all.zip
- 添加网络权限:
android/app/src/main/AndroidManifest.xml<user-permission android:name="android.permission.INTERNET"/>
- 添加maven配置:
android/settings.gradle.kts
kts
maven { url = uri("https://maven.aliyun.com/repository/google") }
maven { url = uri("https://maven.aliyun.com/repository/releases") }
maven { url = uri("https://maven.aliyun.com/repository/central") }
maven { url = uri("https://maven.aliyun.com/repository/public") }
maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin") }
maven { url = uri("https://maven.aliyun.com/repository/apache-snapshots") }
maven { url = uri("https://maven.aliyun.com/nexus/content/groups/public/") }
maven { url = uri("https://jitpack.io") }