zego_uikit_prebuilt_live_audio_room 1.0.6
zego_uikit_prebuilt_live_audio_room: ^1.0.6 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';
// 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 roomIDTextCtrl =
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),
backgroundColor: 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: roomIDTextCtrl,
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,
roomID: roomIDTextCtrl.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,
roomID: roomIDTextCtrl.text,
isHost: false,
),
),
],
),
),
);
}
jumpToLivePage(BuildContext context,
{required String roomID, required bool isHost}) {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LivePage(
roomID: roomID,
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 roomID;
final bool isHost;
final LayoutMode layoutMode;
const LivePage({
Key? key,
required this.roomID,
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',
roomID: roomID,
config: (isHost
? ZegoUIKitPrebuiltLiveAudioRoomConfig.host()
: ZegoUIKitPrebuiltLiveAudioRoomConfig.audience())
..takeSeatIndexWhenJoining = isHost ? getHostSeatIndex() : -1
..hostSeatIndexes = getLockSeatIndex()
..layoutConfig = getLayoutConfig()
..seatConfig = getSeatConfig()
..background = background(),
),
);
}
Widget background() {
return Stack(
children: [
Container(
decoration: BoxDecoration(
image: DecorationImage(
fit: BoxFit.fill,
image: Image.asset("assets/images/background.png").image,
),
),
),
const Positioned(
top: 10,
left: 10,
child: Text(
"Live Audio Room",
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: Color(0xff1B1B1B),
fontSize: 15,
fontWeight: FontWeight.w600,
),
)),
Positioned(
top: 10 + 20,
left: 10,
child: Text(
"ID: $roomID",
overflow: TextOverflow.ellipsis,
style: const TextStyle(
color: Color(0xff606060),
fontSize: 12,
fontWeight: FontWeight.w500,
),
),
)
],
);
}
ZegoLiveAudioRoomSeatConfig getSeatConfig() {
if (layoutMode == LayoutMode.hostTopCenter) {
return ZegoLiveAudioRoomSeatConfig(
backgroundBuilder: (BuildContext context, Size size,
ZegoUIKitUser? user, Map extraInfo) {
return Container(color: Colors.grey);
},
);
}
return ZegoLiveAudioRoomSeatConfig(
avatarBuilder: avatarBuilder,
);
}
Widget avatarBuilder(
BuildContext context, Size size, ZegoUIKitUser? user, Map extraInfo) {
return CircleAvatar(
maxRadius: size.width,
backgroundImage: Image.asset(
"assets/avatars/avatar_${((int.tryParse(user?.id ?? "") ?? 0) % 6).toString()}.png")
.image,
);
}
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;
}
}