Flutter Web:混合开发的最佳实践

Flutter Web:混合开发的最佳实践

一次编写,多端运行。Flutter Web 让前端开发更加高效。

一、Flutter Web 的优势

作为一名追求像素级还原的 UI 匠人,我对跨平台解决方案有着严格的要求。Flutter Web 不仅让我们能够使用相同的代码库构建 Android、iOS 和 Web 应用,还提供了出色的性能和一致的用户体验。它就像是一把瑞士军刀,为前端开发带来了前所未有的便利。

二、环境搭建

1. 启用 Web 支持

# 启用 Web 支持 flutter config --enable-web # 检查可用设备 flutter devices # 创建项目 flutter create my_web_app cd my_web_app # 运行 Web 应用 flutter run -d chrome 

2. 项目结构

my_web_app/ lib/ main.dart # 主入口 home_screen.dart # 主屏幕 components/ # 组件 services/ # 服务 web/ # Web 特定文件 index.html # HTML 入口 manifest.json # PWA 配置 icons/ # 图标 pubspec.yaml # 依赖配置 

三、基础实现

1. 简单的 Web 应用

import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Web Demo', theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: const HomeScreen(), ); } } class HomeScreen extends StatefulWidget { const HomeScreen({super.key}); @override _HomeScreenState createState() => _HomeScreenState(); } class _HomeScreenState extends State<HomeScreen> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Flutter Web Demo'), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.headline4, ), ], ), ), floatingActionButton: FloatingActionButton( onPressed: _incrementCounter, tooltip: 'Increment', child: const Icon(Icons.add), ), ); } } 

四、Web 特定功能

1. 响应式布局

class ResponsiveLayout extends StatelessWidget { final Widget mobileLayout; final Widget tabletLayout; final Widget desktopLayout; const ResponsiveLayout({ Key? key, required this.mobileLayout, required this.tabletLayout, required this.desktopLayout, }) : super(key: key); @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, constraints) { if (constraints.maxWidth < 600) { return mobileLayout; } else if (constraints.maxWidth < 1024) { return tabletLayout; } else { return desktopLayout; } }, ); } } // 使用 class HomePage extends StatelessWidget { @override Widget build(BuildContext context) { return ResponsiveLayout( mobileLayout: MobileHome(), tabletLayout: TabletHome(), desktopLayout: DesktopHome(), ); } } 

2. 平台检测

