lunionmeet_flutter 0.2.0
lunionmeet_flutter: ^0.2.0 copied to clipboard
SDK Flutter de lunion.meet — appels audio et vidéo temps réel à intégrer dans votre application Flutter (iOS, Android, web ; desktop macOS/Linux). Se connecte au SFU str0m (WebRTC standard, sans media [...]
@lunionlab/meet-flutter (lunionmeet_flutter) #
SDK Flutter de lunion.meet : ajoutez des appels audio et vidéo temps réel à votre application Flutter (iOS, Android, web ; desktop macOS/Linux) en quelques lignes.
Comme sur le web, le principe est en deux temps :
- Votre serveur crée une salle et émet un jeton de connexion avec
@lunionlab/meet-server-sdk(createRoompuiscreateToken). - Votre app Flutter rejoint la salle avec ce jeton via
LunionRoom.
Le jeton est toujours émis côté serveur : votre clé d'API ne quitte jamais votre backend.
Installation #
# pubspec.yaml
dependencies:
lunionmeet_flutter: ^0.2.0
0.2.0 : le SFU est str0m (WebRTC standard) —
RTCPeerConnectionviaflutter_webrtc, plus demediasoup_client_flutter. C'est ce qui débloque la compilation Android (voir Notes).
Permissions #
Android — android/app/src/main/AndroidManifest.xml :
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
iOS — ios/Runner/Info.plist :
<key>NSCameraUsageDescription</key>
<string>Pour les appels vidéo</string>
<key>NSMicrophoneUsageDescription</key>
<string>Pour les appels audio</string>
Desktop (macOS, Linux) — pris en charge via flutter_webrtc (non validé de notre côté). Linux :
rien à déclarer. macOS — macos/Runner/*.entitlements :
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
Windows / Desktop : pris en charge par
flutter_webrtcrécent (^0.12), non validé de notre côté. La contrainte historique (flutter_webrtc 0.9.ximposé parmediasoup_client_flutter, bug de thread Windows) n'existe plus depuis la 0.2.0 (str0m +flutter_webrtcà jour).
Utilisation #
import 'package:flutter/material.dart';
import 'package:lunionmeet_flutter/lunionmeet_flutter.dart';
class CallScreen extends StatefulWidget {
const CallScreen({super.key, required this.url, required this.room, required this.token});
final String url; // access.url (renvoyé par votre serveur)
final String room; // access.room
final String token; // access.token
@override
State<CallScreen> createState() => _CallScreenState();
}
class _CallScreenState extends State<CallScreen> {
late final LunionRoom _room = LunionRoom(
sfuUrl: widget.url,
room: widget.room,
name: 'Awa',
token: widget.token,
);
@override
void initState() {
super.initState();
_room.connect();
}
@override
void dispose() {
_room.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return ListenableBuilder(
listenable: _room,
builder: (context, _) => Scaffold(
body: GridView.count(
crossAxisCount: 2,
children: [
LunionVideoView(stream: _room.localStream, mirror: true),
for (final p in _room.participants)
LunionVideoView(stream: p.stream),
],
),
bottomNavigationBar: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
IconButton(
icon: Icon(_room.micEnabled ? Icons.mic : Icons.mic_off),
onPressed: _room.toggleMic,
),
IconButton(
icon: Icon(_room.cameraEnabled ? Icons.videocam : Icons.videocam_off),
onPressed: _room.toggleCamera,
),
IconButton(
icon: const Icon(Icons.call_end, color: Colors.red),
onPressed: () => _room.leave(),
),
],
),
),
);
}
}
Récupérer un jeton (côté serveur, Node) #
import { RoomServiceClient } from "@lunionlab/meet-server-sdk";
const rooms = new RoomServiceClient("https://meet.lunion-lab.com/api/v1", process.env.LUNION_API_KEY!);
const room = await rooms.createRoom("Réunion produit");
const access = await rooms.createToken(room.slug, "user-42", { name: "Awa" });
// → renvoyez access.url, access.room, access.token à votre app Flutter
API #
| Élément | Rôle |
|---|---|
LunionRoom |
Contrôleur de salle (ChangeNotifier) : connect(), localStream, participants, toggleMic(), toggleCamera(), sendChat(), leave(). |
RemoteParticipant |
id, name, stream (flux audio + vidéo). |
RoomStatus |
idle · connecting · connected · error (via room.status). |
LunionVideoView |
Widget d'affichage d'un MediaStream. |
SfuSignaling |
Client de signalisation bas niveau (usage avancé : modération, enregistrement…). |
Notes #
- Repose sur
flutter_webrtc(^0.12) enRTCPeerConnectionstandard, sansmediasoup_client_flutter(ce qui débloque Android). - Le protocole de signalisation est identique à celui du SDK web
@lunionlab/meet-client-js(SFU str0m). - Compilez et testez dans un projet Flutter réel (caméra/micro requis).