Flutter模块化开发实战:跨端视角下与开源鸿蒙开发的异同及融合思路

文章目录

  • Flutter模块化开发实战:跨端视角下与开源鸿蒙开发的异同及融合思路
    • 前言
    • [一、 模块化开发核心价值:为何无论Flutter还是鸿蒙都必须重视](#一、 模块化开发核心价值:为何无论Flutter还是鸿蒙都必须重视)
    • [二、 Flutter模块化开发实战:从架构设计到代码落地](#二、 Flutter模块化开发实战:从架构设计到代码落地)
      • [2.1 Flutter模块化开发核心架构设计](#2.1 Flutter模块化开发核心架构设计)
      • [2.2 方案一:基于Package的通用模块开发(通用功能复用首选)](#2.2 方案一:基于Package的通用模块开发(通用功能复用首选))
        • [2.2.1 本地Package创建(实战步骤)](#2.2.1 本地Package创建(实战步骤))
        • [2.2.2 核心代码实战:通用工具Package开发](#2.2.2 核心代码实战:通用工具Package开发)
        • [2.2.3 主工程引入本地Package并使用](#2.2.3 主工程引入本地Package并使用)
      • [2.3 方案二:基于项目内子模块的业务模块化(业务功能拆分首选)](#2.3 方案二:基于项目内子模块的业务模块化(业务功能拆分首选))
        • [2.3.1 业务模块化目录结构设计](#2.3.1 业务模块化目录结构设计)
        • [2.3.2 核心代码实战:业务模块开发与路由整合](#2.3.2 核心代码实战:业务模块开发与路由整合)
      • [2.4 Flutter模块化进阶:状态管理与模块通信](#2.4 Flutter模块化进阶:状态管理与模块通信)
    • [三、 开源鸿蒙模块化开发:核心逻辑与与Flutter的差异对比](#三、 开源鸿蒙模块化开发:核心逻辑与与Flutter的差异对比)
      • [3.1 开源鸿蒙模块化开发核心设计](#3.1 开源鸿蒙模块化开发核心设计)
      • [3.2 开源鸿蒙模块化核心实现方式](#3.2 开源鸿蒙模块化核心实现方式)
      • [3.3 Flutter与开源鸿蒙模块化开发核心差异](#3.3 Flutter与开源鸿蒙模块化开发核心差异)
    • [四、 Flutter与开源鸿蒙模块化开发:技术融合思路](#四、 Flutter与开源鸿蒙模块化开发:技术融合思路)
      • [4.1 方案一:Flutter嵌入开源鸿蒙,实现跨端+原生融合](#4.1 方案一:Flutter嵌入开源鸿蒙,实现跨端+原生融合)
      • [4.2 方案二:通用模块跨框架复用,降低开发成本](#4.2 方案二:通用模块跨框架复用,降低开发成本)
    • [五、 总结与展望](#五、 总结与展望)

Flutter模块化开发实战:跨端视角下与开源鸿蒙开发的异同及融合思路

前言

在跨端开发与原生开发并行的当下,模块化开发早已不是可选技术,而是提升项目可维护性、降低协作成本、实现代码复用的核心方案。Flutter作为跨端开发的标杆框架,以"一套代码运行多端"为核心优势,其模块化设计能让复杂应用拆解为独立、可复用的功能单元,大幅提升开发效率与项目扩展性;开源鸿蒙(OpenHarmony)则以分布式架构为核心,采用基于Ability的模块化拆分逻辑,聚焦全场景设备协同,在国产化终端生态中占据重要地位。

本文将从模块化开发的核心价值出发,详细讲解Flutter模块化开发的实现方案、核心流程与代码实战,同时对比开源鸿蒙模块化开发的设计思路与差异点,最后探讨二者的技术融合可能性,全文配套实操代码与架构示意图,适合Flutter进阶开发者、开源鸿蒙入门学习者及跨端技术选型人员参考,全文约3200字,干货满满,建议收藏后细品。

一、 模块化开发核心价值:为何无论Flutter还是鸿蒙都必须重视

模块化开发的本质是"分而治之",将一个庞大、复杂的应用,按照业务功能或技术维度拆分为多个低耦合、高内聚的独立模块,每个模块负责单一核心功能,可独立开发、测试、打包与复用。无论是Flutter跨端应用,还是开源鸿蒙原生应用,模块化开发的核心价值高度一致,主要体现在3个方面:

  1. 降低开发复杂度:大型应用若所有代码耦合在一起,会出现"牵一发而动全身"的问题,模块化拆分后,开发者只需聚焦自身负责的模块,无需关注其他模块的内部实现;
  2. 提升团队协作效率:多开发者并行开发时,模块化可实现代码隔离,避免代码冲突,同时模块间通过统一接口交互,减少沟通成本;
  3. 实现代码复用与跨项目迁移:抽离后的通用模块(如网络请求、数据存储、通用UI组件),可直接复用在同框架的其他项目中,无需重复开发;
  4. 便于后期维护与迭代:模块独立的特性让问题定位更精准,迭代升级时只需修改目标模块,无需改动整体项目,降低维护风险。

从框架特性来看,Flutter的跨端属性对模块化要求更高------一套代码需适配Android、iOS甚至Web端,模块化能让跨端适配的成本集中在特定模块,避免全量修改;而开源鸿蒙的分布式架构,本身就要求模块具备独立部署、跨设备调用的能力,模块化是其分布式能力落地的基础,二者的模块化开发均是框架特性的必然延伸。

二、 Flutter模块化开发实战:从架构设计到代码落地

Flutter本身并未提供官方强制的模块化规范,但其灵活的工程结构与依赖管理机制,支持多种模块化实现方案,其中基于Package/Plugin的模块化 (适用于通用功能复用)与基于项目内子模块的模块化(适用于业务功能拆分)是最主流的两种方案,下文重点讲解实战落地流程,配套完整代码案例。

2.1 Flutter模块化开发核心架构设计

Flutter模块化应用的整体架构遵循"主工程+核心公共模块+业务功能模块+第三方依赖模块"的结构,各模块职责清晰,低耦合高内聚,架构示意图如下(建议保存使用):

复制代码
Flutter模块化项目架构
├── 主工程(App):核心入口,负责模块整合、路由分发、全局状态管理
├── 核心公共模块(Common Package):通用工具类、网络请求、数据存储、通用UI组件(全局复用)
├── 业务功能模块1(Business Module A):如首页模块,独立实现首页所有功能,对外暴露接口
├── 业务功能模块2(Business Module B):如我的模块,独立实现个人中心相关功能
├── 业务功能模块3(Business Module C):如购物车模块,独立实现购物车核心逻辑
└── 第三方依赖模块:如Dio、GetX等,通过pub仓库引入,供各模块调用

核心设计原则:主工程不负责具体业务逻辑,仅做"模块调度中心";各业务模块独立开发,通过统一路由或接口交互;核心公共模块提供全局通用能力,避免各业务模块重复造轮子。

2.2 方案一:基于Package的通用模块开发(通用功能复用首选)

Flutter的Package是纯Dart代码的模块,适用于开发无原生交互的通用功能(如工具类、通用UI、数据解析等),可发布到pub.dev供全网复用,也可作为本地Package引入项目,是通用模块的最优实现方案。

2.2.1 本地Package创建(实战步骤)
  1. 打开终端,进入项目根目录,执行创建命令:flutter create --template=package common_utilscommon_utils为模块名,按需修改);

  2. 执行完成后,项目根目录会新增common_utils文件夹,其目录结构如下(核心目录标注):

    复制代码
    common_utils/
    ├── lib/                # 核心代码目录,所有功能代码写在这里
    │   ├── common_utils.dart  # 模块对外暴露的入口文件(需手动创建)
    │   ├── utils/          # 工具类目录(如日期工具、字符串工具)
    │   └── widgets/        # 通用UI组件目录(如自定义按钮、输入框)
    ├── pubspec.yaml        # 模块依赖配置文件,与主工程一致
    └── test/               # 单元测试目录
  3. lib目录下编写核心功能代码,对外暴露统一接口,避免外部直接访问模块内部细节。

2.2.2 核心代码实战:通用工具Package开发

以开发common_utils通用工具模块为例,实现日期格式化、字符串判空两个常用功能,代码如下:

  1. 编写工具类代码(lib/utils/date_utils.dart):日期格式化工具

    dart 复制代码
    /// 日期格式化工具类
    class DateUtils {
      /// 将时间戳转为指定格式字符串(如yyyy-MM-dd HH:mm:ss)
      static String formatTimestamp(int timestamp, {String format = "yyyy-MM-dd HH:mm:ss"}) {
        DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestamp);
        return "${dateTime.year}-${_补零(dateTime.month)}-${_补零(dateTime.day)} ${_补零(dateTime.hour)}:${_补零(dateTime.minute)}:${_补零(dateTime.second)}";
      }
    
      /// 数字补零(如1转为01)
      static String _补零(int num) {
        return num.toString().padLeft(2, "0");
      }
    }
  2. 编写工具类代码(lib/utils/string_utils.dart):字符串工具类

    dart 复制代码
    /// 字符串工具类
    class StringUtils {
      /// 字符串判空(为空返回true,非空返回false)
      static bool isEmpty(String? str) {
        return str == null || str.isEmpty || str.trim().isEmpty;
      }
    
      /// 字符串非空判断(与isEmpty相反)
      static bool isNotEmpty(String? str) {
        return !isEmpty(str);
      }
    }
  3. 编写模块入口文件(lib/common_utils.dart):统一对外暴露功能,简化外部调用

    dart 复制代码
    /// 通用工具模块入口文件,外部只需引入此文件即可使用所有功能
    export 'utils/date_utils.dart';
    export 'utils/string_utils.dart';
  4. 配置模块依赖(common_utils/pubspec.yaml):若需依赖第三方库(如intl),在此配置,与主工程一致

    yaml 复制代码
    name: common_utils
    description: Flutter通用工具类模块,提供日期格式化、字符串判空等功能
    version: 0.0.1
    homepage:
    
    environment:
      sdk: '>=3.0.0 <4.0.0'
      flutter: ">=3.10.0"
    
    dependencies:
      flutter:
        sdk: flutter
      # 若需扩展日期格式化功能,可引入intl库
      # intl: ^0.18.1
    
    dev_dependencies:
      flutter_test:
        sdk: flutter
      flutter_lints: ^2.0.0
2.2.3 主工程引入本地Package并使用
  1. 打开主工程的pubspec.yaml,在dependencies节点下添加本地Package依赖:

    yaml 复制代码
    dependencies:
      flutter:
        sdk: flutter
      # 引入本地通用工具模块(path为模块相对路径)
      common_utils:
        path: ./common_utils
  2. 执行flutter pub get拉取依赖,依赖成功后即可在主工程中使用模块功能;

  3. 主工程调用示例(在任意页面中使用):

    dart 复制代码
    import 'package:flutter/material.dart';
    // 引入通用工具模块入口文件
    import 'package:common_utils/common_utils.dart';
    
    class HomePage extends StatelessWidget {
      const HomePage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(title: const Text("Flutter模块化实战")),
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                // 使用字符串判空工具
                Text(StringUtils.isEmpty("") ? "字符串为空" : "字符串非空"),
                const SizedBox(height: 20),
                // 使用日期格式化工具(当前时间戳)
                Text(DateUtils.formatTimestamp(DateTime.now().millisecondsSinceEpoch)),
              ],
            ),
          ),
        );
      }
    }
  4. 运行主工程,即可正常显示工具类运行结果,实现通用功能的模块化复用。

2.3 方案二:基于项目内子模块的业务模块化(业务功能拆分首选)

对于大型Flutter应用的业务功能(如首页、我的、购物车),推荐使用项目内子模块 拆分,无需创建独立Package,直接在主工程内创建子目录作为业务模块,核心优势是目录结构更简洁、业务迭代更高效,核心遵循"目录隔离+接口暴露+路由分发"的原则。

2.3.1 业务模块化目录结构设计

在主工程lib目录下,按照业务功能拆分模块,核心目录结构如下(以电商APP为例):

复制代码
lib/
├── main.dart               # 应用入口,初始化路由、全局配置
├── app/                    # 应用核心配置目录(全局状态、路由管理)
│   ├── app_router.dart     # 全局路由管理,统一分发各业务模块页面
│   └── app_state.dart      # 全局状态管理(如用户信息)
├── core/                   # 项目核心公共目录(本地通用功能,不对外复用)
│   ├── network/            # 网络请求模块
│   ├── storage/            # 本地存储模块
│   └── widgets/            # 项目专属通用UI组件
└── modules/                # 业务模块根目录,所有业务模块均在此下
    ├── home/               # 首页业务模块(独立拆分)
    │   ├── page/           # 模块内页面(如首页、首页详情)
    │   ├── viewModel/      # 模块内业务逻辑(MVVM架构)
    │   └── home_export.dart # 模块对外暴露入口(页面、接口)
    ├── mine/               # 我的业务模块(独立拆分)
    │   ├── page/
    │   ├── viewModel/
    │   └── mine_export.dart
    └── cart/               # 购物车业务模块(独立拆分)
        ├── page/
        ├── viewModel/
        └── cart_export.dart

核心规范 :每个业务模块独立拥有pageviewModel目录,不与其他模块交叉引用;模块对外仅暴露xxx_export.dart文件,内部细节对外隐藏。

2.3.2 核心代码实战:业务模块开发与路由整合

home(首页)和mine(我的)模块为例,实现业务模块化开发与全局路由分发,完整代码如下:

  1. 开发首页模块(modules/home/page/home_page.dart):独立实现首页功能

    dart 复制代码
    import 'package:flutter/material.dart';
    
    /// 首页页面(首页模块专属,不对外暴露细节)
    class HomePage extends StatelessWidget {
      const HomePage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                const Text("首页模块", style: TextStyle(fontSize: 20)),
                ElevatedButton(
                  onPressed: () {
                    // 跳转到我的模块(通过全局路由,无需直接引用mine模块)
                    Navigator.pushNamed(context, "/mine");
                  },
                  child: const Text("跳转到我的页面"),
                )
              ],
            ),
          ),
        );
      }
    }
  2. 首页模块对外暴露(modules/home/home_export.dart):仅暴露首页页面,供路由调用

    dart 复制代码
    /// 首页模块对外暴露入口
    export 'page/home_page.dart';
  3. 开发我的模块(modules/mine/page/mine_page.dart):独立实现我的页面功能

    dart 复制代码
    import 'package:flutter/material.dart';
    
    /// 我的页面(我的模块专属)
    class MinePage extends StatelessWidget {
      const MinePage({super.key});
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: const Center(
            child: Text("我的模块", style: TextStyle(fontSize: 20)),
          ),
          floatingActionButton: FloatingActionButton(
            onPressed: () {
              Navigator.pop(context);
            },
            child: const Icon(Icons.arrow_back),
          ),
        );
      }
    }
  4. 我的模块对外暴露(modules/mine/mine_export.dart):

    dart 复制代码
    /// 我的模块对外暴露入口
    export 'page/mine_page.dart';
  5. 全局路由管理(app/app_router.dart):统一管理所有业务模块页面,实现模块间无耦合跳转

    dart 复制代码
    import 'package:flutter/material.dart';
    // 引入各业务模块对外暴露的入口文件
    import 'package:flutter_modular_demo/modules/home/home_export.dart';
    import 'package:flutter_modular_demo/modules/mine/mine_export.dart';
    
    /// 全局路由配置类
    class AppRouter {
      /// 路由映射表:路由名 -> 页面组件
      static Map<String, WidgetBuilder> routes = {
        "/home": (context) => const HomePage(),  // 首页路由
        "/mine": (context) => const MinePage(),  // 我的页面路由
      };
    
      /// 路由拦截与分发(统一入口)
      static Route<dynamic> onGenerateRoute(RouteSettings settings) {
        final String routeName = settings.name ?? "/home";
        final WidgetBuilder? builder = routes[routeName];
        if (builder != null) {
          return MaterialPageRoute(builder: builder, settings: settings);
        }
        // 未知路由返回首页
        return MaterialPageRoute(builder: (context) => const HomePage());
      }
    }
  6. 主工程入口配置(main.dart):注册全局路由,启动应用

    dart 复制代码
    import 'package:flutter/material.dart';
    import 'app/app_router.dart';
    
    void main() {
      runApp(const MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter模块化实战',
          debugShowCheckedModeBanner: false,
          initialRoute: "/home",  // 初始路由为首页
          onGenerateRoute: AppRouter.onGenerateRoute,  // 注册全局路由
        );
      }
    }
  7. 运行效果:应用启动后进入首页模块,点击按钮可跳转到我的模块,两个业务模块独立开发,通过全局路由实现无耦合交互,完全符合模块化开发要求。

2.4 Flutter模块化进阶:状态管理与模块通信

模块化开发中,模块间的通信与状态管理是核心难点,Flutter中常用两种解决方案:

  1. 全局状态管理:使用GetX、Provider、Riverpod等框架,维护全局共享状态(如用户信息),各业务模块可直接读取或修改全局状态,无需直接通信;
  2. 路由传参通信 :适用于页面跳转时的临时数据传递,通过Navigator.pushNamed(context, "/mine", arguments: "用户ID")传参,在目标页面通过ModalRoute.of(context)?.settings.arguments接收,简单高效;
  3. 接口回调通信:适用于模块内部组件间的通信,通过定义回调函数,将子组件数据传递给父组件,避免状态穿透。

以GetX全局状态管理为例,实现用户信息在首页与我的模块间共享,核心代码(新增app/app_state.dart):

dart 复制代码
import 'package:get/get.dart';

/// 全局用户状态管理(GetX实现)
class UserState extends GetxController {
  // 共享状态:用户昵称(可被所有模块读取/修改)
  final RxString userName = "游客".obs;

  /// 修改用户昵称(全局可调用)
  void updateUserName(String name) {
    userName.value = name;
  }
}

在任意模块中使用:只需通过Get.put(UserState())初始化,即可通过Get.find<UserState>().userName读取状态,通过updateUserName修改状态,实现跨模块状态共享。

三、 开源鸿蒙模块化开发:核心逻辑与与Flutter的差异对比

开源鸿蒙作为国产化全场景分布式操作系统,其模块化开发设计与Flutter有本质区别,核心围绕Ability(应用组件)HAP(鸿蒙应用包) 展开,同时支持原子化服务的独立模块部署,下文从核心设计、实现方式、技术差异三个维度详细解析。

3.1 开源鸿蒙模块化开发核心设计

开源鸿蒙的模块化开发是系统级原生支持 ,其核心架构为"应用包(HAP)+ Ability组件",一个大型应用可拆分为多个HAP包(分为entry包(主包)和feature包(功能包)),每个HAP包包含多个Ability组件(分为PageAbility、ServiceAbility等),架构示意图如下:

复制代码
开源鸿蒙模块化应用架构
├── 主包(entry HAP):应用核心入口,负责模块整合、分布式调度,必选
├── 功能包1(feature HAP 1):如首页功能包,包含首页PageAbility,可选
├── 功能包2(feature HAP 2):如我的功能包,包含我的PageAbility,可选
└── 公共包(har包):通用工具、组件、接口,供所有HAP包复用(类似Flutter的Package)

核心特性:每个HAP包可独立编译、打包、安装,支持分布式场景下的跨设备调用;har包为纯代码复用包,不包含Ability组件,仅提供通用能力。

3.2 开源鸿蒙模块化核心实现方式

  1. 主包与功能包拆分 :在DevEco Studio中创建项目时,选择"多HAP应用",自动生成entry主包和feature功能包目录,各HAP包独立配置module.json5(模块配置文件),指定模块名称、Ability组件、权限等;
  2. har包开发与复用 :创建har包(Harmony Archive),编写通用工具类、UI组件,发布到本地或远程仓库,各HAP包通过oh-package.json5引入依赖,实现通用代码复用;
  3. 模块间通信 :开源鸿蒙通过Ability间通信 (如IPC、RPC)实现跨HAP包、跨设备的模块通信,通过DataAbility 实现数据共享,通过EventHub实现事件分发,均为系统级API支持。

3.3 Flutter与开源鸿蒙模块化开发核心差异

二者虽均以"低耦合、高内聚"为核心目标,但因框架定位、架构设计不同,存在本质差异,核心对比表如下:

对比维度 Flutter模块化开发 开源鸿蒙模块化开发
框架定位 跨端UI框架(纯应用层) 全场景分布式操作系统(系统+应用层)
核心载体 Package(通用)、子目录(业务) HAP包(主包/功能包)、Ability组件
模块部署 所有模块最终打包为一个APK/IPA 支持多HAP包独立部署、跨设备调用
模块通信 路由传参、全局状态管理、接口回调 系统级IPC/RPC、DataAbility、EventHub
复用范围 仅Flutter应用内/跨Flutter应用 鸿蒙生态内所有应用、原子化服务
核心优势 跨端复用、灵活轻便、开发成本低 分布式能力强、系统级支持、全场景适配

核心总结:Flutter模块化聚焦应用层的代码复用与业务拆分 ,服务于跨端开发效率;开源鸿蒙模块化聚焦系统级的分布式部署与全场景协同,服务于多设备、全场景生态,二者的模块化设计均是为了适配自身框架的核心定位。

四、 Flutter与开源鸿蒙模块化开发:技术融合思路

在国产化跨端开发需求日益增长的背景下,Flutter与开源鸿蒙并非对立关系,而是可实现技术融合,发挥各自优势,核心有两种融合方案,适用于不同开发场景。

4.1 方案一:Flutter嵌入开源鸿蒙,实现跨端+原生融合

基于开源鸿蒙的Flutter引擎适配(鸿蒙已支持Flutter应用运行),将Flutter模块化开发的跨端应用,嵌入开源鸿蒙原生应用中,核心思路:

  1. 开源鸿蒙端:以模块化拆分原生Ability(如分布式能力模块、设备协同模块),通过har包复用原生通用能力;
  2. Flutter端:以模块化开发跨端业务核心(如首页、我的、购物车),通过Package复用跨端通用功能;
  3. 融合方式:开源鸿蒙通过FlutterView将Flutter模块嵌入原生PageAbility中,通过MethodChannel实现Flutter模块与鸿蒙原生模块的通信,兼顾跨端效率与鸿蒙原生分布式能力。

4.2 方案二:通用模块跨框架复用,降低开发成本

将二者的通用功能(如网络请求、数据存储、工具类)抽离为跨框架兼容的接口层,核心思路:

  1. 定义统一的通用能力接口(如网络请求接口、存储接口);
  2. Flutter端:基于接口实现Flutter版本的实现类,封装为Package;
  3. 开源鸿蒙端:基于接口实现鸿蒙版本的实现类,封装为har包;
  4. 业务层:基于接口调用通用能力,无需关注底层实现,实现通用模块的跨框架复用,大幅降低双端开发成本。

五、 总结与展望

Flutter模块化开发以灵活轻便、跨端复用为核心优势,通过Package与业务子模块的拆分,能高效解决大型跨端应用的开发与维护问题,是Flutter进阶的必备技能;开源鸿蒙模块化开发以系统级分布式能力为核心,通过多HAP包与Ability组件的拆分,实现全场景设备协同,是国产化原生开发的核心架构。

二者虽在实现方式、核心定位上存在差异,但模块化开发的核心思想(分而治之、高内聚低耦合)完全一致。对于开发者而言,掌握Flutter模块化开发能提升跨端开发效率,了解开源鸿蒙模块化开发能把握国产化技术趋势,而二者的技术融合,将是未来跨端+原生开发的主流方向。

后续开发中,建议开发者深耕一种框架的模块化落地,同时了解另一种框架的设计思路,取长补短,在不同项目场景中选择最优的模块化方案,真正发挥技术的价值。

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

相关推荐
西西学代码3 小时前
Flutter---对话框
flutter
梧桐ty3 小时前
鸿蒙生态下的跨平台框架选型指南:Flutter vs React Native vs uni-app
flutter·华为·harmonyos
巴拉巴拉~~4 小时前
Flutter高级动画艺术:掌握交错动画,打造丝滑精致的UI体验
javascript·flutter·ui
庄雨山4 小时前
Flutter 质量保障体系搭建实战:兼谈开源鸿蒙应用质量管控异同与融合
flutter·openharmony
晚烛12 小时前
Flutter + OpenHarmony 导航与状态管理架构:构建可维护、可扩展、高性能的鸿蒙应用骨架
flutter·架构·harmonyos
晚烛13 小时前
实战前瞻:构建高可靠、强协同的 Flutter + OpenHarmony 智慧教育平台
javascript·flutter·html
想学后端的前端工程师14 小时前
【Flutter跨平台开发实战指南:从零到上线-web技术栈】
前端·flutter
晚烛18 小时前
实战前瞻:构建高可靠、低延迟的 Flutter + OpenHarmony 智慧交通出行平台
前端·javascript·flutter