首页 > 解决方案 > 在 ChangeNotifier 中取消 Firebase 侦听器

问题描述

当我尝试使用 取消 Firestore 侦听器时 ProductsService().cancel()。我得到错误:

[错误:flutter/lib/ui/ui_dart_state.cc(209)] 未处理的异常:LateInitializationError:字段“productsSubscription”尚未初始化。

没有迟到也不起作用:

StreamSubscription<QuerySnapshot>? productsSubscription;

我的代码:

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';

class ProductsService extends ChangeNotifier {
  late StreamSubscription<QuerySnapshot> productsSubscription;

  void cancel() => productsSubscription.cancel();

  void getMenuProducts() async {
    CollectionReference productsReference = FirebaseFirestore.instance.collection('products');
    productsSubscription = productsReference.snapshots().listen((snapshot) => print(snapshot.docs.length));
  }
}

我知道在它上面调用 .cancel() 可以在上下文中工作。但我在带有 Riverpod 的 ChangeNotifier 中使用它。

Riverpod 的溪流运行良好。真正的问题是,当用户注销并新用户登录时,.listen 似乎仍然卡在旧的 firebase 用户上!并且不允许查询。Firebase 规则使用 [cloud_firestore/permission-denied] 拒绝它们 - 当我重新启动应用程序时,查询工作。

我注意到的是,如果我可以在注销时取消 .listen,则查询会在新用户登录时起作用。

因此,如果有人可以帮助我正确初始化它,或者让 Firebase 看到新用户,那将非常有帮助。或任何其他建议。

标签: fluttergoogle-cloud-firestoreriverpod

解决方案


如果您使用的是 Riverpod,那么您可以使用 ChangeNotifierProvider.autoDispose 并在处理时调用取消(或覆盖您的类 dispose 以调用取消)或侦听该提供程序中的用户名并在它触发更新时取消(登录/注销状态)


推荐阅读