Firestore StreamProvider 不会使用身份验证更改更新状态
Posted
技术标签:
【中文标题】Firestore StreamProvider 不会使用身份验证更改更新状态【英文标题】:Firestore StreamProvider does not update state with Auth changes 【发布时间】:2021-03-01 19:31:27 【问题描述】:我有一个返回Stream<List<Ticket>>
的函数,其中 Ticket 是一个模型。 _user
是 FriebaseAuthUser
。
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<List<Ticket>>(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