Dart Stream.periodi c утечка памяти - PullRequest
0 голосов
/ 03 мая 2020

У меня есть следующий код

import 'dart:async';
import 'dart:html';

import 'package:angular/angular.dart';

@Component(
  selector: 'my-screen',
  directives: [coreDirectives, ],
  templateUrl: 'my_component.html',
)
class MyComponent implements OnInit, OnDestroy {

  Stream periodicStream;
  StreamSubscription periodicSubs;
  MyBloc myBloc;

  myComponent(this.myBloc) : super() {
    myBloc.listen((newState){
      if (newState is SomeBlocState) {
        periodicStream = new Stream.periodic(new Duration(seconds: 1));
        periodicSubs = periodicStream.listen(this.onTick);
      }
    });
  }

  void onTick(dynamic) {
    print('onTick');
  }

  @override
  void ngOnInit() {
  }

  @override
  void ngOnDestroy() {
    print('ngOnDestroy');
    if (periodicSubs != null) {
      print('periodicSubs.cancel()');
      periodicSubs.cancel();
      periodicSubs = null;
      periodicStream = null;
    }
  }
}

Основная проблема:

1) когда компонент создается в первый раз, все выглядит нормально, у меня есть консольные сообщения 'onTick' и после уничтожения компонента (вызванного ngOnDestroy) эти сообщения исчезают

2), но когда компонент создается во второй раз (и т. д.) и периодический поток c снова инициализируется, я получаю двойной 'onTick' Сообщения в журнале консоли, которые выглядят так, как будто предыдущий поток стал живым

Что может вызвать такое поведение?

1 Ответ

0 голосов
/ 04 мая 2020

Ошибка была в BLo C прослушивание обратного вызова. Когда компонент пытается прослушать BLo C секунд, обратный вызов вызывается немедленно, чтобы сообщить о текущем состоянии.

...