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
# pubspec.yaml
dependencies:
levelchat: ^0.2.0
flutter_webrtc: ^0.11.0 # peer depThen:
flutter pub getPlatform setup
iOS
Add to ios/Runner/Info.plist:
<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:
platform :ios, '12.0'Android
Add to 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" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />Set minSdkVersion 21 in android/app/build.gradle.
Quickstart
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.