zego_uikit_prebuilt_live_audio_room 1.0.3
zego_uikit_prebuilt_live_audio_room: ^1.0.3 copied to clipboard
PrebuiltLiveAudioRoom is a Live Audio Room kit that provides a ready-made group voice chat that supports up to 8 hosts and co-hosts to connect with millions of users downstage.
example/lib/main.dart
// Dart imports:
import 'dart:math';
// Flutter imports:
import 'package:flutter/material.dart';
import 'package:dotted_border/dotted_border.dart';
// Package imports:
import 'package:zego_uikit_prebuilt_live_audio_room/zego_uikit_prebuilt_live_audio_room.dart';
/// Note that the userID needs to be globally unique,
final String localUserID = Random().nextInt(10000).toString();
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(title: 'Flutter Demo', home: HomePage());
}
}
enum LayoutMode {
defaultLayout,
full,
hostTopCenter,
hostCenter,
}
extension LayoutModeExtension on LayoutMode {
String get text {
var mapValues = {
LayoutMode.defaultLayout: "default",
LayoutMode.full: "full",
LayoutMode.hostTopCenter: "host top center",
LayoutMode.hostCenter: "host center",
};
return mapValues[this]!;
}
}
class HomePage extends StatelessWidget {
HomePage({Key? key}) : super(key: key);
/// Users who use the same liveID can join the same live audio room.
final liveTextCtrl =
TextEditingController(text: Random().nextInt(10000).toString());
final layoutValueNotifier =
ValueNotifier<LayoutMode>(LayoutMode.defaultLayout);
@override
Widget build(BuildContext context) {
var buttonStyle = ElevatedButton.styleFrom(
fixedSize: const Size(120, 60),
primary: const Color(0xff2C2F3E).withOpacity(0.6),
);
return Scaffold(
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('User ID:$localUserID'),
const Text('Please test with two or more devices'),
Align(
alignment: Alignment.centerRight,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
const Text("Layout : "),
switchDropList<LayoutMode>(
layoutValueNotifier,
[
LayoutMode.defaultLayout,
LayoutMode.full,
LayoutMode.hostTopCenter,
LayoutMode.hostCenter,
],
(LayoutMode layoutMode) {
return Text(layoutMode.text);
},
),
],
),
),
TextFormField(
controller: liveTextCtrl,
decoration: const InputDecoration(labelText: "join a live by id"),
),
const SizedBox(height: 20),
// click me to navigate to LivePage
ElevatedButton(
style: buttonStyle,
child: const Text('Start a live'),
onPressed: () => jumpToLivePage(
context,
liveID: liveTextCtrl.text,
isHost: true,
),
),
const SizedBox(height: 20),
// click me to navigate to LivePage
ElevatedButton(
style: buttonStyle,
child: const Text('Watch a live'),
onPressed: () => jumpToLivePage(
context,
liveID: liveTextCtrl.text,
isHost: false,
),
),
],
),
),
);
}
jumpToLivePage(BuildContext context,
{required String liveID, required bool isHost}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LivePage(
liveID: liveID,
isHost: isHost,
layoutMode: layoutValueNotifier.value,
),
),
);
}
Widget switchDropList<T>(
ValueNotifier<T> notifier,
List<T> itemValues,
Widget Function(T value) widgetBuilder,
) {
return ValueListenableBuilder<T>(
valueListenable: notifier,
builder: (context, value, _) {
return DropdownButton<T>(
value: value,
icon: const Icon(Icons.keyboard_arrow_down),
items: itemValues.map((T itemValue) {
return DropdownMenuItem(
value: itemValue,
child: widgetBuilder(itemValue),
);
}).toList(),
onChanged: (T? newValue) {
if (newValue != null) {
notifier.value = newValue;
}
},
);
});
}
}
// integrate code :
class LivePage extends StatelessWidget {
final String liveID;
final bool isHost;
final LayoutMode layoutMode;
const LivePage({
Key? key,
required this.liveID,
this.layoutMode = LayoutMode.defaultLayout,
this.isHost = false,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return SafeArea(
child: ZegoUIKitPrebuiltLiveAudioRoom(
appID: /*input your AppID*/,
appSign: /*input your AppSign*/,
userID: localUserID,
userName: 'user_$localUserID',
liveID: liveID,
config: (isHost
? ZegoUIKitPrebuiltLiveAudioRoomConfig.host()
: ZegoUIKitPrebuiltLiveAudioRoomConfig.audience())
..seatIndex = isHost ? getHostSeatIndex() : -1
..lockSeatIndexesForHost = getLockSeatIndex()
..layoutConfig = getLayoutConfig()
..seatConfig = getSeatConfig(),
),
);
}
ZegoLiveAudioRoomSeatConfig getSeatConfig() {
if (layoutMode == LayoutMode.hostTopCenter) {
return ZegoLiveAudioRoomSeatConfig(
backgroundBuilder: (BuildContext context, Size size,
ZegoUIKitUser? user, Map extraInfo) {
return Container(color: Colors.grey);
},
foregroundBuilder: foregroundBuilder,
);
}
return ZegoLiveAudioRoomSeatConfig(foregroundBuilder: foregroundBuilder);
}
Widget foregroundBuilder(
BuildContext context, Size size, ZegoUIKitUser? user, Map extraInfo) {
return DottedBorder(
color: Colors.black,
strokeWidth: 1,
child: Container(),
);
}
int getHostSeatIndex() {
if (layoutMode == LayoutMode.hostCenter) {
return 4;
}
return 0;
}
List<int> getLockSeatIndex() {
if (layoutMode == LayoutMode.hostCenter) {
return [4];
}
return [0];
}
ZegoLiveAudioRoomLayoutConfig getLayoutConfig() {
var config = ZegoLiveAudioRoomLayoutConfig();
switch (layoutMode) {
case LayoutMode.defaultLayout:
break;
case LayoutMode.full:
config.rowSpacing = 5;
config.rowConfigs = [
ZegoLiveAudioRoomLayoutRowConfig(
count: 4,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 4,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 4,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 4,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
];
break;
case LayoutMode.hostTopCenter:
config.rowConfigs = [
ZegoLiveAudioRoomLayoutRowConfig(
count: 1,
alignment: ZegoLiveAudioRoomLayoutAlignment.center,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 3,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 3,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 2,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceEvenly,
),
];
break;
case LayoutMode.hostCenter:
config.rowSpacing = 5;
config.rowConfigs = [
ZegoLiveAudioRoomLayoutRowConfig(
count: 3,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 3,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
ZegoLiveAudioRoomLayoutRowConfig(
count: 3,
alignment: ZegoLiveAudioRoomLayoutAlignment.spaceBetween,
),
];
break;
}
return config;
}
}