Flutter外部显示控制插件external_display的使用
Flutter外部显示控制插件external_display的使用
external_display
是一个支持在Flutter应用中连接外部显示器的插件。它不仅可以通过有线或无线连接到外部显示器,还允许主视图和外部显示器视图之间互相传输数据。
Getting Started
iOS配置
如果你需要在iOS平台上使用 external_display
插件,请在 AppDelegate.swift
中加入以下代码:
import external_display
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
ExternalDisplayPlugin.registerGeneratedPlugin = registerGeneratedPlugin
// 其他初始化代码
}
func registerGeneratedPlugin(controller:FlutterViewController) {
GeneratedPluginRegistrant.register(with: controller)
}
参考示例:GitHub上的完整示例
外部显示器入口点 externalDisplayMain
在Dart文件中定义外部显示器的入口点:
[@pragma](/user/pragma)('vm:entry-point')
void externalDisplayMain() {
runApp(const MaterialApp(home: ExternalView()));
}
创建 ExternalDisplay
变量
ExternalDisplay externalDisplay = ExternalDisplay();
监控外部显示器的插入和拔出
监听显示器的状态变化:
externalDisplay.addListener(onDisplayChange);
取消监听:
externalDisplay.removeListener(onDisplayChange);
获取显示器状态
bool isPlugging = externalDisplay.isPlugging;
获取外部显示器分辨率
Resolution? resolution = externalDisplay.resolution;
连接显示器
可以不指定路由名称直接连接:
await externalDisplay.connect();
或者指定路由名称连接:
await externalDisplay.connect(routeName: "YourRouteName");
主视图参数传递
添加接收参数监听器
从外部视图接收参数:
transferParameters.addListener(({required action, value}) {
print(action);
print(value);
});
移除接收参数监听器:
transferParameters.removeListener(receive);
向外部视图发送参数
await externalDisplay.sendParameters(action: "actionName", value: {"key": "value"});
确保外部显示器准备好接收参数
在连接外部显示器后,如果需要立即发送参数,则需要确保外部显示器已经准备好接收参数:
externalDisplay.waitingTransferParametersReady(
onReady: () {
print("Transfer parameters ready, transfer data!");
externalDisplay.sendParameters(action: "action", value: "data");
},
onError: () {
print("Transfer parameters fail!");
}
);
示例Demo
下面是一个完整的示例,展示了如何使用 external_display
插件来连接外部显示器并进行基本的操作:
import 'package:flutter/material.dart';
import 'package:external_display/external_display.dart';
void main() {
runApp(const MyApp());
}
[@pragma](/user/pragma)('vm:entry-point')
void externalDisplayMain() {
runApp(const MaterialApp(
home: ExternalView(),
));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
home: Home(),
);
}
}
class ExternalView extends StatelessWidget {
const ExternalView({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('This is the external view.'),
),
);
}
}
class Home extends StatefulWidget {
const Home({super.key});
[@override](/user/override)
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
final ExternalDisplay externalDisplay = ExternalDisplay();
String state = "Unplug";
String resolution = "";
void onDisplayChange(bool connecting) {
if (connecting) {
setState(() {
state = "Plug";
});
} else {
setState(() {
state = "Unplug";
resolution = "";
});
}
}
[@override](/user/override)
void initState() {
super.initState();
externalDisplay.addListener(onDisplayChange);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('External Display Example'),
),
body: Container(
color: Colors.white,
child: Column(
children: [
Container(
height: 100,
alignment: Alignment.center,
child: Text("External Monitor is $state"),
),
Container(
height: 100,
alignment: Alignment.center,
child: TextButton(
style: ButtonStyle(
foregroundColor: MaterialStateProperty.all<Color>(Colors.blue),
),
onPressed: () async {
await externalDisplay.connect();
setState(() {
resolution = "width:${externalDisplay.resolution?.width}px, height:${externalDisplay.resolution?.height}px";
});
},
child: const Text("Connect"),
),
),
Container(
height: 100,
alignment: Alignment.center,
child: Text(resolution),
),
],
),
),
);
}
}
更多关于Flutter外部显示控制插件external_display的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter外部显示控制插件external_display的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用external_display
插件来控制外部显示设备,可以让你的应用程序能够检测到连接的外部显示器,并在其上显示内容。以下是一个基本的代码示例,展示了如何使用external_display
插件来检测外部显示器并在其上显示简单的文本。
首先,确保你已经在pubspec.yaml
文件中添加了external_display
依赖:
dependencies:
flutter:
sdk: flutter
external_display: ^x.y.z # 替换为最新版本号
然后运行flutter pub get
来安装依赖。
接下来,在你的Flutter项目中,你可以按照以下步骤来使用external_display
插件:
- 导入必要的包:
import 'package:flutter/material.dart';
import 'package:external_display/external_display.dart';
- 初始化ExternalDisplay:
在你的主应用类中(通常是MyApp
或_MyHomePageState
),初始化ExternalDisplay
实例并设置监听器来检测外部显示器的连接状态。
class _MyHomePageState extends State<MyHomePage> {
late ExternalDisplay _externalDisplay;
bool _isExternalDisplayConnected = false;
@override
void initState() {
super.initState();
_externalDisplay = ExternalDisplay();
_externalDisplay.addListener(() {
setState(() {
_isExternalDisplayConnected = _externalDisplay.isConnected;
});
if (_isExternalDisplayConnected) {
// 当外部显示器连接时,执行显示内容的逻辑
_displayContentOnExternalScreen();
}
});
// 初始化时检查外部显示器连接状态
_isExternalDisplayConnected = _externalDisplay.isConnected;
}
@override
void dispose() {
_externalDisplay.removeListener(() {});
super.dispose();
}
void _displayContentOnExternalScreen() {
if (_externalDisplay.isConnected) {
_externalDisplay.createScene(id: 'mainScene').then((scene) {
scene.setRootWidget(Directionality(
textDirection: TextDirection.ltr,
child: Container(
color: Colors.white,
child: Center(
child: Text(
'Hello, External Display!',
style: TextStyle(fontSize: 24, color: Colors.black),
),
),
),
));
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('External Display Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'External Display Connected: $_isExternalDisplayConnected',
style: TextStyle(fontSize: 20),
),
],
),
),
);
}
}
- 运行你的应用:
确保你的设备或模拟器支持外部显示器连接(通常需要在真实设备上测试),然后运行你的Flutter应用。当外部显示器连接时,你应该会在外部显示器上看到"Hello, External Display!"的文本。
请注意,这个示例代码展示了基本的外部显示器检测和简单的内容显示。在实际应用中,你可能需要处理更多的场景,比如错误处理、不同分辨率的适配、以及更复杂的内容布局。此外,external_display
插件的具体API可能会随着版本的更新而变化,因此请参考插件的官方文档以获取最新的使用方法和最佳实践。