import 'dart:async'; import 'package:SEFER/constant/box_name.dart'; import 'package:SEFER/main.dart'; import 'package:SEFER/views/widgets/my_scafold.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:agora_rtc_engine/agora_rtc_engine.dart'; import '../../../../constant/api_key.dart'; String appId = AK.agoraAppId; class PassengerCallPage extends StatefulWidget { const PassengerCallPage({ super.key, required this.channelName, required this.token, required this.remoteID, }); final String channelName, token, remoteID; @override State createState() => _PassengerCallPageState(); } class _PassengerCallPageState extends State { int uid = 0; int? _remoteUid = 0; // uid of the remote user bool _isJoined = false; // Indicates if the local user has joined the channel late RtcEngine agoraEngine; // Agora engine instance final GlobalKey scaffoldMessengerKey = GlobalKey(); // Global key to access the scaffold showMessage(String message) { scaffoldMessengerKey.currentState?.showSnackBar(SnackBar( content: Text(message), )); } initAgora() async { await setupVoiceSDKEngine(); } @override void initState() { super.initState(); _remoteUid = int.parse(widget.remoteID); uid = int.parse(box.read(BoxName.phone)); print('remoteid is ${widget.remoteID}'); print('token is ${widget.token}'); print('channelName is ${widget.channelName}'); // Set up an instance of Agora engine initAgora(); } Future setupVoiceSDKEngine() async { // retrieve or request microphone permission await [Permission.microphone].request(); //create an instance of the Agora engine agoraEngine = createAgoraRtcEngine(); await agoraEngine.initialize(RtcEngineContext(appId: AK.agoraAppId)); print('eeeeeeeeeeeeeeeeeeee'); print(agoraEngine); // Register the event handler agoraEngine.registerEventHandler( RtcEngineEventHandler( onJoinChannelSuccess: (RtcConnection connection, int elapsed) { showMessage( "Local user uid:${connection.localUid} joined the channel"); setState(() { _isJoined = true; }); }, onUserJoined: (RtcConnection connection, int remoteUid, int elapsed) { showMessage("Remote user uid:$remoteUid joined the channel"); setState(() { _remoteUid = remoteUid; }); }, onUserOffline: (RtcConnection connection, int? remoteUid, UserOfflineReasonType reason) { showMessage("Remote user uid:$remoteUid left the channel"); setState(() { _remoteUid = null; }); }, ), ); } void join() async { // Set channel options including the client role and channel profile ChannelMediaOptions options = const ChannelMediaOptions( clientRoleType: ClientRoleType.clientRoleBroadcaster, channelProfile: ChannelProfileType.channelProfileCommunication, ); await agoraEngine.joinChannel( token: widget.token, channelId: widget.channelName, options: options, uid: uid, ); } //https://console.agora.io/invite?sign=5e9e22d06f22caeeada9954c9e908572%253A5ba8aed978a35eab5a5113742502ded2a41478b2a81cb19c71a30776e125b58a void leave() { setState(() { _isJoined = false; _remoteUid = null; }); agoraEngine.leaveChannel(); } // Clean up the resources when you leave @override void dispose() async { await agoraEngine.leaveChannel(); super.dispose(); } // Build UI @override Widget build(BuildContext context) { return MaterialApp( scaffoldMessengerKey: scaffoldMessengerKey, home: MyScafolld( // appBar: AppBar( // title: const Text('Get started with Voice Calling'), // ), title: 'Voice Calling'.tr, isleading: true, body: [ ListView( padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 4), children: [ // Status text Container(height: 40, child: Center(child: _status())), // Button Row Row( children: [ Expanded( child: ElevatedButton( child: Text("Join".tr), onPressed: () => {join()}, ), ), const SizedBox(width: 10), Expanded( child: ElevatedButton( child: Text("Leave".tr), onPressed: () => {leave()}, ), ), ], ), ], ), ]), ); } Widget _status() { String statusText; if (!_isJoined) { statusText = 'Join a channel'; } else if (_remoteUid == null) statusText = 'Waiting for a remote user to join...'; else statusText = 'Connected to remote user, uid:$_remoteUid'; return Text( statusText, ); } }