import 'package:flutter/material.dart';
import 'package:zego_uikit_prebuilt_call/zego_uikit_prebuilt_call.dart';
class VideoCallScreen extends StatefulWidget {
const VideoCallScreen({
super.key,
});
@override
State<VideoCallScreen> createState() => _VideoCallScreenState();
}
class _VideoCallScreenState extends State<VideoCallScreen> {
String? userId = DateTime.now().microsecondsSinceEpoch.toString();
String? userName = DateTime.now().toString();
@override
Widget build(BuildContext context) {
return ZegoUIKitPrebuiltCall(
appID: '',
appSign:
'',
userID: userId!,
userName: userName!,
callID: 'demo_call_id_for_testing',
config: ZegoUIKitPrebuiltCallConfig.oneOnOneVideoCall(),
);
}
}
Chat_screen:
Widget appBar() {
return InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ViewProfileScreen(user: widget.user),
),
);
},
child: Expanded(
child: StreamBuilder(
stream: APIs.getUserInfo(widget.user),
builder: (context, snapshot) {
final data = snapshot.data?.docs;
final list =
data?.map((e) => ChatUser.fromJson(e.data())).toList() ?? [];
return Row(
children: [
IconButton(
onPressed: () => Navigator.pop(context),
icon: const Icon(Icons.arrow_back, color: Colors.black54)),
ClipRRect(
borderRadius: BorderRadius.circular(mq.height * .03),
child: CachedNetworkImage(
width: mq.height * .05,
height: mq.height * .05,
imageUrl:
list.isNotEmpty ? list[0].image : widget.user.image,
errorWidget: (context, url, error) =>
const CircleAvatar(child: Icon(CupertinoIcons.person)),
),
),
const SizedBox(width: 10),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
list.isNotEmpty ? list[0].name : widget.user.name,
style: const TextStyle(
fontSize: 16,
color: Colors.black87,
fontWeight: FontWeight.w500,
),
overflow: TextOverflow.ellipsis,
),
const SizedBox(height: 2),
Text(
list.isNotEmpty
? list[0].isOnline
? 'Online'
: MyDateUtil.getLastActiveTime(
context: context,
lastActive: list[0].lastActive)
: MyDateUtil.getLastActiveTime(
context: context,
lastActive: widget.user.lastActive),
style: const TextStyle(
fontSize: 13, color: Colors.black54),
),
],
),
),
IconButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const AudioCallScreen(),
),
);
},
icon: const Icon(
Icons.phone,
color: Colors.black,
),
),
IconButton(
onPressed: () async {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => const VideoCallScreen(),
),
);
},
icon: const Icon(Icons.videocam, color: Colors.black),
),
],
);
},
),
),
);
}
``
当我按下音频和视频通话图标时,它正在与我想要联系的用户连接,但就目前而言,当用户触摸视频和音频图标按钮时,它正在连接。我需要它应该在我触摸视频或音频呼叫图标按钮时表现良好,它应该向我试图联系视频呼叫的用户发出信号,并且信号应该是两个按钮“应答”和“拒绝”。与 WhatsApp UI 逻辑相同。
您应该在应用程序启动时或用户登录后运行 ZegoCloud init 函数。因此您可能会得到类似的结果:
@override
void initState() {
initZego();
super.initState();
}
void initZego() async{
await ZegoUIKitPrebuiltCallInvitationService().init(
appID: appId //input your AppID,
appSign: appSign //input your AppSign,
userID: "currentUserId",
userName: "currentUserName",
notifyWhenAppRunningInBackgroundOrQuit: true,
androidNotificationConfig: ZegoAndroidNotificationConfig(
channelID: "ZegoUIKit",
channelName: "Call Notifications",
sound: "notification",
icon: "notification_icon",
),
iOSNotificationConfig: ZegoIOSNotificationConfig(
isSandboxEnvironment: false,
systemCallingIconName: 'CallKitIcon',
),
plugins: [ZegoUIKitSignalingPlugin()],
controller: callController,
requireConfig: (ZegoCallInvitationData data) {
final config = (data.invitees.length > 1)
? ZegoCallType.videoCall == data.type
? ZegoUIKitPrebuiltCallConfig.groupVideoCall()
: ZegoUIKitPrebuiltCallConfig.groupVoiceCall()
: ZegoCallType.videoCall == data.type
? ZegoUIKitPrebuiltCallConfig.oneOnOneVideoCall()
: ZegoUIKitPrebuiltCallConfig.oneOnOneVoiceCall();
config.avatarBuilder = customAvatarBuilder;
/// support minimizing, show minimizing button
config.topMenuBarConfig.isVisible = true;
config.topMenuBarConfig.buttons
.insert(0, ZegoMenuBarButtonName.minimizingButton);
return config;
},
);
}
这会将用户初始化为您的 ZegoCloud 服务,允许 ZegoCloud 通过用户 ID 向用户设备发送邀请