Firestore StreamProvider 不会使用身份验证更改更新状态

Posted

技术标签:

【中文标题】Firestore StreamProvider 不会使用身份验证更改更新状态【英文标题】:Firestore StreamProvider does not update state with Auth changes 【发布时间】:2021-03-01 19:31:27 【问题描述】:

我有一个返回Stream<List<Ticket>> 的函数,其中 Ticket 是一个模型。 _userFriebaseAuthUser

Stream<List<Ticket>> userTickets() 
  if (_user == null || _user.isAnonymous) return Stream<List<Ticket>>.empty();
  return FirebaseFirestore.instance
      .collection("support-tickets/$_user.uid/tickets")
      .orderBy('timestamp', descending: true)
      .snapshots()
      .map(
        (QuerySnapshot snapshot) => snapshot.docs.map(
          // populate model
        ).toList(),
      );

我正在使用此提供程序:

StreamProvider<List<Ticket>>.value(
  value: _dataApi.userTickets(),
  builder: // build MaterialApp
)

我正在使用应用程序内的列表: Provider.of&lt;List&lt;Ticket&gt;&gt;(context);

当我登录时,列表会从 Firestore 填充。当我退出或以匿名用户身份登录时,即使我返回一个空流,列表也不会改变。

跟踪代码我可以看到 _user 确实为 null 或 isAnonymous 并且从函数返回的值是一个空流,但这不会导致登录时之前填充的列表的状态发生变化。

当我使用其他用户登录时,列表中会填充该用户的新值。

【问题讨论】:

我认为您需要将 StreamProvider 包装在 FirebaseAuth.instance.authStateChages 流中,因此每当身份验证状态更改时,StreamBuilder 都会重新绘制。 它已经包含在 authStateChanges 提供者中 【参考方案1】:

如果用户是匿名用户或 null,我通过返回一个空列表的单个数据事件流来修复它: if (_user == null || _user.isAnonymous) return Stream.value([]);

【讨论】:

【参考方案2】:

感谢您引导我解决问题。这感觉就像一个应该处理 Stream.empty() 的 StreamProvider 的错误。

单值流监听器的解决方案,返回

Stream.value(null)

对于列表:

Stream.value([])

代替

Stream.empty()

【讨论】:

以上是关于Firestore StreamProvider 不会使用身份验证更改更新状态的主要内容,如果未能解决你的问题,请参考以下文章

Firestore StreamProvider 不会使用身份验证更改更新状态

使用 StreamProvider 和 StreamBuilder 时出错

即使流正在返回对象,Flutter StreamProvider 也会返回 null 对象

Flutter Provider,当他的参数改变时更新 StreamProvider

如何在 Flutter (Dart) 中通过新路由获取子级 StreamProvider 数据

Flutter:如何将值从 streamprovider / listview builder 传递给另一个类