Flutter Riverpod -避免每次传递参数

3qpi33ja  于 2023-10-22  发布在  Flutter
关注(0)|答案(1)|浏览(147)

我有一个CurrentUser类,它接受一个uid。当我的应用检查用户的身份验证状态时,我初始化此提供程序。我希望能够watchread这个供应商,而不必通过uid每次。
另外,我正在寻找一种方法,如果我没有传递uid,构建方法不必获取数据,而只是使用其当前状态。
这一切有可能吗

@Riverpod(keepAlive: true)
class CurrentUser extends _$CurrentUser {
  @override
  Future<User> build({required String uid}) async {
    return await ref.read(firestoreRepoProvider).getUser(uid: uid);
  }

  //...other methods to mutate state
}
jq6vz3qz

jq6vz3qz1#

您可以使用StateProvider<User?>存储当前用户。如果没有用户连接,则值为null
下面是一个如何使用它的例子:

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

void main() {
  runApp(ProviderScope(child: const MyApp()));
}

class MyApp extends ConsumerWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    return MaterialApp(
      home: Scaffold(
        body: SafeArea(
          child: Center(
            child: Column(
              children: <Widget>[
                Text('Hello ${ref.watch(currentUserProvider)?.name}'),
                ElevatedButton(
                  child: const Text('login'),
                  onPressed: () {
                    // Fake retrieve user from server, for instance:
                    // final User user = await ref.read(firestoreRepoProvider).getUser(uid: uid);
                    ref.read(currentUserProvider.notifier).state = User('John', 'uid');
                  },
                ),
                ElevatedButton(
                  child: const Text('logout'),
                  onPressed: () {
                    // Fake logout
                    ref.read(currentUserProvider.notifier).state = null;
                  },
                ),
              ],
            ),
          ),
        ),
      ),
    );
  }
}

final StateProvider<User?> currentUserProvider = StateProvider<User?>((_) => null);

class User {
  User(this.name, this.uid);
  final String name;
  final String uid;
}

我创建了一个currentUserProvider,可以在你的小部件中查看。我添加了两个按钮,假登录和注销,告诉你如何更新当前用户。

相关问题