Flutter屏幕共享插件imin_vice_screen的使用

Flutter屏幕共享插件imin_vice_screen的使用

imin_vice_screen 是一个用于在Android平台上使用imin屏幕共享SDK的Flutter插件。

资源

平台支持

Android

开始使用

安装

pubspec.yaml 文件中添加依赖:

dependencies:
  imin_vice_screen: ^0.0.1

或者直接运行命令:

flutter pub add imin_vice_screen

示例文件夹

查看 example 文件夹以获取完整的示例代码。

如何使用

1. 在主入口区分主屏和副屏

void main() {
  var defaultRouteName = window.defaultRouteName;
  if ("viceMain" == defaultRouteName) {
    viceScreenMain(); 
  } else {
    defaultMain();
  }
}

// 主屏UI
void defaultMain() {
  runApp(MainApp());
}

// 副屏UI
void viceScreenMain() {
  runApp(SubApp());
}

2. 使用封装能力在主屏和副屏之间通信

2.1 主屏到副屏
import 'package:imin_vice_screen/imin_vice_screen.dart';
final _iminViceScreenPlugin = IminViceScreen();

/// 发送消息
_iminViceScreenPlugin.sendMsgToViceScreen("data", params: {"params": "123"});

/// 接收副屏消息
_iminViceScreenPlugin.mainStream.listen((event) {
  print("主屏接收数据: ${event}");
});
2.2 副屏到主屏
import 'package:imin_vice_screen/imin_vice_screen.dart';
final _iminViceScreenPlugin = IminViceScreen();

/// 发送消息
_iminViceScreenPlugin.sendMsgToMainScreen("data", params: {"params": "456"});

/// 接收主屏消息
_iminViceScreenPlugin.viceStream.listen((event) {
  print("副屏接收数据: ${event}");
});

3. 检查是否支持双屏

bool isSupportMultipleScreen = await _iminViceScreenPlugin.isMultipleScreen();
print("是否支持多屏: $isSupportMultipleScreen");

4. 检查当前应用是否有悬浮窗口权限

bool checkOverlayPermission = await _iminViceScreenPlugin.checkOverlayPermission();
print("检查悬浮窗口权限: $checkOverlayPermission");

5. 请求悬浮窗口权限以设置副屏为持久窗口

await _iminViceScreenPlugin.requestOverlayPermission();

6. 打开和关闭副屏

await _iminViceScreenPlugin.doubleScreenOpen(); /// 打开
await _iminViceScreenPlugin.doubleScreenClose(); /// 关闭

初始化完成后副屏显示

android/values/attrs.xml 中添加配置:

<!-- 是否在初始化时自动显示副屏 -->
<bool name="autoShowSubScreenWhenInit">true</bool>

LCD副屏显示

1. LCD初始化

import 'package:imin_vice_screen/enums.dart';
import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.sendLCDCommand(LCDCommand.initLCD); // 初始化LCD
await iminViceScreenPlugin.sendLCDCommand(LCDCommand.wakeLCD); // 唤醒LCD
await iminViceScreenPlugin.sendLCDCommand(LCDCommand.sleepLCD); // 睡眠LCD
await iminViceScreenPlugin.sendLCDCommand(LCDCommand.cleanScreenLCD); // 清屏

2. 发送字符串在副屏上显示

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.sendLCDString('你好世界');

3. 发送字符串在副屏上显示

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.sendLCDString('你好世界');

4. 发送多行副屏内容字符串

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.sendLCDMultiString(
  contents: ["很高兴见到你", "Des", "Hi"],
  aligns: [0, 1, 2]
);

5. 发送两行副屏内容字符串

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.sendLCDDoubleString(
  topText: '顶部内容',
  bottomText: '底部内容'
);

6. 发送图片在副屏上显示

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

// 使用字节
Uint8List byte = await readFileBytes('assets/images/logo.png');
await iminViceScreenPlugin.sendLCDBitmap(byte);

// 或者使用URL
await iminViceScreenPlugin.sendLCDBitmap(
  'https://oss-sg.imin.sg/web/iMinPartner2/images/logo.png',
  pictureStyle: IminPictureStyle(
    width: 240,
    height: 320,
  )
);

7. 设置字体大小

import 'package:imin_vice_screen/imin_vice_screen.dart';
final iminViceScreenPlugin = IminViceScreen();

