@@ -10,6 +10,7 @@ import 'dart:async';
10
10
import 'dart:js_interop' ;
11
11
import 'package:firebase_auth_platform_interface/firebase_auth_platform_interface.dart' ;
12
12
import 'package:firebase_core_web/firebase_core_web_interop.dart' ;
13
+ import 'package:flutter/foundation.dart' ;
13
14
import 'package:http_parser/http_parser.dart' ;
14
15
15
16
import 'auth_interop.dart' as auth_interop;
@@ -392,9 +393,35 @@ class Auth extends JsObjectWrapper<auth_interop.AuthJsImpl> {
392
393
// ignore: close_sinks
393
394
StreamController <User ?>? _changeController;
394
395
395
- String get _authStateWindowsKey => 'flutterfire-${app .name }_authStateChanges' ;
396
- String get _idTokenStateWindowsKey =>
397
- 'flutterfire-${app .name }_idTokenChanges' ;
396
+ // purely for debug mode and tracking listeners to clean up on "hot restart"
397
+ final Map <String , int > _authStateListeners = {};
398
+ String _authStateWindowsKey () {
399
+ if (kDebugMode) {
400
+ final key = 'flutterfire-${app .name }_authStateChanges' ;
401
+ if (_authStateListeners.containsKey (key)) {
402
+ _authStateListeners[key] = _authStateListeners[key]! + 1 ;
403
+ } else {
404
+ _authStateListeners[key] = 0 ;
405
+ }
406
+ return '$key -${_authStateListeners [key ]}' ;
407
+ }
408
+ return 'no-op' ;
409
+ }
410
+
411
+ // purely for debug mode and tracking listeners to clean up on "hot restart"
412
+ final Map <String , int > _idTokenStateListeners = {};
413
+ String _idTokenStateWindowsKey () {
414
+ if (kDebugMode) {
415
+ final key = 'flutterfire-${app .name }_idTokenChanges' ;
416
+ if (_idTokenStateListeners.containsKey (key)) {
417
+ _idTokenStateListeners[key] = _idTokenStateListeners[key]! + 1 ;
418
+ } else {
419
+ _idTokenStateListeners[key] = 0 ;
420
+ }
421
+ return '$key -${_idTokenStateListeners [key ]}' ;
422
+ }
423
+ return 'no-op' ;
424
+ }
398
425
399
426
/// Sends events when the users sign-in state changes.
400
427
///
@@ -403,7 +430,8 @@ class Auth extends JsObjectWrapper<auth_interop.AuthJsImpl> {
403
430
///
404
431
/// If the value is `null` , there is no signed-in user.
405
432
Stream <User ?> get onAuthStateChanged {
406
- unsubscribeWindowsListener (_authStateWindowsKey);
433
+ final authStateKey = _authStateWindowsKey ();
434
+ unsubscribeWindowsListener (authStateKey);
407
435
408
436
if (_changeController == null ) {
409
437
final nextWrapper = (auth_interop.UserJsImpl ? user) {
@@ -417,14 +445,17 @@ class Auth extends JsObjectWrapper<auth_interop.AuthJsImpl> {
417
445
final unsubscribe =
418
446
jsObject.onAuthStateChanged (nextWrapper.toJS, errorWrapper.toJS);
419
447
_onAuthUnsubscribe = unsubscribe;
420
- setWindowsListener (_authStateWindowsKey, unsubscribe);
448
+ setWindowsListener (
449
+ authStateKey,
450
+ unsubscribe,
451
+ );
421
452
}
422
453
423
454
void stopListen () {
424
455
_onAuthUnsubscribe! .callAsFunction ();
425
456
_onAuthUnsubscribe = null ;
426
457
_changeController = null ;
427
- removeWindowsListener (_authStateWindowsKey );
458
+ removeWindowsListener (authStateKey );
428
459
}
429
460
430
461
_changeController = StreamController <User ?>.broadcast (
@@ -450,7 +481,8 @@ class Auth extends JsObjectWrapper<auth_interop.AuthJsImpl> {
450
481
///
451
482
/// If the value is `null` , there is no signed-in user.
452
483
Stream <User ?> get onIdTokenChanged {
453
- unsubscribeWindowsListener (_idTokenStateWindowsKey);
484
+ final idTokenKey = _idTokenStateWindowsKey ();
485
+ unsubscribeWindowsListener (idTokenKey);
454
486
if (_idTokenChangedController == null ) {
455
487
final nextWrapper = (auth_interop.UserJsImpl ? user) {
456
488
_idTokenChangedController! .add (User .getInstance (user));
@@ -463,14 +495,17 @@ class Auth extends JsObjectWrapper<auth_interop.AuthJsImpl> {
463
495
final unsubscribe =
464
496
jsObject.onIdTokenChanged (nextWrapper.toJS, errorWrapper.toJS);
465
497
_onIdTokenChangedUnsubscribe = unsubscribe;
466
- setWindowsListener (_idTokenStateWindowsKey, unsubscribe);
498
+ setWindowsListener (
499
+ idTokenKey,
500
+ unsubscribe,
501
+ );
467
502
}
468
503
469
504
void stopListen () {
470
505
_onIdTokenChangedUnsubscribe! .callAsFunction ();
471
506
_onIdTokenChangedUnsubscribe = null ;
472
507
_idTokenChangedController = null ;
473
- removeWindowsListener (_idTokenStateWindowsKey );
508
+ removeWindowsListener (idTokenKey );
474
509
}
475
510
476
511
_idTokenChangedController = StreamController <User ?>.broadcast (
0 commit comments