【发布时间】:2021-12-20 07:17:55
【问题描述】:
当我尝试取消 Firestore 侦听器时
ProductsService().cancel()。我得到了错误:
[ERROR: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 canceled,则查询会在新用户登录时起作用。
因此,如果有人可以帮助我正确初始化它,或者让 Firebase 看到新用户,那将非常有帮助。 或任何其他建议。
【问题讨论】:
标签: flutter google-cloud-firestore riverpod