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_utils(common_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

核心规范 :每个业务模块独立拥有page、viewModel目录,不与其他模块交叉引用;模块对外仅暴露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模块化开发能提升跨端开发效率,了解开源鸿蒙模块化开发能把握国产化技术趋势,而二者的技术融合,将是未来跨端+原生开发的主流方向。

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

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

相关推荐
yuanlaile8 小时前
2026年全新Flutter 跨平台开发全栈学习资料整理
flutter·getx·鸿蒙 next·flutter开发鸿蒙·flutter入门实战·flutter全栈
硅谷魔术师15 小时前
openHarmony有没有类似安卓的scrcpy连接工具
openharmony
恋猫de小郭19 小时前
Genkit Dart 1.0 发布,Flutter 原生的 AI Agent 终于完整了
android·前端·flutter
第10086个小白19 小时前
flutter桌面端打包方式(Inno Setup Compiler)版本
前端·flutter
陆断枫1 天前
Flutter 3.47 动画引擎盘点:Impeller 全平台,和那些"新特性"
flutter
程序员老刘2 天前
Flet 1.0 思路很好,可惜来晚了
flutter·ai编程·客户端
熊猫钓鱼>_>2 天前
Kotlin Multiplatform for OpenHarmony 实战:为 Landscapist 实现图片加载适配
开发语言·kotlin·华为云·ai编程·harmonyos·鸿蒙·openharmony
m0_738185822 天前
Flutter 鸿蒙化实战:qr_code_scanner_plus 适配 OpenHarmony,二维码扫描
flutter·华为·harmonyos·鸿蒙
恋猫de小郭2 天前
Flutter + EmbeddingGemma 2,谷歌发布完全端侧的 AI Edge Foresight
android·前端·flutter
熊猫钓鱼>_>2 天前
开源鸿蒙平台 KMP 三方库 KStore 适配全流程:从 ohosArm64 target 到真机文件持久化验证
人工智能·华为·开源·ai编程·harmonyos·openharmony·kmp