dispose method

Future<void> dispose()

Implementation

Future<void> dispose() async {
  _isDisposed = true;

  try {
    await _initializationFuture;
  } catch (_) {
    // Ignore initialization errors during dispose.
  }

  final futures = <Future>[];

  _walletsUsecaseSubscription?.cancel();

  // Dispose all wallets with their providers
  for (final wallet in _wallets) {
    final provider = _providers[wallet.type];
    if (provider != null) {
      futures.add(provider.removeWallet(wallet));
    }
  }

  // cancel all subscriptions
  for (final subs in _subscriptions.values) {
    for (final sub in subs) {
      futures.add(sub.cancel());
    }
  }

  // close all streams
  futures.addAll([
    _combinedBalancesSubject.close(),
    _combinedPendingTransactionsSubject.close(),
    _combinedRecentTransactionsSubject.close(),
  ]);

  for (final stream in _walletBalanceStreams.values) {
    futures.add(stream.close());
  }
  for (final stream in _walletPendingTransactionStreams.values) {
    futures.add(stream.close());
  }
  for (final stream in _walletRecentTransactionStreams.values) {
    futures.add(stream.close());
  }

  await Future.wait(futures);

  _balancesActivated = false;
  _pendingActivated = false;
  _recentActivated = false;

  _wallets.clear();
  _walletsBalances.clear();
  _walletsPendingTransactions.clear();
  _walletsRecentTransactions.clear();
  _walletBalanceStreams.clear();
  _walletPendingTransactionStreams.clear();
  _walletRecentTransactionStreams.clear();
  _subscriptions.clear();
}