【发布时间】:2021-10-19 13:33:21
【问题描述】:
我正在开发一个 VoIP 应用程序,但遇到了后台处理程序问题。我想要的是:发送类型为“呼叫”的推送,然后应用程序将显示呼叫用户界面,稍后如果收到推送类型“挂断”,应用程序将关闭该呼叫用户界面。
在后台处理程序中,我使用单例全局类通过 StreamController 通知挂起事件,并且 CallScreen 小部件将侦听该流以自行关闭。
然后我发现 Flutterfire 将为后台处理程序启动另一个隔离(关闭屏幕),因此它将创建另一个 singleton 类 -> 我无法使用这个新的单例关闭我的 CallScreen UI类。
是否可以用flutterfire的背景隔离做这样的事情?
示例伪代码:
class SingletonGlobal {
/// singleton class
final hangUpStreamController = StreamController<HangUpEvent>.broadcast();
void addHangupEvent(HangUpEvent event) {
hangUpStreamController.add(event);
}
}
class CallScreen extends StatefulWidget {
//// ...
@override
void initState() {
SingletonGlobal().hangUpStreamController.stream.listen((event) => closeCallUI(event));
}
}
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async {
await Firebase.initializeApp();
await appInit();
if (message.data.type = 'hangup') {
SingletonGlobal().addHangupEvent(hangUpEvent);
}
更新
我尝试了 Nitrodon 的解决方案。但正如我所提到的,_firebaseMessagingBackgroundHandler 将创建我的 SingleGlobal 类的另一个实例。我不知道为什么。
“SingletonGlobal#internal”在接收到 Firebase 后台处理程序后再次打印。这意味着它重新创建了 SingletonGlobal。
class SingletonGlobal {
/// singleton class
static SingletonGlobal? _instance;
final _receivePort = ReceivePort();
factory SingletonGlobal() => _instance ?? SingletonGlobal._internal();
SingletonGlobal._internal() {
print('SingletonGlobal#internal');
IsolateNameServer.registerPortWithName(_receivePort.sendPort, 'global_singleton');
_receivePort.listen((message) => hangUpStreamController.add);
_instance = this;
}
}
【问题讨论】:
标签: firebase flutter firebase-cloud-messaging dart-isolates