我使用
flutter_webrtc
包来处理 VOIP 电话。我从他们的 GitHub 上运行示例项目,在我将逻辑与 UI 分离之前,它运行良好。现在我正面临这个问题,
来电一开始预计是
CallStateEnum.INITIATION
模式,这是我遇到的行为,但之后很可能会进入CallStateEnum.CONNECTING
状态,而是直接进入CallStateEnum.PROGRESS
状态。
这是我从
SipUaHelperListener
覆盖的功能。
@override
void callStateChanged(sip.Call newCall, sip.CallState state) {
call = newCall;
if (state.state == sip.CallStateEnum.CALL_INITIATION) {
Navigator.pushNamed(context, '/callscreen');
startTimer();
initRenderers();
update();
} else {
if (state.state == sip.CallStateEnum.HOLD ||
state.state == sip.CallStateEnum.UNHOLD) {
hold.value = state.state == sip.CallStateEnum.HOLD;
holdOriginator = state.originator;
return;
}
if (state.state == sip.CallStateEnum.MUTED) {
if (state.audio!) audioMuted.value = true;
if (state.video!) videoMuted.value = true;
return;
}
if (state.state == sip.CallStateEnum.UNMUTED) {
if (state.audio!) audioMuted.value = false;
if (state.video!) videoMuted.value = false;
return;
}
if (state.state != sip.CallStateEnum.STREAM) {
callState = state.state;
}
switch (state.state) {
case sip.CallStateEnum.STREAM:
handelStreams(state);
break;
case sip.CallStateEnum.ENDED:
case sip.CallStateEnum.FAILED:
backToDialPad();
break;
case sip.CallStateEnum.UNMUTED:
case sip.CallStateEnum.MUTED:
case sip.CallStateEnum.CONNECTING:
case sip.CallStateEnum.PROGRESS:
case sip.CallStateEnum.ACCEPTED:
case sip.CallStateEnum.CONFIRMED:
case sip.CallStateEnum.HOLD:
case sip.CallStateEnum.UNHOLD:
case sip.CallStateEnum.NONE:
case sip.CallStateEnum.CALL_INITIATION:
case sip.CallStateEnum.REFER:
break;
}
update();
}
}
此功能分别在两个屏幕(Dialpad 和 CallScreen)上使用,实现了
SIPHelperListner
。我已经通过这个条件分离了逻辑。
if (state.state == sip.CallStateEnum.CALL_INITIATION) {
// User is currently on Dialpad
// Push the Call Screen
}else {
// User is on CallScreen
// Handle call state changes.
}