news 2026/7/10 9:38:22

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/7/9 19:25:52

Mem Reduct内存清理终极指南:告别卡顿的完整解决方案

Mem Reduct内存清理终极指南&#xff1a;告别卡顿的完整解决方案 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 电脑…

作者头像 李华
网站建设 2026/7/8 14:04:58

LeaguePrank终极教程:免费打造专属英雄联盟个性化形象

LeaguePrank终极教程&#xff1a;免费打造专属英雄联盟个性化形象 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟中展现独一无二的个性风采&#xff1f;LeaguePrank正是你需要的完美解决方案&#xff01;这款基…

作者头像 李华
网站建设 2026/7/8 3:16:33

LobeChat界面美学设计揭秘:为何用户第一眼就爱上它?

LobeChat界面美学设计揭秘&#xff1a;为何用户第一眼就爱上它&#xff1f; 在AI聊天机器人几乎随处可见的今天&#xff0c;打开一个新工具时&#xff0c;你是否曾因为某个界面“特别顺眼”而多停留了几分钟&#xff1f;又或者&#xff0c;仅仅几秒之内&#xff0c;你就决定关掉…

作者头像 李华
网站建设 2026/7/9 11:36:19

UC3842反激式开关电源上电前测试方法

在UC3842反激式开关电源上电前进行测试&#xff0c;主要是为了避免可能的故障和损坏。以下是一些原因&#xff1a;● 避免炸毁UC3842芯片&#xff1a;在上电之前进行测试可以确认UC3842芯片的参数是否符合规范&#xff0c;包括启动电压。若UC3842有故障&#xff0c;可能会在上电…

作者头像 李华
网站建设 2026/7/9 17:01:29

25 岁转行晚了?网安工程师手把手带你入门到精通,来得及!

25岁&#xff0c;转行网络安全工程师来还来得及吗&#xff1f;手把手带你入门到精通&#xff0c;一切都来得及&#xff01; 25岁&#xff0c;转行网络安全工程师来还来得及吗&#xff1f; 首先说一下这个行业的现状&#xff0c;真正科班出身网络安全专业的很少&#xff0c;因…

作者头像 李华