flutter - 在 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 看到新用户,那将非常有帮助。或任何其他建议。
解决方案
如果您使用的是 Riverpod,那么您可以使用 ChangeNotifierProvider.autoDispose 并在处理时调用取消(或覆盖您的类 dispose 以调用取消)或侦听该提供程序中的用户名并在它触发更新时取消(登录/注销状态)
推荐阅读
- github-actions - Github Action 在分支上使用动作
- r - r, cbind 两列,按指定顺序取值
- java - 为什么这个 Java 代码计数正确但打印出错误的答案?
- javascript - 创建一个包含圆圈的响应表
- runtime-error - struct.error: 'i' 格式需要 -2147483648 <= number <= 2147483647,同时使用 PyInstaller 创建独立的可执行文件
- javascript - Discord Bot 清除命令错误
- postfix-mta - 后缀:454 4.7.1 中继访问被拒绝
- mysql - MYSQL - 根据列值获取第一条记录
- laravel - Laravel - Laratrust 如何列出团队中所有附加角色的用户?
- msbuild - UE4 ShaderCompileWorker Win64 Development 构建引擎源码时出错