【问题标题】:Flutter : Should I need cancel Strem Controller?Flutter:我是否需要取消 Strem 控制器?
【发布时间】:2021-04-15 21:07:51
【问题描述】:

我只是使用流控制器将 Firebase 身份验证用户状态流转换为另一个流。

  final FirebaseAuth auth = FirebaseAuth.instance;
  StreamController<Oyuncu?> streamController = StreamController<Oyuncu?>();
  late final StreamSubscription _streamSubscription;

  FirebaseAuthService() {
    _streamSubscription = auth.authStateChanges().listen((User? user) {
      if (user != null) {
        streamController.add(Oyuncu(
            ID: user.uid,
            name: user.displayName ?? "Random User Name",
            profilePicture: user.photoURL));
      } else {
        streamController.add(null);
      }
    });
  }

Listen 是一个 Stream Subscription,我们需要取消它以避免内存泄漏。但是我不能覆盖 dispose 方法。如何正确执行取消?

class FirebaseAuthService extends AuthBase {
  final FirebaseAuth auth = FirebaseAuth.instance;
  StreamController<Oyuncu?> streamController = StreamController<Oyuncu?>();
  late final StreamSubscription _streamSubscription;

  FirebaseAuthService() {
    _streamSubscription = auth.authStateChanges().listen((User? user) {
      if (user != null) {
        streamController.add(Oyuncu(
            ID: user.uid,
            name: user.displayName ?? "Random User Name",
            profilePicture: user.photoURL));
      } else {
        streamController.add(null);
      }
    });
  }


  @override
  anonLogin() async {
    auth.signInAnonymously();
  }

  @override
  Stream<Oyuncu?> userStatus() async* {
    yield* streamController.stream;
  }
}

谢谢

【问题讨论】:

    标签: dart controller stream


    【解决方案1】:

    当您的 FirebaseAuthService 停止或处置时,您必须手动取消它。实际上,鉴于您通常在启动应用程序时启动 Auth 服务并且从不停止它,我不会担心它。当您在经常创建和处理的对象(例如小部件)中处理订阅以避免内存泄漏时尤其重要,然后您可以在小部件的 dispose 方法中轻松取消。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    相关资源
    最近更新 更多