await iminViceScreenPlugin.setTextSize(15);

示例代码

import 'package:flutter/material.dart';
import 'pages/lcd_home.dart';
import 'pages/main_home.dart';
import 'pages/sub_home.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});
  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool hasSubSreen = false;

  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      onGenerateRoute: (RouteSettings routeSettings) {
        return MaterialPageRoute<void>(
          settings: routeSettings,
          builder: (BuildContext context) {
            if (routeSettings.name == 'viceMain') {
              hasSubSreen = true;
              switch (routeSettings.name) {
                case SubHome.routeName:
                default:
                  return const SubHome();
              }
            } else {
              switch (routeSettings.name) {
                case MainHome.routeName:
                default:
                  return hasSubSreen ? const MainHome() : const LCDHome();
              }
            }
          },
        );
      },
    );
  }
}

更多关于Flutter屏幕共享插件imin_vice_screen的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕共享插件imin_vice_screen的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


关于在Flutter中使用imin_vice_screen插件来实现屏幕共享功能,以下是一个简单的代码示例,展示如何集成和使用该插件。请注意,imin_vice_screen可能是一个假想的插件名称,因为在我最后的知识更新中,Flutter社区并没有一个广泛认可的直接名为imin_vice_screen的插件。然而,这个示例将模拟一个屏幕共享插件的基本使用方法。如果你有一个具体的插件,请参考其官方文档进行调整。

假设imin_vice_screen插件提供了开始屏幕共享、停止屏幕共享以及获取屏幕数据的功能,下面是一个可能的代码示例:

  1. pubspec.yaml中添加依赖(注意:这里的依赖名imin_vice_screen是假设的,请替换为实际插件名):
dependencies:
  flutter:
    sdk: flutter
  imin_vice_screen: ^x.y.z  # 替换为实际版本号
  1. lib/main.dart中导入插件并编写示例代码
import 'package:flutter/material.dart';
import 'package:imin_vice_screen/imin_vice_screen.dart'; // 假设的导入路径

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  IminViceScreenController? _screenController;

  @override
  void initState() {
    super.initState();
    // 初始化屏幕共享控制器
    _screenController = IminViceScreenController();
    // 开始屏幕共享(这里假设startScreenShare是一个异步方法)
    _startScreenShare();
  }

  @override
  void dispose() {
    // 停止屏幕共享并释放资源
    _screenController?.stopScreenShare();
    _screenController?.dispose();
    super.dispose();
  }

  Future<void> _startScreenShare() async {
    try {
      // 开始屏幕共享(假设此方法返回一个Future)
      await _screenController?.startScreenShare();
      print('Screen sharing started successfully.');
    } catch (e) {
      print('Failed to start screen sharing: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Screen Sharing Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () async {
                  // 这里可以添加停止屏幕共享的逻辑,但为了简单起见,我们已经在dispose中处理了
                  // await _screenController?.stopScreenShare();
                  Navigator.pushReplacementNamed(context, '/stopScreenShare'); // 假设有一个路由来处理停止共享的逻辑
                },
                child: Text('Stop Screen Sharing'),
              ),
              // 假设有一个方法可以从_screenController获取屏幕数据并显示
              // Text('Screen Data: ${_screenController?.getScreenData()}'),
            ],
          ),
        ),
      ),
    );
  }
}

// 注意:由于`imin_vice_screen`是假设的,以下路由和页面仅作为示例
class StopScreenSharePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final IminViceScreenController? screenController =
        ModalRoute.of(context)!.settings.arguments as IminViceScreenController?;
    return Scaffold(
      appBar: AppBar(title: Text('Stopping Screen Sharing')),
      body: Center(
        child: ElevatedButton(
          onPressed: () async {
            await screenController?.stopScreenShare();
            Navigator.pop(context);
          },
          child: Text('Confirm Stop'),
        ),
      ),
    );
  }
}

注意

  • 上面的代码是基于假设的imin_vice_screen插件的功能编写的。实际插件可能有不同的API和初始化方法。
  • 在真实应用中,你需要根据插件的文档来调整代码。
  • 屏幕共享通常涉及复杂的权限处理和网络通信,确保你的应用已经正确处理了这些方面。
  • 插件可能需要在AndroidManifest.xmlInfo.plist中添加特定的权限声明。

请查阅你实际使用的屏幕共享插件的文档,以获取准确的集成指南和API参考。

回到顶部