Riverpod Generator未生成预期Stream,出现类型不匹配问题
问题描述
使用Riverpod Generator时出现类型错误,提示:
The argument type 'AsyncValue<User?>' can't be assigned to the parameter type 'Stream<User?>?'
此前在另一项目中完全复刻相同代码时,Generator能生成可用的Stream,但本次生成的代码逻辑与旧版本不同,怀疑是新版Riverpod Generator的Bug。
涉及的userStream.dart代码如下:
part 'userstream.g.dart'; @riverpod class Users extends _$Users { @override Stream<User?> build() { return FirebaseAuth.instance.authStateChanges(); } }
解决方案
这并非Riverpod Generator的Bug,而是Riverpod 2.x版本后类式provider的行为变更:当类式provider的build方法返回Stream时,生成的provider会自动将Stream包装为AsyncValue类型,而非直接暴露原始Stream。
你可以通过两种方式解决:
方式一:获取原始Stream
在使用provider的位置,调用provider的.stream属性即可拿到原始Stream<User?>:// 示例:在Widget中使用 ref.watch(usersProvider).stream方式二:改用函数式provider
如果希望provider直接返回Stream而不被包装,换成函数式写法即可:part 'userstream.g.dart'; @riverpod Stream<User?> users(UsersRef ref) { return FirebaseAuth.instance.authStateChanges(); }这种写法生成的provider会直接暴露
Stream<User?>,无需额外处理。
内容的提问来源于stack exchange,提问作者Milan Labus
相关产品推荐
相关产品推荐

