···88- [x] [1. Post Thread Screen](#1-post-thread-screen)
99- [x] [2. Post Tap Navigation](#2-post-tap-navigation)
1010- [x] [3. Avatar Tap Navigation](#3-avatar-tap-navigation)
1111-- [ ] [4. Quoted Post Tap Navigation](#4-quoted-post-tap-navigation)
1212-- [ ] [5. Notification Tap Navigation](#5-notification-tap-navigation)
1313-- [ ] [6. Viewer State on Own Posts](#6-viewer-state-on-own-posts)
1111+- [x] [4. Quoted Post Tap Navigation](#4-quoted-post-tap-navigation)
1212+- [x] [5. Notification Tap Navigation](#5-notification-tap-navigation)
1313+- [x] [6. Viewer State on Own Posts](#6-viewer-state-on-own-posts)
1414- [ ] [7. Saved Posts Screen — Render Actual Posts](#7-saved-posts-screen--render-actual-posts)
1515- [ ] [8. Saved Posts — Accessible from Profile](#8-saved-posts--accessible-from-profile)
1616- [ ] [9. Saved Posts — Long Press for Local, Tap for Menu](#9-saved-posts--long-press-for-local-tap-for-menu)
+43
lib/features/feed/cubit/post_action_cache.dart
···11+import 'package:lazurite/features/feed/cubit/post_action_cubit.dart';
22+33+/// In-memory cache that preserves optimistic like/repost state across
44+/// [PostActionCubit] recreations (e.g. after scroll recycling).
55+///
66+/// Keyed by post URI. Transient fields (loading, error) are never cached.
77+class PostActionCache {
88+ final Map<String, CachedPostAction> _cache = {};
99+1010+ CachedPostAction? read(String postUri) => _cache[postUri];
1111+1212+ /// Persists the settled state of [state] into the cache.
1313+ /// No-ops while either loading flag is set.
1414+ void write(PostActionState state) {
1515+ if (state.isLoadingLike || state.isLoadingRepost) return;
1616+ _cache[state.postUri] = CachedPostAction(
1717+ isLiked: state.isLiked,
1818+ isReposted: state.isReposted,
1919+ likeCount: state.likeCount,
2020+ repostCount: state.repostCount,
2121+ likeUri: state.likeUri,
2222+ repostUri: state.repostUri,
2323+ );
2424+ }
2525+}
2626+2727+class CachedPostAction {
2828+ const CachedPostAction({
2929+ required this.isLiked,
3030+ required this.isReposted,
3131+ required this.likeCount,
3232+ required this.repostCount,
3333+ this.likeUri,
3434+ this.repostUri,
3535+ });
3636+3737+ final bool isLiked;
3838+ final bool isReposted;
3939+ final int likeCount;
4040+ final int repostCount;
4141+ final String? likeUri;
4242+ final String? repostUri;
4343+}