flutter - 有没有办法在riverpod的提供者中传递参数
问题描述
如何将 FirebaseAuth 用户传递给 Riverpod 中的 StreamProvider?
使用旧的提供程序包时,我曾经从 FirebaseAuth 获取 user.uid 并将变量传递给 StreamProvider,如果我们可以获得 user.uid,则返回 StreamProvider。
@override
Widget build(BuildContext context) {
final FirebaseAuthService authService =
Provider.of<FirebaseAuthService>(context, listen: false);
return StreamBuilder<User>(
stream: authService.onAuthStateChanged,
builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
final User loggedInUser = snapshot.data;
if (loggedInUser != null) {
final String userId = loggedInUser.userId;
return MultiProvider(
providers: <SingleChildWidget>[
StreamProvider<User>(
initialData: User.initialData(),
create: (_) => DB.instance.getLoggedInUserStream(
loggedInUserId: userId,
),
解决方案
您可以使用 Riverpod 的家庭功能。
final user = StreamProvider.family<User, String>((ref, uid) {
// use uid to get User
return User;
});
然后使用提供者:
useProvider(user(uid));
或者,您可以直接从 FirebaseAuthService 提供程序读取用户提供程序的值。
final user = StreamProvider<User>((ref) {
final stream = ref.watch(FirebaseAuthService.stream);
// get uid from stream data
return User;
});
推荐阅读
- mysql - MySQL - 一起使用 MAX 和子查询?
- javascript - 在对象中包含的多个数组中搜索值(Javascript)
- botframework - 如何使用机器人作曲家动态配置 HTTP 请求的正文部分
- javascript - 如何将具有多个对象的 JSON 数据中的值插入 MySQL 的行中?
- javafx - 无法从 FXGL 中的资源加载纹理
- ios - Flutter/iOS:如何在 NotificationServiceExtension Info.plist 文件中使用 pubspec.yaml 的 App 版本?
- r - 动态地(在 for 循环外)用另一个数据帧填充一个数据帧,在 r 中有 n 行
- image - 子模板中缺少 ExpressionEngine 图像/字体(模板组中的模板)
- javascript - React js没有使用反应路由器导航到页面
- firebase - Cloud Functions - 具有最大实例上限 + 节点快速速率限制器的 DDoS 保护?