一、 参考文档
- https://docs.flutter.dev/get-started/install 官网安装指南
- https://docs.flutter.dev/community/china 国内使用的问题解决方法
- https://flutter.cn/docs/get-started/install/windows 国内社区维护的网站
二、 下载和安装
- 在 https://flutter.cn/docs/get-started/install/windows 找到最新版本的下载连接,比如 https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_3.29.2-stable.zip
- 解压到D盘根目录 ( 避免使用C盘,有权限问题 )
- 设置环境变量 , 添加
1
2
3flutter='D://flutter/bin' ( 这个要添加到 Path )
FLUTTER_STORAGE_BASE_URL="https://storage.flutter-io.cn"
PUB_HOSTED_URL="https://pub.flutter-io.cn"
备注:还有其他源可以选择。
三、检查Flutter环境
- 用Git Bash MinGW32 窗口执行命令
- 执行 ‘$ where flutter dart’ 看环境变量配置是否可以被识别
1
2
3
4
5
6
7
8
9
10
11$ where flutter dart
D:\flutter\bin\flutter
D:\flutter\bin\flutter.bat
D:\flutter\bin\dart
D:\flutter\bin\dart.bat
$ flutter --version
Flutter 3.29.2 • channel stable • [https://github.com/flutter/flutter.git](https://github.com/flutter/flutter.git)
Framework • revision c236373904 (4 weeks ago) • 2025-03-13 16:17:06 -0400
Engine • revision 18b71d647a
Tools • Dart 3.7.2 • DevTools 2.42.3
运行探测,检查Flutter环境是否正常
1 | $ flutter doctor |
3.1 修改maven仓库
默认情况下,网络是不同的,因为仓库 “https://maven.google.com/“ 有网络问题。
修改 D:\public_share\flutter\packages\flutter_tools\lib\src\http_host_validator.dart 文件解决:
- $ vim
flutter/packages/flutter_tools/lib/src/http_host_validator.dart - 把 ‘https://maven.google.com/‘ 改为 ‘https://dl.google.com/dl/android/maven2/‘
- 删除
flutter/bin/cache目录 - 重新运行
'$ flutter doctor'
3.2 修改依赖仓库
默认依赖源,网络是访问不同的,这个问题要通过设置镜像站点解决 https://docs.flutter.dev/community/china#configuring-flutter-to-use-a-mirror-site
这个地址是文档上提供的,速度也不错,就是每次都会提示你要信任这个源
1 | export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn |
再次检查Flutter环境
1 | $ flutter doctor |
另外还有一些由社区运营的依赖源镜像站点,也可以使用,比如:
上海交通大学Linux用户组
FLUTTER_STORAGE_BASE_URL : https://mirror.sjtu.edu.cn/
PUB_HOSTED_URL : https://mirror.sjtu.edu.cn/dart-pub/
1 | export FLUTTER_STORAGE_BASE_URL=https://mirror.sjtu.edu.cn |
四、安装Android Studio 插件
- 打开 Android Studio。
- 打开插件设置。
- 然后选择 Flutter 插件并点击 安装。
- 当弹出安装 Dart 插件提示时,点击 Yes。
- 当弹出重新启动提示时,点击 Restart。
五、创建项目
1 | $ flutter create flutter_demo |
这样创建的项目是包含所有平台:Linux、Windows、macOS、Web、Android、iOS,运行 flutter run会下载依赖。
移动端的项目,还是通过Android Studio创建项目,可以选择平台。
注意:创建项目,选择离线模式才成功。在线创建的项目依赖报错,运行也卡住。
- 项目结构
lib/main.dart 就是Flutter的代码
六、Jetpack Compose 和 Flutter 开发语法相似度很高?
以下是 Deepseek 回答:
Jetpack Compose(Android 的现代 UI 框架)和 Flutter(Google 的跨平台 UI 框架)在语法和设计理念上确实有许多相似之处,但也有一些关键差异。以下是它们的相似点和不同点分析:
6.1 相似点
声明式 UI
两者都采用声明式编程范式,开发者通过描述 UI 的最终状态(而非一步步命令式更新)来构建界面。例如:- Flutter:
1
Text('Hello', style: TextStyle(color: Colors.red))
- Compose:
1
Text("Hello", color = Color.Red)
- Flutter:
基于函数的组件
UI 都是由可组合的函数(Flutter 叫Widget,Compose 叫Composable)构建的,通过嵌套函数调用实现布局。状态管理
都强调状态驱动 UI 更新:- Flutter 使用
StatefulWidget或状态管理库(如Provider、Riverpod)。 - Compose 使用
remember和mutableStateOf等机制。
- Flutter 使用
热重载(Hot Reload)
两者都支持快速刷新界面,提升开发效率。Material Design 支持
均内置对 Material Design 组件的原生支持(如Button、Card等)。
6.2 不同点
语言基础
- Flutter:使用 Dart 语言(语法接近 Java/JavaScript,但有独特的特性如
..级联操作符)。 - Compose:使用 Kotlin 语言(支持协程、扩展函数等特性,与 Android 生态深度集成)。
- Flutter:使用 Dart 语言(语法接近 Java/JavaScript,但有独特的特性如
组件命名与风格
- Flutter 的组件通常以
Widget结尾(如TextWidget、ContainerWidget),而 Compose 直接使用语义化名称(如Text、Box)。 - 布局方式略有差异:
- Flutter 常用
Row/Column/Stack。 - Compose 用
Row/Column/Box。
- Flutter 常用
- Flutter 的组件通常以
状态管理实现
- Flutter 需要显式区分
StatelessWidget和StatefulWidget。 - Compose 通过
remember和状态托管(如ViewModel)更灵活地管理状态。
- Flutter 需要显式区分
平台依赖性
- Flutter:跨平台(iOS、Android、Web、桌面等),UI 通过 Skia 引擎自绘,不依赖原生控件。
- Compose:目前主要用于 Android(Compose Multiplatform 正在扩展支持其他平台,但成熟度不如 Flutter)。
布局系统
- Flutter 的布局逻辑更显式(如
padding: EdgeInsets.all(8))。 - Compose 通过 Modifier 链式调用(如
Modifier.padding(8.dp))。
- Flutter 的布局逻辑更显式(如
为什么感觉语法相似?
- Google 团队在设计两者时共享了类似的现代化 UI 开发理念(声明式、响应式)。
- 都借鉴了 React 等前端框架的思想(如“状态驱动视图”)。
- Dart 和 Kotlin 同属现代语言,语法简洁性上有共同点(如 lambda 表达式、类型推断)。
如何选择?
- 选 Flutter:需要跨平台、希望一套代码覆盖多端。
- 选 Compose:专注 Android 开发、需深度集成原生能力或已有 Kotlin 代码库。
示例对比
实现一个简单计数器:
Flutter:
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Counter extends StatefulWidget {
_CounterState createState() => _CounterState();
}
class _CounterState extends State<Counter> {
int count = 0;
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => setState(() => count++),
child: Text('Count: $count'),
);
}
}Compose:
1
2
3
4
5
6
7
fun Counter() {
var count by remember { mutableStateOf(0) }
Button(onClick = { count++ }) {
Text("Count: $count")
}
}
总结:两者语法相似度高到可以“触类旁通”,但底层实现和生态差异显著。如果你熟悉其中一个,学习另一个会非常容易。