【双屏革命】Flutter双屏通信引擎:从0到1实现收银场景双屏交互全方案
一、双屏交互的痛点与破局方案
你是否还在为Flutter双屏开发烦恼?主副屏技术栈不统一、原生通信繁琐、设备兼容性差三大痛点,正在消耗团队70%的开发精力。今天推荐的flutter_subscreen_plugin彻底解决这些问题——这是一个专为Android设备打造的Flutter双屏通信引擎,通过创新的双引擎架构,让主副屏均使用Flutter绘制,并通过Channel实现毫秒级通信响应。
核心优势对比表
| 解决方案 | 技术栈统一性 | 通信效率 | 开发成本 | 适用场景 |
|---|---|---|---|---|
| 原生+Flutter混合 | ❌ 不统一 | 300ms+ | 高 | 简单展示场景 |
| 双Activity方案 | ✅ 统一 | 150ms+ | 中 | 非实时交互场景 |
| 本插件方案 | ✅ 统一 | 50ms | 低 | 收银/双屏互动场景 |
二、技术架构深度解析
2.1 整体架构流程图
2.2 核心通信机制
插件创新性地采用双引擎独立实例+Method Channel桥接模式:
- 主引擎负责主屏UI渲染与业务逻辑
- 副引擎运行在独立Overlay窗口,处理客显界面
- 通过自定义Channel实现引擎间直接通信,避免原生层中转瓶颈
三、快速集成指南(3分钟上手)
3.1 环境准备
# 克隆项目
git clone https://gitcode.com/cashier/flutter_subscreen_plugin.git
cd flutter_subscreen_plugin/example
# 安装依赖
flutter pub get
# 运行示例
flutter run
3.2 pubspec.yaml配置
dependencies:
flutter:
sdk: flutter
flutter_subscreen_plugin: ^1.0.8 # 请使用最新版本
四、核心功能与代码实现
4.1 双屏入口区分(main.dart)
import 'dart:ui';
import 'package:flutter/material.dart';
import 'main_widget.dart';
import 'sub_main_widget.dart';
void main() {
// 通过路由名称区分主副屏引擎
var defaultRouteName = window.defaultRouteName;
if ("subMain" == defaultRouteName) {
viceScreenMain(); // 副屏入口
} else {
defaultMain(); // 主屏入口
}
}
void defaultMain() => runApp(MaterialApp(home: MainApp()));
void viceScreenMain() => runApp(SubApp());
4.2 主屏核心实现(MainApp)
class _MainAppState extends State<MainApp> {
String receiveData = 'null';
@override
void initState() {
super.initState();
// 监听副屏发送的数据
SubScreenPlugin.mainStream.listen((event) {
setState(() => receiveData = event.arguments.toString());
});
}
// 发送数据到副屏
void sendMsgToSubScreen() {
SubScreenPlugin.isMultipleScreen.then((isSupport) {
if (isSupport) {
SubScreenPlugin.sendMsgToViceScreen(
"text",
params: {"num": Random().nextInt(100).toString()}
);
}
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('主屏操作端')),
body: Center(
child: Column(
children: [
Text('副屏数据:$receiveData'),
ElevatedButton(
onPressed: sendMsgToSubScreen,
child: Text('发送随机数到副屏')
),
ElevatedButton(
onPressed: () => SubScreenPlugin.doubleScreenShow(),
child: Text('开启副屏')
)
],
),
),
);
}
}
4.3 副屏核心实现(SubApp)
class _SubAppState extends State<SubApp> {
String receiveData = 'null';
@override
void initState() {
super.initState();
// 监听主屏发送的数据
SubScreenPlugin.viceStream.listen((event) {
setState(() => receiveData = event.arguments.toString());
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('客显屏')),
body: Center(
child: Column(
children: [
Text('主屏数据:$receiveData', style: TextStyle(fontSize: 24)),
ElevatedButton(
onPressed: () => SubScreenPlugin.sendMsgToMainScreen(
"response",
params: {"status": "received"}
),
child: Text('确认收到')
)
],
),
),
);
}
}
五、高级功能与设备适配
5.1 权限管理与设备检测
// 检查设备是否支持双屏
SubScreenPlugin.isMultipleScreen((result) {
print("双屏支持: $result");
});
// 申请Overlay权限(关键权限)
void checkOverlayPermission() async {
final hasPermission = await SubScreenPlugin.checkOverlayPermission;
if (!hasPermission) {
SubScreenPlugin.requestOverlayPermission();
}
}
5.2 副屏生命周期控制
// 显示副屏(支持悬浮窗模式)
SubScreenPlugin.doubleScreenShow();
// 隐藏副屏
SubScreenPlugin.doubleScreenCancel();
// 初始化时自动显示副屏(Android配置)
// 在android/values/attrs.xml中添加:
<bool name="autoShowSubScreenWhenInit">true</bool>
5.3 第三方插件扩展
当副屏需要使用相机、支付等插件时,需在MainActivity中注册:
// Android原生代码
FlutterSubscreenPlugin.registerThirdPlugins(
arrayListOf(
io.flutter.plugins.camera.CameraPlugin(), // 相机插件
com.your.package.YourPlugin() // 自定义插件
),
this.flutterEngine!!.plugins
)
六、实战案例:收银系统双屏交互
6.1 业务流程图
6.2 核心业务代码片段
// 主屏发送支付金额
void sendPaymentAmount(double amount) {
SubScreenPlugin.sendMsgToViceScreen(
"payment_request",
params: {
"amount": amount,
"orderId": generateOrderId(),
"timeout": 300 // 5分钟超时
}
);
}
// 副屏接收支付请求
SubScreenPlugin.viceStream.listen((event) {
if (event.method == "payment_request") {
final data = event.arguments as Map;
_showPaymentDialog(data['amount'], data['orderId']);
}
});
七、常见问题与性能优化
7.1 兼容性适配表
| 设备类型 | 支持情况 | 注意事项 |
|---|---|---|
| 原生双屏设备 | ✅ 完美支持 | 无需额外配置 |
| 单屏+扩展屏 | ✅ 支持 | 需要开启悬浮窗权限 |
| Android < 7.0 | ❌ 不支持 | 建议升级系统或使用旧版插件 |
7.2 性能优化建议
- 减少通信频率:批量发送数据而非频繁单次发送
- 优化UI渲染:副屏避免复杂动画和过度绘制
- 内存管理:在不使用时调用doubleScreenCancel释放资源
八、安装与参与贡献
8.1 快速安装
flutter pub add flutter_subscreen_plugin
8.2 源码获取与贡献
git clone https://gitcode.com/cashier/flutter_subscreen_plugin.git
cd flutter_subscreen_plugin
flutter pub get
贡献指南:
- Fork本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建Pull Request
九、未来展望
当前插件已实现双屏通信核心功能, roadmap规划包括:
- iOS平台支持(开发中)
- WebView双屏共享
- 副屏多页面路由管理
- 离线数据同步机制
欢迎通过issue反馈需求或提交PR,让我们共同打造Flutter双屏开发生态!
点赞+收藏+关注,获取最新双屏开发技术动态 下期预告:《Flutter双屏热更新方案全解析》
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



