import 'package:im_app/app/di/user_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:im_app/domain/entities/user.dart'; import 'package:im_app/domain/repositories/user_repository.dart'; part 'user_notifier.g.dart'; /// 单个用户状态管理 (family — 每个 uid 独立 notifier) /// /// ## 用法 /// ```dart /// // 监听 — 自动重建 /// final userAsync = ref.watch(userNotifierProvider(123)); /// /// // 即时读取,无需 await /// final user = ref.read(userNotifierProvider(123).notifier).current; /// /// // 插入或替换 /// ref.read(userNotifierProvider(123).notifier).insertOrReplaceUser(user); /// /// // 单个更新 /// ref.read(userNotifierProvider(123).notifier).updateUser( /// user.copyWith(nickname: 'New Name'), /// ); /// /// // 批量更新 /// ref.read(userNotifierProvider(123).notifier).updateUsers(updatedList); /// ``` @riverpod class UserNotifier extends _$UserNotifier { User? _cached; UserRepository get _repo => ref.watch(userRepositoryProvider); @override Future build(int uid) async { ref.onDispose(() => _cached = null); _repo.watchUser(uid).listen((user) { _cached = user; state = AsyncData(user); }); return _repo.getUser(uid); } // ── 即时访问,无需 await ────────────────────────────────────────────────── User? get current => _cached; // ── 写入 ───────────────────────────────────────────────────────────────── /// 插入或替换单个用户 Future insertOrReplaceUser(User user) async { await _repo.insertOrReplaceUser(user); } /// 更新单个用户所有字段,按 uid 匹配 /// /// 示例: /// ```dart /// await notifier.updateUser(user.copyWith(nickname: 'New Name')); /// ``` Future updateUser(User user) async { await _repo.updateUser(user); } /// 批量更新用户,每条按 uid 匹配更新所有字段 /// /// 示例: /// ```dart /// await notifier.updateUsers( /// users.map((u) => u.copyWith(nickname: 'new')).toList(), /// ); /// ``` Future updateUsers(List users) async { await _repo.updateUsersBatch(users); } // ── 删除 ───────────────────────────────────────────────────────────────── Future deleteUser() async { await _repo.deleteUser(uid); _cached = null; state = const AsyncData(null); } }