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

Qwen3-32B开源部署新范式:Clawdbot提供CLI命令行工具+Web UI双操作入口

Qwen3-32B开源部署新范式:Clawdbot提供CLI命令行工具+Web UI双操作入口 1. 为什么你需要一个“更轻、更稳、更顺手”的Qwen3-32B用法? 你是不是也遇到过这些情况? 下载完Qwen3-32B模型,光是装Ollama、拉镜像、配环境变量就折腾掉一整个下午;好不容易跑起来,发现每次调用都要写curl命令或改Python脚本;想给同事演示,还得临时搭个前端页面——结果UI丑、响应慢、连历史对话都存不住。 Clawdbot不是又一个“封装一层API”的工具。它把Qwen3-32B真正变成了你电脑里一个开箱即用的本地AI伙伴: * 不用碰Docker Compose文件,不用记端口映射规则,一条命令就能启动; * 命令行里直接聊天、批量提问、导出记录,像用ls、cat一样自然; * Web界面干净清爽,支持多轮对话、上下文记忆、自定义系统提示,打开浏览器就能用; * 所有交互都走本地,模型不上传、数据不出设备、请求不经过第三方服务器。 这不是“能跑就行”的部署,而是为真实使用场景打磨出来的双入口工作流——CLI适合开发者快速验证和集成,Web

深入剖析 WebHostView:浏览器内核中的桌面级 Web 宿主

深入剖析 WebHostView:浏览器内核中的桌面级 Web 宿主

引言 随着桌面级 Web 应用需求的增加,浏览器内核的角色逐渐从一个单纯的网页渲染引擎演化为一个“Web 运行时平台”,为更多类型的应用场景提供支持。在这一过程中,WebHostView 作为一个关键组件,担当了将传统的网页浏览功能与桌面应用深度融合的桥梁。它的出现不仅解决了浏览器原生 Tab 模型无法满足桌面应用需求的问题,也推动了浏览器从“Web 浏览器”向“Web 应用平台”的演变。 本文将详细分析 WebHostView 的设计理念、功能架构及其在 360 浏览器中的具体应用,探讨它如何打破传统浏览器内核的局限,成为一种全新的系统级 Web 宿主。 1. 浏览器内核的架构演变 传统浏览器内核架构 在传统的浏览器架构中,WebContents 作为网页渲染的核心,绑定于浏览器的标签页(Tab)、WebUI(chrome:// 页面)以及扩展视图(Extension View)。这些宿主形态都属于浏览器界面的一部分,通常具备以下共同特点: * 标签页(Tab)

ctfshow Web入门命令执行29-124全通关详解(看这一篇就够啦~)

文章目录 * 命令执行 * web29-web31:基础注入 * web29 * web30 * web31 * web32-web36:参数逃逸 * web32 * web33 * web34-36 * web37-web39:文件包含+伪协议命令执行 * web37 * web38 * web39 * web40:无参数RCE * web41:无字母RCE * web42-web53:绕过无回显RCE * web42 * web43 * web44 * web45 * web46 * web47-web49 * web50 * web51 * web52 * web52 * web53 * web54:关键词模糊匹配 * web55-web57:字符集受限 RCE * web55 * web56 * we

7个用于运行LLM的最佳开源WebUI

7个用于运行LLM的最佳开源WebUI

无论是希望将AI大模型集成到业务流程中,还是寻求企业客户服务自动化,亦或者是希望创建一个强大的个人学习工具。可能都需要考虑数据安全、灵活度以及更具有可控性的使用和开发基础。值得考虑的一个方案是:将大模型(LLM)私有化并且创建一个好用的LLM WebUI系统。 下面,我们推荐7个出色的开源LLM WebUI 系统。 01.Open WebUI(Ollama WebUI) https://github.com/open-webui/open-webui Star:45.7K 开发语言:Python、TypeScript\Svelte Open WebUI是一个可扩展、功能丰富且用户友好的WebUI,旨在完全离线操作。它支持包括Ollama和OpenAI在内的各种LLM运行容器或者API。 产品特点: * 直观的界面:受ChatGPT启发的用户友好型聊天 * 响应式设计:在桌面和移动的上实现流畅的性能 * 轻松安装:使用Docker/Kubernetes轻松安装 * 主题定制:个性化与多个主题 * 高亮:增强代码的可读性 * Markdown LaTeX支持: