【问题标题】:Firestore StreamProvider does not update state with Auth changesFirestore StreamProvider 不会使用身份验证更改更新状态
【发布时间】: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 提供者中

标签: firebase flutter dart firebase-authentication flutter-provider


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    Stream.value(null)
    

    对于列表:

    Stream.value([])
    

    代替

    Stream.empty()
    

    【讨论】:

      猜你喜欢
      • 2019-12-13
      • 2020-07-13
      • 1970-01-01
      • 2018-11-06
      • 2020-04-29
      • 2022-01-04
      • 2020-04-15
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多