diff --git a/lib/controllers/notification.dart b/lib/controllers/notification.dart index 5d343cc..681c625 100644 --- a/lib/controllers/notification.dart +++ b/lib/controllers/notification.dart @@ -68,6 +68,8 @@ class NotificationController ); } }); + + ref.onDispose(() => notificationChannel.setMethodCallHandler(null)); } return notifications; diff --git a/lib/controllers/unified_push.dart b/lib/controllers/unified_push.dart index 181a3d6..6650d78 100644 --- a/lib/controllers/unified_push.dart +++ b/lib/controllers/unified_push.dart @@ -1,3 +1,4 @@ +import "dart:async"; import "dart:convert"; import "dart:io"; @@ -78,10 +79,30 @@ class UnifiedPushController extends AsyncNotifier { return; } - final room = ref.read( - RoomsController.provider.select((rooms) => rooms[event.roomId]), + final provider = RoomsController.provider.select( + (rooms) => rooms[event.roomId], ); + if (ref.read(provider)?.metadata != null) return; + + final completer = Completer(); + + final subscription = ref.listen(provider, (previous, next) { + if (next?.metadata != null && !completer.isCompleted) { + completer.complete(); + } + }); + + try { + await completer.future.timeout(const .new(seconds: 10)); + } on TimeoutException { + // metadata didn't show up in time + } finally { + subscription.close(); + } + + final room = ref.read(provider); + final avatar = room?.metadata?.avatar; final icon = avatar == null ? null