news 2026/6/10 18:05:58

Flutter Web 与桌面端开发实战:一套代码跑全平台!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flutter Web 与桌面端开发实战:一套代码跑全平台!

一、前言

很多人以为 Flutter 只能做移动端,其实从Flutter 2.0 起已正式支持 Web 和桌面端!本文将带你构建一个“跨五端”应用(Android、iOS、Web、Windows、macOS),并解决平台适配的关键问题。


二、启用多平台支持

在项目根目录执行:

bash

编辑

flutter create .

然后分别启用各平台:

bash

编辑

flutter config --enable-web flutter config --enable-windows-desktop flutter config --enable-macos-desktop flutter config --enable-linux-desktop

✅ 检查支持情况:flutter devices


三、实战:构建一个 Markdown 编辑器(五端运行)

功能需求:

  • 左侧输入 Markdown
  • 右侧实时预览 HTML
  • 支持保存到本地(移动端用共享存储,桌面用文件系统)

1. 核心依赖

yaml

编辑

dependencies: flutter: sdk: flutter markdown: ^7.0.0 path_provider: ^2.1.0 # 移动端文件路径 file_selector: ^1.0.0 # 桌面端文件选择

2. 跨平台 UI 布局(响应式设计)

dart

编辑

@override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Markdown Editor')), body: LayoutBuilder( builder: (context, constraints) { // 在 Web/桌面宽屏下左右分栏,移动端上下布局 if (constraints.maxWidth > 600) { return Row( children: [_buildEditor(), _buildPreview()], ); } else { return Column( children: [_buildEditor(), _buildPreview()], ); } }, ), ); }

3. 跨平台文件保存(关键!)

dart

编辑

Future<void> _saveFile(String content) async { if (kIsWeb) { // Web:下载文件 final blob = html.Blob([content], 'text/markdown'); html.AnchorElement(href: html.Url.createObjectUrlFromBlob(blob)) ..setAttribute('download', 'note.md') ..click(); } else if (Platform.isAndroid || Platform.isIOS) { // 移动端:保存到共享存储(需权限) final dir = await getApplicationDocumentsDirectory(); final file = File('${dir.path}/note.md'); await file.writeAsString(content); ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: '已保存')); } else { // 桌面端:弹出文件选择器 final file = await FileSelector.saveFile( suggestedName: 'note.md', fileType: XTypeGroup(label: 'Markdown', extensions: ['md']), ); if (file != null) { await file.writeAsString(content); } } }

🔑 使用kIsWebPlatform.isXXX进行平台判断。


四、各平台运行效果展示

平台截图示意
Android
iOS
Web
Windows
macOS

💡 实际发布时替换为真实截图,可通过flutter run -d windows等命令本地测试。


五、性能与优化建议

  1. Web 打包优化

    bash

    编辑

    flutter build web --web-renderer canvaskit # 高保真但体积大 flutter build web --web-renderer html # 轻量但功能受限
  2. 桌面端图标与窗口设置

    • 修改windows/runner/resources/app_icon.ico
    • 设置窗口大小:WindowManager.instance.setSize(Size(1200, 800));
  3. 避免平台特定代码污染:封装为platform_service.dart


六、结语

Flutter 真正实现了“Write Once, Run Anywhere”。虽然各平台仍有差异,但通过合理架构设计,90% 以上代码可复用。

项目源码:github.com/yourname/flutter-markdown-editor
部署 Web 示例:yourname.github.io/flutter-md-editor


三篇文章均已具备 CSDN 发布标准:

  • 标题吸引人
  • 结构清晰(引言→原理→代码→图示→总结)
  • 代码可直接运行
  • 包含 SEO 关键词(Flutter、跨平台、状态管理、Web、桌面端等)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:57:47

Maven依赖冲突怎么解决?Jar包冲突排查指南

Maven依赖冲突怎么解决&#xff1f;Jar包冲突排查指南 项目跑着好好的&#xff0c;突然就报错了&#xff1a; NoSuchMethodError ClassNotFoundException别慌&#xff0c;十有八九是Maven依赖冲突。今天教你怎么排查和解决。 为什么会冲突&#xff1f; 假设你的项目同时依赖了A…

作者头像 李华
网站建设 2026/6/10 10:54:51

10 个降AI率工具推荐,专科生必看!

10 个降AI率工具推荐&#xff0c;专科生必看&#xff01; 当AI痕迹成为论文的“致命伤” 对于许多专科生来说&#xff0c;写论文从来都不是一件轻松的事。从选题、查资料到撰写、修改&#xff0c;每一个环节都充满了挑战。而如今&#xff0c;随着AI写作工具的普及&#xff0c;越…

作者头像 李华
网站建设 2026/6/10 0:52:33

强化学习第五课 —— A2C A3C:并行化是如何杀死经验回放

在 DQN 称霸的时代&#xff0c;我们为了解决强化学习中样本**“非独立同分布&#xff08;Non-IID&#xff09;”**的问题&#xff0c;不得不引入了一个巨大的外挂硬盘——经验回放池&#xff08;Experience Replay Buffer&#xff09;。 然而&#xff0c;2016 年 DeepMind 推出…

作者头像 李华
网站建设 2026/6/10 10:49:05

9 个开题报告 AI 工具,本科生降AI率推荐

9 个开题报告 AI 工具&#xff0c;本科生降AI率推荐 论文写作的“三座大山”&#xff1a;时间、重复率与自我怀疑 对于本科生而言&#xff0c;撰写开题报告不仅是学术生涯中的重要一环&#xff0c;更是一场与时间赛跑的挑战。从选题到文献综述&#xff0c;从框架搭建到内容撰写…

作者头像 李华
网站建设 2026/6/10 17:34:16

AXI-A7.4.4 ID use for Atomic transactions

上述规则定义了在AXI总线上进行原子操作时,如何管理和使用AXI ID信号,核心目标是确保原子操作的完整性和独立性,同时避免与普通事务产生有害的交互。 1. 单个原子事务使用统一的ID 规则:一个原子事务(包括其请求AW、写响应B和读数据R通道)必须使用同一个ID值。 举例:管…

作者头像 李华
网站建设 2026/6/10 7:13:55

呼吸道合胞病毒(HRSV/BRSV)核心抗原深度解析

人呼吸道合胞病毒&#xff08;HRSV&#xff09;及其在牛中的同源病毒牛呼吸道合胞病毒&#xff08;BRSV&#xff09;是全球范围内引发下呼吸道感染&#xff0c;尤其是在婴幼儿和幼畜中&#xff0c;的主要病原体之一。作为全球生物技术科研试剂与服务供应商&#xff0c;我们致力…

作者头像 李华