LevelChatDocs
Docs
Flutter SDK

Flutter SDK

flutter_webrtc wrapper.

Production-grade Flutter SDK for LevelChat. Mirrors the @levelchat/web public API one-to-one — same class names, event names, error codes — adapted to idiomatic Dart with Stream, Future, and sealed event hierarchies.

2,698 LOC of Dart, 21 flutter test cases passing, MIT-licensed. Real WebRTC via flutter_webrtc.

Install

YAML
# pubspec.yaml
dependencies:
  levelchat: ^0.2.0
  flutter_webrtc: ^0.11.0 # peer dep

Then:

~
flutter pub get

Platform setup

iOS

Add to ios/Runner/Info.plist:

xml
<key>NSCameraUsageDescription</key>
<string>Used for video calls</string>
<key>NSMicrophoneUsageDescription</key>
<string>Used for voice + video calls</string>

Set the deployment target to iOS 12+ in your Podfile:

ruby
platform :ios, '12.0'

Android

Add to android/app/src/main/AndroidManifest.xml:

xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

Set minSdkVersion 21 in android/app/build.gradle.

Quickstart

Dart
import 'package:levelchat/levelchat.dart';

void main() async {
  // In production the token comes from YOUR BACKEND.
  final token = await fetchTokenFromYourBackend();

  final client = LevelChat(LevelChatConfig(region: 'eu-fsn'));
  final room = await client.joinRoom(JoinRoomOptions(token: token));

  // Events are a broadcast Stream — listen anywhere.
  room.events.listen((event) {
    if (event is ParticipantJoined) print('joined: ${event.participant.identity}');
    if (event is TrackPublished)    print('track: ${event.track.id}');
    if (event is RoomError)         print('error: ${event.error.code}');
  });

  await room.publishCamera();
}

Public API

  • class LevelChat — factory + token mint helper.
  • class Room — state machine, connect / leave / publishCamera / publishMic / publishScreen.
  • Stream<RoomEvent> — sealed event hierarchy (ParticipantJoined, TrackPublished, QualityChanged, …).

Audio session

Auto-configured via flutter_webrtc's Helper.setSpeakerphoneOn wrapper. Override via AudioSession.applyMode(...).

Screen sharing

Backed by getDisplayMedia(); on iOS this requires a Broadcast Extension target, on Android it triggers the system MediaProjection prompt. The example app under packages/sdk-flutter/example/ shows both.

License

The SDK itself is MIT-licensed — embed in any app, commercial or personal, no royalties. The LevelChat server is BUSL-licensed and requires a paid commercial license for production use beyond the trial threshold. See Licensing.