首页 > 解决方案 > Flutter 提供者如何关闭每个实例

问题描述

我将 Provider 包与 Flutter ( https://pub.dev/packages/provider ) + Firebase Auth + Firestore 一起使用,但我遇到了无法解决的 Streams 问题。这是一些代码:

在我的 main.dart

@override
Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        InheritedProvider<FeedController>(create: (_) => FeedController()),
        ... others 
      ],
      child: MaterialApp(...)
    ...
}

我的 FeedController 托管多个流,例如这两个示例:

final _feedData = StreamController<QuerySnapshot>();
Stream<QuerySnapshot> get feedData => _feedData.stream;

or

Stream<QuerySnapshot> loadTags() async* {
    yield* _database.retrieveUserTags(await _auth.retrieveUserUid());
}

我的问题是当我退出 Firebase 时,因为我没有通过身份验证,所以我有“PERMISSION_DENIED:缺少或不足的权限”。我知道为什么:我的流没有关闭,并且当我注销时,我无权从 Firebase 读取数据(我已阻止未经授权的读取)。我只想在注销之前关闭 Provider 传递的每个实例,然后调用我的注销函数。关于我该怎么做的任何想法?它只是在日志中,但我想解决这个问题。

我试图做这样的事情:

在我的 FeedController

 // Closing all Streams
  void dispose() {
    _isLoadingController.close();
    _feedData.close();
    _newData.close();
  }

并在注销前调用:

Provider.of<FeedController>(context, listen: false).dispose();

但是我有错误说即使我没有尝试将数据添加到关闭的流中,我也无法在流关闭后添加数据..

谢谢

标签: flutterprovider

解决方案


推荐阅读