Flutter 探索入门

目录

[1. 📂 Flutter 了解](#1. 📂 Flutter 了解)

[1.1 Flutter 架构](#1.1 Flutter 架构)

[1.2 应用架构](#1.2 应用架构)

[1.3 Widget](#1.3 Widget)

[1.4 模块划分](#1.4 模块划分)

[2. 🔱 Dart 语法](#2. 🔱 Dart 语法)

[2.1 基础](#2.1 基础)

[2.2 变量声明](#2.2 变量声明)

[2.3 空安全](#2.3 空安全)

[2.4 类之间的关系](#2.4 类之间的关系)

[2.5 函数](#2.5 函数)

[2.6 异步](#2.6 异步)

[3. 💠 初始化](#3. 💠 初始化)

[3.1 应用初始化](#3.1 应用初始化)

[3.2 Widget 初始化](#3.2 Widget 初始化)

[4. ⚛️ 基础组件](#4. ⚛️ 基础组件)

[4.1 日志系统](#4.1 日志系统)

[4.2 数据库系统](#4.2 数据库系统)

[5. 🎉 其他](#5. 🎉 其他)

[5.1 APK 编译生成](#5.1 APK 编译生成)

[5.2 代码提交](#5.2 代码提交)

[5.3 代码调试](#5.3 代码调试)

[✅ 小结](#✅ 小结)

[🛎️ 参考](#🛎️ 参考)


1. 📂 Flutter 了解

  • Flutter 是开源免费的,应用开发场景,跨平台(移动、web、桌面端)的 UI 框架;

  • Flutter 是 Google 的便携式 UI 工具包,由 Google 和开发社区共同创造,使用 Dart(一种现代化的、简洁的面向对象语言) 实现其大部分系统功能 (布局、手势、动画、框架、Widget 等);

  • Flutter 性能调试工具:开发工具 (DevTools ) 是一套 Dart 和 Flutter 的性能调试工具:https://docs.flutter.cn/tools/devtools

  • 开发工具:通过插件的方式使用 Android Studio、IntelliJ IDEA 和 VS Code 开发,其他如:Firebase Studio 支持 Dart 和 Flutter;

  • Flutter 成长:Flutter 1 于 2018 年 12 月推出, Flutter 2 于 2021 年 3 月 3 日发布, Flutter 3 于 2023 年 5 月 10 日发布。

1.1 Flutter 架构

Flutter 开发文档https://docs.flutter.cn/

1.2 应用架构

Guide to app architecturehttps://docs.flutter.cn/app-architecture/guide

1.3 Widget

Flutter 框架将 Widget 分为两大类:StatefulWidget 有状态的和 StatelessWidget 无状态的。

代码中建议尽量使用无状态的 StatelessWidget ,如果一个 Widget 会变化(例如由于用户交互),它是有状态的 StatefulWidget

|------|------------------------|-----------------------------|
| 维度 | StatelessWidget (无状态) | StatefulWidget (有状态) |
| 核心定义 | 界面一旦构建,在生命周期内不再发生变化 | 界面可以根据用户交互或数据流的变化而动态更新 |
| 数据特性 | 它是不可变的,属性通常由构造函数传入 | 包含一个持久的 State 对象,它是可变的 |
| 构建机制 | 依赖父组件的改变来触发销毁并重新创建 | 可以通过调用 setState() 触发自身局部的重绘 |
| 性能开销 | 结构简单,内存占用更低,渲染速度更快 | 相对复杂,需要维护额外的 State 对象和生命周期 |
| 推荐用法 | 首选方案,适用展示型 UI,如图标、静态文字 | 在 Widget 内部状态会改变时使用,如表单、动画 |
| 代码结构 | 只有一个类,重写 build 方法 | 由两个类组成:Widget 类和对应的 State 类 |

1.4 模块划分

2. 🔱 Dart 语法

2.1 基础

  • 应用运行入口 :顶层的 main() 函数作为应用运行入口。

  • Dart 是类型安全的编程语言,静态类型检查+运行时检查。

2.2 变量声明

  • 变量声明的几种方式:var、显式申明、Object、dynamic、final、const。一个 final 变量只能设置一次,const 变量是编译时常量(const 常量隐式包含了 final)。

  • 变量延迟初始化 :late。如下情况可考虑使用 late:1)可能不需要该变量,并且初始化它的开销很高;2)你正在初始化一个实例变量,它的初始化方法需要调用 this

  • 私有变量:_变量名。

2.3 空安全

?? 可空变量空值合并(如: name ?? '未知用户'------如果name为null,使用'未知用户')。

2.4 类之间的关系

  • 类的基类:所有类的基类都是Object(除了null),所有的类都隐式定义成了一个接口,因此任意类都可以作为接口被实现,abstract class 既可以被继承,也可以被实现。

  • 类的修饰:abstract、base、final、interface、sealed、mixin。

  1. base类不允许在其自身库之外进行实现;
  2. final类禁止继承和实现,所以final修饰符包含了base的效果;
  3. sealed类创建一组已知的、可枚举的子类型,sealed类是隐式抽象,但sealed类的子类不是隐式抽象。
  • 类的扩展:extension <extension name>? on <type> {},extension name可省略。

  • 类的组合

  1. extends:单继承;

  2. with:混入 mixin,重用代码;

  3. implements:实现接口 abstract class/interface class,定义行为。

2.5 函数

  • => (胖箭头) :箭头语法用于仅包含一条语句的函数。

  • 函数可返回多个值:(String, int) foo() { return ('something', 42);}。

|------|-------------|------------------------|
| 特性 | 顶层变量 / 函数 | 静态变量 / 函数 (static) |
| 定义位置 | 类外部(文件顶层) | 类内部 |
| 调用前缀 | 无(直接调用) | 必须带类名(如 MyClass.foo()) |
| 封装性 | 较弱,容易污染命名空间 | 较强,逻辑组织在类名下 |
| 内存占用 | 仅在第一次使用时加载 | 仅在第一次使用时加载 |
| 多态性 | 不支持重写 | 不支持重写 |

2.6 异步

  • 异步:使用 asyncawait 以及 Future、Stream(async+、await for、yield) 关键字。

  • 多个异步等待:Future.wait() 静态方法来管理多个 Future 对象并等待它们完成。

Dart 简介https://dart.cn/language

3. 💠 初始化

3.1 应用初始化

复制代码
/// 应用入口,初始化需分层执行:基础层→核心层→扩展层→后台层。
void main() async {
  // ========== 1. 基础层:初始化 Flutter 引擎绑定(需确保 Flutter 引擎和框架已经初始化) ==========
  WidgetsFlutterBinding.ensureInitialized();

  // ========== 2. 核心层:UI组件、本地存储、全局配置、初始化日志、数据库、网络库等 ==========
  try {
    await LogManager().initialize();
    // 同步、异步初始化其他核心服务(如有)
  } catch (e) {
    debugPrint("日志管理器初始化失败,降级为控制台打印:$e");
  }

  // ========== 3. 启动应用 ==========
  logI("App Running...");
  runApp(
    ChangeNotifierProvider(
      create: (_) => LoginUserViewModel()..loadCountryCode(),
      child: const App(),
    ),
  );

  // ========== 4. 扩展层/后台层:其他初始化,如:初始化三方SDK、初始化埋点、检查更新等 ==========
  WidgetsBinding.instance.addPostFrameCallback((_) async {
    logI("Other init...");
  });
}

3.2 Widget 初始化

|-----------------------------|----------|------------------------|------------------------------------------------|
| 放置位置 | 核心用途 | MVVM 职责建议 | 避坑指南 |
| Constructor | 接收外部参数 | 仅传递必要 ID 或配置,不创建实例 | 优先使用 const 提高渲染效率 |
| initState() | 一次性初始化 | 触发 ViewModel 的数据加载逻辑 | 仅执行一次,此时 context 尚未完全就绪 |
| didChangeDependencies() | 响应环境变化 | 处理主题或语言切换后的逻辑关联 | 会被多次触发,严禁执行耗时请求,StatefulWidget 的 State 中重写 |
| build() | 描述 UI 结构 | 绑定状态数据,将模型转化为组件 | 保持纯净,禁止实例化对象或执行逻辑,每次 setState 或父组件 rebuild 会回调 |
| dispose() | 释放内存资源 | 通知 ViewModel 取消订阅或停止任务 | 必须关闭所有控制器与监听,防止泄漏 |

4. ⚛️ 基础组件

4.1 日志系统

为了降低维护成本,我们将日志系统分为三层,各司其职:

第一层:门面层 (Facade):提供最简单的全局函数和单例入口,让开发者"无感"调用;

第二层:核心层 (Core):负责配置解析、级别过滤、逻辑分发;

第三层:实现层 (Handler):具体的落地执行者,如控制台着色打印、文件分片存储。

Flutter 日志模块之参考设计-CSDN博客https://blog.csdn.net/Agg_bin/article/details/156642705

4.2 数据库系统

为了保证模块的可维护性,我们采用分层架构:

第一层:Bean (Table):定义表结构;

第二层:DB (AppDatabase):数据库配置、连接与迁移逻辑;

第三层:DAO (Data Access Object):隔离业务 SQL 逻辑;

第四层:Manager (DBManager):全局单例,屏蔽初始化细节。

Flutter 数据库模块之 Draft 设计-CSDN博客https://blog.csdn.net/Agg_bin/article/details/156612693

5. 🎉 其他

5.1 APK 编译生成

生成 APK 文件:flutter build apk --release。

--不同模式的差异如下:

  • debug:用于开发和调试,包含调试信息,支持热重载和调试功能,适合开发过程中使用。

  • release:用于发布应用,优化了代码和资源,去除了调试信息,适合发布到 Google Play 或其他应用商店。

  • profile:介于 debug 和 release 之间,用于性能分析,包含了一些调试信息,但在运行时启用了性能优化,适合用于性能测试。

--生成APK时可以指定版本号、版本名:

flutter build apk --build-name=1.2.0 --build-number=5

  • 运行命令生成分割架构的 APK 文件:flutter build apk --split-per-abi。

  • 生成只包含 arm64-v8a 架构的 APK Release 文件:flutter build apk --release --target-platform android-arm64。

5.2 代码提交

build_runner生成的文件建议提交。

  • build_runner 是代码生成和构建工具,常用于生成代码、资源文件等,建议提交 .g.dart 生成文件;

  • 如果只提交源代码文件,不提交 .g.dart 文件,通过 .gitignore 来忽略它们,那么本地代码需要使用 dart run build_runner build 或 dart run build_runner watch 来生成或自动生成这些文件。

5.3 代码调试

项目运行后,打开 AS 工具栏中的 View-Tool Windows-Flutter Inspector,可以跟踪代码中的 Widget 调用。

✅ 小结

本文作为一篇 Flutter 入门总结,很多内容是基于本人编程水平去罗列的,并未展示全貌。

另外,由于本人能力有限,如有错误,敬请批评指正,谢谢。


🛎️ 参考

1\] Flutter 官方文档:[https://docs.flutter.cn/](https://docs.flutter.cn/ "https://docs.flutter.cn/") \[2\] 应用架构 MVVM:[https://docs.flutter.cn/app-architecture/guide](https://docs.flutter.cn/app-architecture/guide "https://docs.flutter.cn/app-architecture/guide") \[3\] Dart 官方文档:[https://dart.cn/language](https://dart.cn/language "https://dart.cn/language") \[4\] 日志系统参考:[https://blog.csdn.net/Agg_bin/article/details/156642705](https://blog.csdn.net/Agg_bin/article/details/156642705 "https://blog.csdn.net/Agg_bin/article/details/156642705") \[5\] 数据库系统参考:[https://blog.csdn.net/Agg_bin/article/details/156612693](https://blog.csdn.net/Agg_bin/article/details/156612693 "https://blog.csdn.net/Agg_bin/article/details/156612693")

相关推荐
kirk_wang18 小时前
当Flutter的并发利器遇上鸿蒙:flutter_isolate的OHOS适配之旅
flutter·移动开发·跨平台·arkts·鸿蒙
AiFlutter20 小时前
五、交互行为(01):按钮
flutter·低代码·低代码平台·aiflutter·aiflutter低代码
kirk_wang20 小时前
Flutter艺术探索-Flutter表单组件:TextField与验证处理
flutter·移动开发·flutter教程·移动开发教程
kirk_wang20 小时前
Flutter艺术探索-Flutter手势与交互:GestureDetector使用指南
flutter·移动开发·flutter教程·移动开发教程
不爱吃糖的程序媛20 小时前
Flutter-OH 三方库适配指南:核心文件+实操步骤
flutter
行者9620 小时前
OpenHarmony Flutter 搜索体验优化实战:打造高性能跨平台搜索组件
flutter·harmonyos·鸿蒙
火柴就是我1 天前
学习一些常用的混合模式之BlendMode. dst_atop
android·flutter
火柴就是我1 天前
学习一些常用的混合模式之BlendMode. dstIn
android·flutter
火柴就是我2 天前
学习一些常用的混合模式之BlendMode. dst
android·flutter