【问题标题】:Is there any ways to pass parameters in riverpod's provider有没有办法在riverpod的提供者中传递参数
【发布时间】:2020-12-31 21:14:36
【问题描述】:

如何将 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,
                ),

【问题讨论】:

    标签: flutter provider riverpod


    【解决方案1】:

    您可以使用 Riverpod 的family 功能。

    final user = StreamProvider.family<User, String>((ref, uid) {
      // use uid to get User
      return User;
    });
    

    然后使用提供者:

    useProvider(user(uid));
    

    或者,您可以直接从您的 FirebaseAuthService 提供者的用户提供者read the value

    final user = StreamProvider<User>((ref) {
      final stream = ref.watch(FirebaseAuthService.stream);
      // get uid from stream data
      return User;
    });
    

    【讨论】:

      【解决方案2】:

      使用family 修饰符将外部值传递给提供者。

      final userStreamProvider = StreamProvider.family<User, String>((ref, uid) {
        return User(id: uid);
      }); 
      

      在使用provider时,我们需要将值传递给userStreamProvider

      对于flutter_riverpod 用户,

      Widget build(BuildContext context, ScopedReader watch) {
        final user = watch(userStreamProvider(uid));
      }
      

      对于hooks_riverpod 用户,

      Widget build(BuildContext) {
        final user = useProvider(userStreamProvider(uid));
      }
      

      【讨论】:

      猜你喜欢
      • 2020-02-24
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多