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

AI【应用 04】FunASR离线文件转写服务开发指南(实践篇)

FunASR离线文件转写服务开发指南(实践篇) * 1.是什么 * 2. 快速上手 * 2.1 docker安装 * 2.2 镜像启动 * 2.3 服务端启动 * 2.4 客户端测试与使用 * 3. 客户端用法详解 * 3.1 python-client * 3.2 cpp-client * 3.3 Html网页版 * 3.4 Java-client * 3.4.1 Building for Linux/Unix * 4. 服务端用法详解 * 4.1 启动FunASR服务 * 4.2 关闭FunASR服务 * 4.3 修改模型及其他参数

AI资源白嫖——Trae国际版一周年福利,免费用一个月600次快速请求

AI资源白嫖——Trae国际版一周年福利,免费用一个月600次快速请求

AI资源白嫖——Trae国际版一周年福利,免费用一个月600次快速请求 作为字节跳动推出的全球首款AI原生IDE,Trae自上线以来就凭借强大的代码生成、多模型适配能力圈粉无数开发者。恰逢Trae国际版上线一周年(1月20日周年庆),官方开启了重磅福利大放送,无论你是免费用户还是Pro用户,都能领到专属快速请求额度,堪称AI编程党的“羊毛盛宴”。今天就带大家吃透这份福利,手把手教你领取、使用,顺带解锁Trae国际版的隐藏玩法。 一、福利核心详情:谁能领?领多少? 本次一周年福利面向Trae国际版全量用户,无门槛覆盖免费用户与Pro用户,额度与有效期根据用户类型差异化配置,具体如下: * 免费用户:直接赠送600次Fast Request(快速请求),有效期至北京时间2026年2月14日10:00,足足一个月的使用期限,日常开发需求完全够用。 * Pro用户:升级赠送800次Fast Request,有效期延长至北京时间2026年3月14日10:00,适配专业开发者高频使用场景。 福利适用范围覆盖Trae国际版IDE全场景,包括Chat模式、Builder模式、SOLO模

AI Agent 智能体开发入门:AutoGen 多智能体协作实战教程

AI Agent 智能体开发入门:AutoGen 多智能体协作实战教程

本文通过 AutoGen 框架,从单智能体到多智能体协作,循序渐进地讲解如何构建 AI Agent 系统,包含完整的代码示例和架构设计。 1. 多智能体协作架构 通过 需修改 测试失败 测试通过 用户输入 编排者 Agent GroupChat Manager 规划 Agent 分解任务 编码 Agent 编写代码 审查 Agent 代码审查 测试 Agent 执行测试 总结 Agent 汇总报告 2. AutoGen 核心概念 45%25%20%10%AutoGen Agent 类型使用分布AssistantAgent (LLM 驱动)UserProxyAgent (人工介入)GroupChat

不仅仅是补全代码:深度解析AI如何重构我的技术栈

不仅仅是补全代码:深度解析AI如何重构我的技术栈

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕人工智能这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * 💻 不仅仅是补全代码:深度解析AI如何重构我的技术栈 * 🎯 引言:从代码补全到思维伙伴 * 🔄 技术栈的重构历程 * 第一阶段:辅助工具时期(2020-2022) * 第二阶段:协作伙伴时期(2023) * 🏗️ 重构后的技术栈架构 * 前端开发:从UI构建到体验设计 * 后端架构:智能化的系统设计 * 📊 数据驱动的技术决策 * 数据库技术栈的AI优化 * 🚀 开发流程的革命性变化 * 1. 需求分析阶段 * 2. 代码审查与优化 * 🔧 工具链的智能化升级 * 开发环境配置 * CI/CD流水线的AI优化 * 🧪 测试策略的AI革命 *