Flutter子屏幕管理插件flutter_subscreen_plugin的使用
Flutter子屏幕管理插件flutter_subscreen_plugin的使用
引言
flutter_subscreen_plugin
是一个用于支持双屏交互场景的Flutter插件,如主屏(操作屏)+ 副屏(客显屏)。该插件支持双屏安卓设备,主副屏均使用Flutter进行开发,并提供方法实现双屏间的通信交互。
新老方案对比
新方案统一了技术栈,主副屏都使用Flutter进行开发,降低了开发及后期维护成本。通过创新的双引擎通信机制,确保了主副屏之间的高效交互。
接入依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
flutter_subscreen_plugin: ^1.0.8
使用方法
1. 在main入口区分主副屏
void main() {
var defaultRouteName = window.defaultRouteName;
if ("subMain" == defaultRouteName) {
viceScreenMain();
} else {
defaultMain();
}
}
// 主屏UI
void defaultMain() {
runApp(MaterialApp(home: MainApp(),));
}
// 副屏UI
void viceScreenMain() {
runApp(SubApp());
}
2. 示例:主屏发送数据给副屏
SubScreenPlugin.sendMsgToViceScreen("data", params: {"params": "123"});
3. 示例:副屏接收主屏数据
SubScreenPlugin.viceStream.listen((event) {
print(event.arguments.toString());
});
4. 提供方法:获取当前设备环境是否支持双屏
SubScreenPlugin.isMultipleScreen((result) {
print("是否支持双屏:$result");
});
5. 提供方法:判断当前应用是否具备 overlay 窗口权限
SubScreenPlugin.checkOverlayPermission((result) {
print("是否支持 overlay:$result");
});
6. 提供方法:申请 overlay 窗口权限,可将副屏设置为持久窗口
SubScreenPlugin.requestOverlayPermission();
7. 提供方法:开启,关闭副屏
SubScreenPlugin.doubleScreenShow(); // 开启
SubScreenPlugin.doubleScreenCancel(); // 关闭
8. 支付设置初始化完成后直接显示副屏
在 android/values/attrs.xml
中添加配置:
<!-- 是否在初始化时自动显示副屏 -->
<bool name="autoShowSubScreenWhenInit">true</bool>
9. 支持对副屏engine进行三方插件扩展
在 android/mainActivity/onCreate
方法中添加:
FlutterSubscreenPlugin.registerThirdPlugins(
arrayListOf(
io.flutter.plugins.camera.CameraPlugin(), // 对应的三方库名
),
this.flutterEngine!!.plugins
);
整体调用关系架构
运行效果图
完成上述步骤后,简单的demo运行效果如下:
-
主屏
-
副屏
-
点击按键,接收主屏数据的副屏
完整示例Demo
以下是完整的示例代码,包括主屏和副屏的UI以及双屏通信的实现。
main.dart
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_subscreen_plugin/flutter_subscreen_plugin.dart';
void main() {
var defaultRouteName = window.defaultRouteName;
if ("subMain" == defaultRouteName) {
viceScreenMain();
} else {
defaultMain();
}
}
// 主屏UI
void defaultMain() {
runApp(MaterialApp(
home: MainApp(),
));
}
// 副屏UI
void viceScreenMain() {
runApp(MaterialApp(
home: SubApp(),
));
}
class MainApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('主屏')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: () {
// 发送数据到副屏
SubScreenPlugin.sendMsgToViceScreen("data", params: {"message": "Hello from main screen!"});
},
child: Text('发送数据到副屏'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 检查是否支持双屏
SubScreenPlugin.isMultipleScreen((result) {
print("是否支持双屏:$result");
});
},
child: Text('检查是否支持双屏'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 检查是否有overlay权限
SubScreenPlugin.checkOverlayPermission((result) {
print("是否支持 overlay:$result");
});
},
child: Text('检查是否有overlay权限'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 申请overlay权限
SubScreenPlugin.requestOverlayPermission();
},
child: Text('申请overlay权限'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 开启副屏
SubScreenPlugin.doubleScreenShow();
},
child: Text('开启副屏'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () {
// 关闭副屏
SubScreenPlugin.doubleScreenCancel();
},
child: Text('关闭副屏'),
),
],
),
),
);
}
}
class SubApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('副屏')),
body: Center(
child: StreamBuilder(
stream: SubScreenPlugin.viceStream, // 监听来自主屏的数据
builder: (context, snapshot) {
if (snapshot.hasData) {
final data = snapshot.data?.arguments as Map<String, dynamic>;
return Text('收到主屏数据: ${data['message']}');
} else {
return Text('等待主屏数据...');
}
},
),
),
);
}
}
更多关于Flutter子屏幕管理插件flutter_subscreen_plugin的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter子屏幕管理插件flutter_subscreen_plugin的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何使用 flutter_subscreen_plugin
进行子屏幕管理的代码示例。需要注意的是,flutter_subscreen_plugin
是一个假定的插件名称,因为实际上 Flutter 并没有一个官方名为 flutter_subscreen_plugin
的插件。然而,我们可以模拟一个类似的插件功能,通过自定义的路由管理和状态管理来实现子屏幕管理。
在这个示例中,我们将使用 Flutter 的内置 Navigator
和一些自定义的路由逻辑来模拟子屏幕管理。
1. 创建 Flutter 项目
首先,确保你已经安装了 Flutter 和 Dart 环境,然后创建一个新的 Flutter 项目:
flutter create flutter_subscreen_example
cd flutter_subscreen_example
2. 定义路由和屏幕
在 lib
目录下,创建一个 screens
文件夹,并在其中创建两个 Dart 文件:home_screen.dart
和 detail_screen.dart
。
home_screen.dart
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Home Screen'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/detail');
},
child: Text('Open Detail Screen'),
),
),
);
}
}
detail_screen.dart
import 'package:flutter/material.dart';
class DetailScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Detail Screen'),
),
body: Center(
child: Text('This is the detail screen.'),
),
);
}
}
3. 设置路由
在 lib
目录下,打开 main.dart
文件,并设置路由:
import 'package:flutter/material.dart';
import 'screens/home_screen.dart';
import 'screens/detail_screen.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Subscreen Example',
theme: ThemeData(
primarySwatch: Colors.blue,
),
initialRoute: '/',
routes: {
'/': (context) => HomeScreen(),
'/detail': (context) => DetailScreen(),
},
);
}
}
4. 运行应用
现在,你可以运行你的 Flutter 应用:
flutter run
在模拟器或真实设备上,你应该能看到 Home Screen
,点击按钮后会导航到 Detail Screen
。
总结
虽然 flutter_subscreen_plugin
并不是一个实际存在的 Flutter 插件,但通过上述代码示例,我们展示了如何使用 Flutter 的路由系统来管理子屏幕。在实际项目中,你可能需要根据具体需求来扩展这个基本的路由管理逻辑,比如添加更多的屏幕、处理更复杂的导航逻辑、或者使用更高级的状态管理库(如 Riverpod 或 Provider)来管理应用状态。