You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter项目架构咨询:iOS与macOS代码共享及差异化构建

跨平台架构重构与核心代码共享方案

一、拆分核心业务与平台相关代码

直接把原有的lib目录拆成三个逻辑模块,彻底隔离共享代码和平台专属代码:

  • core/:存放全平台通用的核心逻辑,包括数据模型、网络请求封装、业务规则、状态管理核心(比如Bloc/Provider的业务逻辑层)、工具类等,这部分代码所有平台直接复用,不用做任何修改。
  • platforms/:按平台分目录,比如platforms/ios/、platforms/macos/,专门放各自平台独有的代码,比如平台专属UI组件、原生交互逻辑、入口配置等。
  • shared_ui/:存放多平台通用的基础UI组件,比如通用卡片、文本样式、基础按钮(可通过条件渲染适配不同平台风格),减少重复代码。

二、分离平台入口文件

保留原来的lib/main.dart作为iOS/Android的入口,专门处理移动端的初始化和UI启动;同时新增lib/main_macos.dart作为macOS的入口,负责适配macOS的窗口配置、菜单栏等专属特性:

  • 在pubspec.yaml里配置不同平台的入口文件,让Flutter自动识别:
    flutter:
      targets:
        ios:
          main: lib/main.dart
        macos:
          main: lib/main_macos.dart
    
  • 两个入口文件各自初始化对应平台的UI框架,比如iOS用底部导航栏,macOS用侧边栏布局:
    // iOS入口 main.dart
    void main() {
      runApp(const MaterialApp(home: BottomNavScaffold()));
    }
    
    // macOS入口 main_macos.dart
    void main() {
      runApp(const MaterialApp(home: SidebarScaffold()));
    }
    

三、UI适配的落地方式

针对UI差异,分两种场景处理:

  • 组件级差异:用dart.io的Platform类做条件渲染,在通用组件里根据平台加载对应样式:
    import 'dart:io';
    
    Widget buildActionButton() {
      if (Platform.isMacOS) {
        return MacOSCustomButton(); // 自定义macOS风格按钮
      } else {
        return CupertinoButton(); // iOS原生风格按钮
      }
    }
    
  • 页面/布局级差异:直接在各自平台的入口文件里加载不同的页面框架,核心业务逻辑还是调用core/里的代码,只是UI结构不同。

四、核心逻辑的完全共享

状态管理、业务逻辑、数据处理这些核心部分全部放在core/目录,所有平台直接引用:

  • 比如用户数据请求的core/repositories/user_repo.dart,iOS和macOS的UI层都可以直接调用这个类获取数据,各自渲染不同的展示界面,不用重复写请求逻辑。
  • 状态管理类(比如Bloc)也放在core/,平台UI层只需要监听状态变化,渲染对应的UI即可。

五、原生代码的处理

如果有iOS原生代码,把通用的原生逻辑抽成独立框架,macOS项目可以直接引用;平台独有的原生功能(比如iOS的Touch ID、macOS的Touch Bar适配)分别放在ios/和macos/目录下,互不干扰。

内容的提问来源于stack exchange,提问作者El Dude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:12:45