Flutter通信插件waterbus_sdk的使用

发布于 1周前 作者 songsunli 来自 Flutter

以下是关于 “Flutter通信插件waterbus_sdk的使用” 的完整示例Demo:

Flutter Waterbus SDK #

Flutter 插件 Waterbus SDK。使用 SFU 模型构建视频通话或在线会议应用程序。支持 iOS 和 Android。

GitHub issueslibwebrtcCocoapods VersionPRs Welcome

⚡ 当前支持的功能 #

功能 订阅/发布 屏幕共享 画中画 虚拟背景 美颜滤镜 端到端加密
Android 🟢 🟢 🟢 🟢 🟢 🟢
iOS 🟢 🟢 🟢 🟢 🟢 🟢
Web 🟢 🟢 🟢 🟢 🟡 🟢
MacOS 🟢 🟢 🔴 🟢 🟢 🟢
Linux 🟢 🟢 🔴 🟡 🟡 🟢

🟢 = 可用

🟡 = 即将推出(正在开发中)

🔴 = 目前不可用(未来可能可用)

安装 #

通过 rustup 安装 Rust。 #

添加依赖 #

从命令行添加依赖:

$ flutter pub add waterbus_sdk

上述命令将在你的项目中的 pubspec.yaml 文件中添加以下内容(你也可以手动添加):

dependencies:
    waterbus_sdk: ^1.3.15

使用 #

初始化 #

首先,调用 WaterbusSdk.instance.initial 设置服务器 URL 和 SDK 连接 WebSocket。

await WaterbusSdk.instance.initial(
  apiUrl: 'https://service.waterbus.tech/busapi/v1/',
  wsUrl: 'wss://sfu.waterbus.tech',
);

创建房间 #

final Meeting? meeting = await WaterbusSdk.instance.createRoom(
  meeting: Meeting(title: 'Meeting with Kai Dao'),
  password: 'password',
  userId: 1, // <- 修改为你的用户 ID
);

更新房间 #

final Meeting? meeting = await WaterbusSdk.instance.updateRoom(
  meeting:  Meeting(title: 'Meeting with Kai Dao - 2'),
  password: 'new-password',
  userId: 1, // <- 修改为你的用户 ID
);

加入房间 #

final Meeting? meeting = await WaterbusSdk.instance.joinRoom(
  meeting: _currentMeeting,
  password: 'room-password-here',
  userId: 1, // <- 修改为你的用户 ID
);

设置房间事件回调 #

void _onEventChanged(CallbackPayload event) {
  switch (event.event) {
    case CallbackEvents.shouldBeUpdateState:
      break;
    case CallbackEvents.newParticipant:
      break;
    case CallbackEvents.participantHasLeft:
      break;
    case CallbackEvents.meetingEnded:
      break;
    default:
      break;
  }
}
WaterbusSdk.instance.onEventChangedRegister = _onEventChanged;

离开房间 #

await WaterbusSdk.instance.leaveRoom();

准备媒体(会为你打开和关闭摄像头和麦克风,以便在进入会议之前准备)

await WaterbusSdk.instance.prepareMedia();

配置 #

Android #

确保在你的 Android 清单文件中包含以下权限,位于 <project root>/android/app/src/main/AndroidManifest.xml

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

如果你需要使用蓝牙设备,请添加:

<uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />

Flutter 项目模板已添加这些权限,因此它们可能已经存在。

你也需要将你的构建设置设为 Java 8,因为官方的 WebRTC jar 现在使用了 EglBase 接口中的静态方法。只需在你的应用级 build.gradle 中添加以下内容:

android {
    //...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

iOS #

在你的 Info.plist 文件中添加以下条目,位于 <project root>/ios/Runner/Info.plist

<key>NSCameraUsageDescription</key>
<string>$(PRODUCT_NAME) Camera Usage!</string>
<key>NSMicrophoneUsageDescription</key>
<string>$(PRODUCT_NAME) Microphone Usage!</string>

此条目允许你的应用访问相机和麦克风。

iOS 注意事项 #

m104 版本之后编译的 WebRTC.xframework 不再支持 iOS arm 设备,因此需要在你的项目中的 ios/Podfile 添加 config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES'

ios/Podfile

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)
     target.build_configurations.each do |config|
      # Workaround for https://github.com/flutter/flutter/issues/64502
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' # <= this line
     end
  end
end

贡献 #

欢迎贡献!如果您遇到任何问题或有任何改进建议,请随时提交拉取请求或打开一个 issue。

联系方式 #

如果您对本应用有任何疑问或建议,请通过电子邮件联系我:lambiengcode@gmail.com。

参考 #

flutter_webrtc

许可证 #

Apache License 2.0


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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用waterbus_sdk插件进行通信的示例代码。waterbus_sdk是一个假设的通信插件,用于在Flutter应用中实现跨组件或跨页面的通信。由于实际插件的实现细节和API可能有所不同,以下代码将基于一个通用的插件使用模式进行说明。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加waterbus_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  waterbus_sdk: ^x.y.z  # 请替换为实际的版本号

然后运行flutter pub get来安装依赖。

2. 初始化插件

在你的Flutter应用的入口文件(通常是main.dart)中初始化插件:

import 'package:flutter/material.dart';
import 'package:waterbus_sdk/waterbus_sdk.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  // 假设Waterbus需要初始化
  Waterbus.instance.init();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Waterbus Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

3. 发送消息

在一个组件中发送消息,例如在一个按钮点击事件中:

import 'package:flutter/material.dart';
import 'package:waterbus_sdk/waterbus_sdk.dart';

class SenderPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sender Page'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: () {
            // 发送消息
            Waterbus.instance.send("channel_name", {"key": "value"});
          },
          child: Text('Send Message'),
        ),
      ),
    );
  }
}

4. 接收消息

在另一个组件或页面中接收消息,你可以使用Waterbus.instance.addListener来监听特定的频道:

import 'package:flutter/material.dart';
import 'package:waterbus_sdk/waterbus_sdk.dart';

class ReceiverPage extends StatefulWidget {
  @override
  _ReceiverPageState createState() => _ReceiverPageState();
}

class _ReceiverPageState extends State<ReceiverPage> {
  String message = "";

  @override
  void initState() {
    super.initState();
    // 监听消息
    Waterbus.instance.addListener("channel_name", (data) {
      setState(() {
        message = data["key"].toString();
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Receiver Page'),
      ),
      body: Center(
        child: Text('Received Message: $message'),
      ),
    );
  }
}

5. 导航页面

最后,你可能需要导航到发送和接收页面。你可以在MyHomePage中添加导航逻辑:

import 'package:flutter/material.dart';
import 'sender_page.dart';  // 导入SenderPage
import 'receiver_page.dart';  // 导入ReceiverPage

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Waterbus Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SenderPage()),
                );
              },
              child: Text('Go to Sender Page'),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => ReceiverPage()),
                );
              },
              child: Text('Go to Receiver Page'),
            ),
          ],
        ),
      ),
    );
  }
}

这个示例展示了如何在Flutter应用中使用一个假设的waterbus_sdk插件进行基本的消息发送和接收。请注意,实际的插件API可能会有所不同,因此请查阅waterbus_sdk的官方文档以获取准确的API用法和配置选项。

回到顶部