import 'package:flutter/foundation.dart'; class PlatformAwareWidget extends StatelessWidget { @override Widget build(BuildContext context) { if (kIsWeb) { // Web 特定实现 return WebSpecificWidget(); } else if (Platform.isAndroid) { // Android 特定实现 return AndroidSpecificWidget(); } else if (Platform.isIOS) { // iOS 特定实现 return IOSSpecificWidget(); } else { // 通用实现 return CommonWidget(); } } } 

3. 与 Web API 交互

import 'dart:js' as js; class WebInteropWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [ ElevatedButton( onPressed: () { // 调用 JavaScript 函数 js.context.callMethod('alert', ['Hello from Flutter!']); }, child: Text('Show Alert'), ), ElevatedButton( onPressed: () { // 访问 DOM js.context['document'].callMethod('title', ['Flutter Web App']); }, child: Text('Change Title'), ), ], ); } } 

五、性能优化

1. 代码分割

// main.dart void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( routes: { '/': (context) => HomePage(), '/details': (context) => DetailsPage(), }, ); } } // details_page.dart class DetailsPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: Text('Details')), body: Center(child: Text('Details Page')), ); } } 

2. 图片优化

class OptimizedImage extends StatelessWidget { final String src; final double? width; final double? height; const OptimizedImage({ Key? key, required this.src, this.width, this.height, }) : super(key: key); @override Widget build(BuildContext context) { return Image.network( src, width: width, height: height, loadingBuilder: (context, child, loadingProgress) { if (loadingProgress == null) return child; return Center( child: CircularProgressIndicator( value: loadingProgress.expectedTotalBytes != null ? loadingProgress.cumulativeBytesLoaded / loadingProgress.expectedTotalBytes! : null, ), ); }, errorBuilder: (context, error, stackTrace) { return Container( width: width, height: height, color: Colors.grey[200], child: Icon(Icons.error), ); }, ); } } 

六、PWA 支持

1. 配置 manifest.json

{ "name": "Flutter Web App", "short_name": "FlutterApp", "description": "A Flutter Web application", "start_url": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#4285f4", "icons": [ { "src": "icons/Icon-192.png", "sizes": "192x192", "type": "image/png" }, { "src": "icons/Icon-512.png", "sizes": "512x512", "type": "image/png" } ] } 

2. 配置 service_worker.js

// service_worker.js const CACHE_NAME = 'flutter-app-cache'; const ASSETS = [ '/', '/index.html', '/manifest.json', '/icons/Icon-192.png', '/icons/Icon-512.png', ]; self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => { return cache.addAll(ASSETS); }) ); }); self.addEventListener('fetch', (event) => { event.respondWith( caches.match(event.request).then((response) => { return response || fetch(event.request); }) ); }); 

七、部署

1. 构建 Web 应用

# 开发模式 flutter build web # 生产模式(优化) flutter build web --release --web-renderer canvaskit # 生产模式(体积更小) flutter build web --release --web-renderer html 

2. 部署到静态网站托管

  • Firebase Hosting
  • Netlify
  • Vercel
  • GitHub Pages

Flutter Web 让跨平台开发变得简单优雅,就像好的设计一样自然。

#flutter #web #hybrid #cross-platform #frontend

Read more

Trae、Cursor、Copilot、Windsurf对比

我最开始用Copilot(主要是结合IDE开发时进行代码补全,生成单元测试用例),但是后面又接触了Cursor,发现Cursor比Copilot更加实用,Cursor生成的单元测试用例更加全面。         多以网上查了查资料,这里记录分享一下。         这篇文章资料来自于网络,是对部分知识整理,这里只是记录一下,仅供参考 前言         随着AI技术的爆发式发展,AI编程工具正在重塑软件开发流程。GitHub Copilot作为先驱者长期占据市场主导地位,但新一代工具如Cursor、Windsurf和Trae正以颠覆性创新发起挑战。本文基于多维度实测数据,深度解析三款工具的核心竞争力,揭示AI编程工具的格局演变趋势。 工具定位与核心技术 1. Cursor:智能化的全能助手         基于VS Code生态深度改造,Cursor融合GPT-4和Claude 3.5模型,支持自然语言转代码生成、跨文件智能补全和自动文档生成。其核心优势在于: * 上下文感知能力:可同时分析10+个关联文件的语义逻辑 * Agent模

Windows 23H2 Copilot 烦不胜烦?两种关闭方案!适配联想全系列设备

升级 Windows 23H2 系统后,不少联想用户(涵盖台式机、ThinkPad、笔记本等全系列机型)都遇到了同款困扰:Copilot 要么自动弹窗打扰操作,要么按 Win+C 快捷键时弹出 “该服务在你所在地区不可用” 的提示,既占系统资源又影响使用体验。明明用不上的功能,却总在关键时刻 “刷存在感”,让人忍不住想彻底关闭,却不知道该从何下手。 其实关闭 Copilot 有两种实用方案,可根据自身需求选择:如果只是想隐藏任务栏的 Copilot 图标,避免视觉干扰,推荐用简单的 “仅关闭图标方案”—— 进入系统 “个性化 - 任务栏 - 任务栏项”,直接关闭 Copilot 功能即可,操作零门槛,还能随时重新开启;若想彻底禁用该功能,杜绝弹窗和快捷键触发,就需要用到 “注册表修改方案”,不过要注意此操作涉及注册表编辑,需谨慎按照步骤执行:

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

🌹欢迎来到《小5讲堂》🌹 🌹这是《文心智能体》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹 目录 * 前言 * 智能体信息 * 名称 * 简介 * 人设 * 开场白 * 工作流 * 消息节点 * 文本处理节点 * 插件节点 * 图片消息节点 * 输出效果 * 小技巧 * 一、结构化框架设计 * 1. **角色定位+任务拆解** * 2. **四要素公式法** * 二、多轮对话优化 * 1. **分步骤引导** * 2. **示例参考法** * 三、细节强化技巧 * 1. **输出格式标准化** * 2. **专业术语与风格** * 四、避免常见误区 * 1. **模糊需求导致输出偏差** * 2. **过度复杂导致理解困难** * 相关文章

VSCode扩展工具Copilot MCP使用教程【MCP】

VSCode扩展工具Copilot MCP使用教程【MCP】

MCP(Model Context Protocol,模型上下文协议) ,2024年11月底,由 Anthropic 推出的一种开放标准,旨在统一大型语言模型(LLM)与外部数据源和工具之间的通信协议。本文章教你使用VSCode扩展工具Copilot MCP快速上手MCP应用! 1. VSCode中安装Copilot MCP Copilot MCP是一个适用于 VSCode 的 MCP Client。 2. Copilot MCP使用 安装之后会出现Coplilot授权,并在左侧菜单中出现MCP Server按钮 3. Add Server 点击Add Server,MCP Server分为两种建立方式,Process和SSE 以Process为例,输入必要信息: 其中Server Name是你给Server起的任意名字,需要注意的是Start Command。 这里我的输入为: npx -y @modelcontextprotocol/server-filesystem /path 注意path修改为自己的文件路径,