FlutterFire背景隔离通信



我正在开发一个VoIP应用程序,后台处理程序有问题。我想要的是:发送推送类型为"call"然后应用程序将显示呼叫界面,稍后如果收到推送类型"挂起";,应用程序将关闭调用UI。

在后台处理程序中,我使用一个单例全局类来通知挂起事件与StreamController和CallScreen小部件将听取该流关闭自己。

然后我发现flutterfire将启动另一个隔离的后台处理程序(关闭屏幕),所以它将创建另一个单例类→我不能用这个新的单例类关闭我的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);
}
<标题>

更新我试过硝基顿的溶液。但正如我提到的,_firebaseMessagingBackgroundHandler将创建我的SingleGlobal的另一个实例类。我不知道为什么。

"SingletonGlobal # internal"收到firebase后台处理程序后再次打印。这意味着它重新创建了singletongglobal。

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;
}
}

存在隔离之间通信的方法。在这种情况下,由于您只需要侦听主隔离上的事件,因此您可以注册一个端口来接收来自后台隔离的挂起事件:

class SingletonGlobal {
// Whatever private constructor you're using for this singleton
SingletonGlobal._() {
IsolateNameServer.registerPortWithName(_receivePort.sendPort, 'some port name');
_receivePort.listen(hangUpStreamController.add);
}
final hangUpStreamController = StreamController<HangUpEvent>.broadcast();
final _receivePort = ReceivePort();
void addHangupEvent(HangUpEvent event) {
hangUpStreamController.add(event);
}
}
void _firebaseMessagingBackgroundHandler(RemoteMessage message) {
// Do not try to access SingletonGlobal here.
if (message.data.type = 'hangup') {
// Since the background isolate is still in the same process, you
// can send objects (which are copied) instead of just basic messages.
IsolateNameServer.lookupPortByName('some port name')?.send(hangUpEvent);
}
}

你必须使用onMessageOpenedApp事件。避免使用任何其他通知插件,因为它会忽略此事件。顺便说一下,这个事件只在应用程序关闭时起作用,它被FCM插件的通知打开。它会给你RemoteMessage对象,你可以从中检索消息数据。

相关内容

  • 没有找到相关文章

最新更新