简介
- Flutter、Flutter Package、Dart、Flutter中文网、Flutter 实战
Flutter是Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过Dart语言开发 App,一套代码同时运行在 iOS 和 Android 平台移动开发中的跨平台技术

- AOT和JIT
- 程序主要有两种运行方式:静态编译与动态解释
静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT(Ahead of time),即”提前编译”解释执行的则是一句一句边翻译边运行,通常将这种类型称为JIT(Just-in-time),即”即时编译”- AOT程序的典型代表是用C/C++开发的应用,它们必须在执行前编译成机器码;而JIT的代表则非常多,如JavaScript、python等,事实上,所有脚本语言都支持JIT模式
- 一般认为只要需要编译,无论其编译产物是字节码还是机器码,都属于AOT。如Java、Python,它们可以在第一次执行时编译成中间字节码
- Flutter特性
- 基于JIT的快速开发周期:Flutter在开发阶段采用,采用JIT模式
- 基于AOT的发布包:Flutter在发布时可以通过AOT生成高效的ARM代码以保证应用性能
- 类型安全:由于Dart是类型安全的语言,支持静态类型检测
Dart的设计目标应该是同时借鉴了Java和JavaScript。Dart在静态语法方面和Java非常相似,如类型定义、函数声明、泛型等,而在动态特性方面又和JavaScript很像,如函数式特性、异步支持等- 其他如 React-Native、Weex和uni-app
安装及运行
安装
配置环境变量
1
2export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn安装git
- 下载Flutter SDK,解压,并将
%flutter_home%/bin设置到环境变量,执行flutter doctor看是否成功安装(可运行即可) Dart SDK已经捆绑在Flutter SDK中,故无需在单独安装Dart SDK- 安装Android SDK,参考android.md#安装
- 配置编辑器(任意一种, 均需安装插件Flutter、Dart): Android Studio/IntelliJ IDEA/VS Code
- vscode 还可安装 Awesome Flutter Snippets 和 Flutter Widget Snippets 的代码提示工具
- AS一般直接打开项目即可,如果 gradle 编译失败可以考虑单独打开项目下的 android 目录,查看编译日志
修改
%flutter_home%\packages\flutter_tools\gradle\flutter.gradle为国内镜像。否则编译项目报错Error running Gradle1
2
3
4
5
6
7
8
9
10
11
12
13repositories {
// 替换 google() 为阿里云镜像
maven { url = uri('https://maven.aliyun.com/repository/google') }
// 替换 mavenCentral() 为阿里云镜像
maven { url = uri('https://maven.aliyun.com/repository/central') }
// 可选:添加阿里云的公共仓库(包含 jcenter 等镜像)
maven { url = uri('https://maven.aliyun.com/repository/public') }
maven { url = uri('https://maven.aliyun.com/repository/gradle-plugin') }
// 保留官方仓库作为兜底
google()
mavenCentral()
gradlePluginPortal()
}- 如果仍然无法下载依赖,则修改项目目录的
android/build.gradle文件,在buildscript.repositories和allprojects.repositories(建议也要配置一下)同上述一样修改。(出现于需要安装系统尚未安装的Android SDK版本)
- 如果仍然无法下载依赖,则修改项目目录的
- 真机调试
- USB连接必须选择传输文件或者MTP(多媒体传输)
- 手机设置开启USB调试
flutter devices查看设备
Mac安装
- 下载 SDK: https://docs.flutter.cn/install/archive
配置环境变量并生效
source .bash_profile1
2
3
4export FLUTTER_ROOT=/Users/xxx/data/others/flutter-sdk/flutter-3.24.5
export PATH=$PATH:$FLUTTER_ROOT/bin
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn执行
flutter doctor提示需要适配 xcode
1 | brew install cocoapods |
运行(vscode)
flutter create demo01创建项目flutter run进入项目目录即可运行项目,修改代码后在命令行R热加载debug运行
- 打开
lib/main.dart,点击运行-启动调试,在底部选择启动程序-Dart & Flutter,此时会自动编译 (或者点击右上角启动按钮下拉 - Start Debugging)- 期间会提示安装Dart Devtools插件(会自动在浏览器打开类似Vue Devtools的展示页面)
- 修改代码后立即 Cmd+S 会自动重新渲染, 或者点击 Debug 刷新按钮
或者进入调试界面,点击下拉,选择项目添加配置,此时会在项目中产生
.vscode/launch.json文件(或者手动创建)。如下可创建多个调试(可同时启动)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"version": "0.2.0",
"configurations": [
{
"name": "simple_material_app", // 调试名称
"program": "flutter-examples/simple_material_app/lib/main.dart", // 相对项目根目录调试入口文件
"request": "launch",
"type": "dart"
},
{
"name": "using_theme",
"program": "flutter-examples/using_theme/lib/main.dart",
"request": "launch",
"type": "dart"
}
]
}
- 打开
flutter 命令
1 | flutter -h |
Flutter语法
路由
- 参考: main17
1 | // 普通的路由跳转 |
- 自定义路由相关
1 | final Map<String, Function> routes = { |
Key
- 组件在更新的时候,其状态的保存主要是通过判断组件的类型或者 key 值是否一致
- Key分类
- 局部键 LocalKey: ValueKey、ObjectKey、UniqueKey
- 全局建 GlobalKey
1 | // 类一般都要定义 key, 如: |
动画
- 隐式动画: 组件内部自动处理动画, 如: RotationTransition, ScaleTransition, FadeTransition, SlideTransition 等
- 显式动画: 手动控制动画, 如: AnimationController, Animation, Tween 等
- AnimationController: 动画控制器, 用于控制动画的播放, 暂停, 停止等操作
- Animation: 动画对象, 用于定义动画的属性, 如: 动画的时间, 动画的曲线等
- Tween: 动画插值器, 用于定义动画的起始值和结束值, 并根据动画的进度计算中间值
- Curves: 动画曲线, 用于定义动画的变化速率, 如: Curves.linear, Curves.easeInOut, Curves.bounceInOut 等
- 组件自带动画: AnimatedList, AnimatedContainer, AnimatedPadding, AnimatedOpacity, AnimatedPositioned, AnimatedDefaultTextStyle 等
- AnimatedList 和 ListView 的功能大体相似,不同的是, AnimatedList 可以在列表中插入或删除节点时执行一个动画来提高用户体验
1 | // 隐式动画 |
Dart语法
变量定义
1 | List list = []; |
对象类型
- list
1 | list = List.generate(10, (index) { |
流程控制
Flutter基础案例
目录结构&入口文件
- 目录结构
- android/ios/macos/windows/linux/web 为不同平台的基础文件夹
- lib 为项目 dart 代码夹
- build 编译的临时文件夹
- analysis_options.yaml 代码语法校验(可注释掉)
- pubspec.yaml 依赖的库配置
- main01: lib/main.dart 入口文件
1 | import 'package:flutter/material.dart'; |
MaterialApp和StatelessWidget
- 使用 MaterialApp 和 Scaffold 进行装饰
- StatelessWidget 无状态组件, StatefulWidget 有状态组件
- main03
1 | // 代码块 importM |
Container容器和Text文本
- main04
1 | import 'package:flutter/material.dart'; |
Paddiing,SizedBox,AspectRatio组件
- Paddiing组件
1 | // 如果只是简单的 padding 需求, 建议使用 Padding 组件代替 Container(消耗资源更大) |
- SizedBox组件
1 | // 如果只是简单的定义宽高需求, 建议使用 SizedBox 组件代替 Container(消耗资源更大) |
- AspectRatio组件
1 | Widget build(BuildContext context) { |
Image图片使用
- main05
1 | import 'package:flutter/material.dart'; |
Icon图标使用及IconData自定义图标
- main06
1 | // =====> lib/main.dart |
ListView列表组件
- ListTile 可以在 ListView, Column 中
- main07


1 | import 'package:flutter/material.dart'; |
GridView网格组件
- 可以通过 GridView.count(固定每行个数), GridView.extent(固定每行每元素的最大宽度进行自适应) 实现网格布局; 通过 GridView.builder 实现动态网格布局
- main08

1 | import 'package:flutter/material.dart'; |
Row,Column,Wrap线性布局
- Row(水平布局, 从左到右排列) 和 Column(垂直布局, 从上到下排列) 都继承自 Flex
- Wrap可以实现流布局(如横向不够则自动换行),单行的Wrap跟Row表现几乎一致,单列的Wrap则跟Column表现几乎一致
- main09

1 | import 'package:flutter/material.dart'; |
Flex和Expanded弹性布局
- Row(水平布局, 从左到右排列) 和 Column(垂直布局, 从上到下排列) 都继承自 Flex
- Expanded 只能放到 Flex Row Column 内来实现弹性布局
- main10

1 | import 'package:flutter/material.dart'; |
Stack,Positioned,Align层叠布局
- Stack 层叠布局: 后面的默认会覆盖前面的(后面的在上面)
- Positioned 基于父容器进行定位, 如果父容器没有则基于主屏幕
- Center 为 Align 子组件, 也可以使用 Container.alignment 属性进行对齐
- main11

1 | import 'package:flutter/material.dart'; |
Card卡片
- main12

1 | import 'package:flutter/material.dart'; |
ElevatedButton等按钮组件
- 按钮组件: ElevatedButton, TextButton, OutlinedButton, IconButton
- 底部浮动按钮: 基于 Scaffold.floatingActionButton
- main13

1 | import 'package:flutter/material.dart'; |
StatelessWidget,StatefulWidget状态组件
- StatelessWidget 无状态组件, StatefulWidget 有状态组件
- main14
1 | import 'package:flutter/material.dart'; |
Scaffold骨架组件
- main15

- main.dart
1 | import 'package:flutter/material.dart'; |
- user.dart (home.dart 同理)
1 | import 'package:flutter/material.dart'; |
AppBar,TabBar导航栏
- 基于 TabBar 和 TabBarView 实现导航栏, 两个都需要定义 controller 属性
- main16

- main.dart
1 | import 'package:flutter/material.dart'; |
- home.dart
1 | import 'package:flutter/material.dart'; |
Dialog弹框
showDialog方法弹出弹窗Navigator.of(context).pop("ok");关闭弹框并返回参数- SimpleDialog 和 SimpleDialogOption 实现弹框选择器
showModalBottomSheet方法实现底部弹窗- 基于插件实现 toastr 轻提示
- 基于 fluttertoast 插件实现. https://pub.dev/packages/fluttertoast
- 支持 LINUX MACOS WEB WINDOWS 的另一个插件 https://pub.dev/packages/ftoast
- 自定义弹框: 继承 Dialog 进行组件渲染, 并通过 showDialog 弹出
- main18

- main.dart
1 | import 'package:flutter/material.dart'; |
- myDialog.dart
1 | import 'dart:async'; |
PageView上下左右滑页切换及轮播图组件
- main19/pageView5.dart
1 | import 'dart:async'; |
InkWell
- InkWell 通用包装组件, 实现点击事件
1 | InkWell( |
