目录

1. 📂 Flutter 了解

1.1 Flutter 架构

1.2 应用架构

1.3 Widget

1.4 模块划分

2. 🔱 Dart 语法

2.1 基础

2.2 变量声明

2.3 空安全

2.4 类之间的关系

2.5 函数

2.6 异步

3. 💠 初始化

3.1 应用初始化

3.2 Widget 初始化

4. ⚛️ 基础组件

4.1 日志系统

4.2 数据库系统

5. 🎉 其他

5.1 APK 编译生成

5.2 代码提交

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/

[2] 应用架构 MVVM:https://docs.flutter.cn/app-architecture/guide

[3] Dart 官方文档:https://dart.cn/language

[4] 日志系统参考:https://blog.csdn.net/Agg_bin/article/details/156642705

[5] 数据库系统参考:https://blog.csdn.net/Agg_bin/article/details/156612693

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