From fa210dd98f64f9ccb278db392ce85c1553886de5 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 8 Aug 2025 14:44:59 +0800 Subject: [PATCH] :lipstick: Post featured optimization --- lib/widgets/post/post_featured.dart | 39 +++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/lib/widgets/post/post_featured.dart b/lib/widgets/post/post_featured.dart index 152715e..fba18e4 100644 --- a/lib/widgets/post/post_featured.dart +++ b/lib/widgets/post/post_featured.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:island/models/post.dart'; import 'package:island/pods/network.dart'; @@ -23,6 +24,16 @@ class PostFeaturedList extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final featuredPostsAsync = ref.watch(featuredPostsProvider); + final pageViewController = usePageController(); + final pageViewCurrent = useState(0); + + useEffect(() { + pageViewController.addListener(() { + pageViewCurrent.value = pageViewController.page?.round() ?? 0; + }); + return null; + }, [pageViewController]); + return ClipRRect( borderRadius: const BorderRadius.all(Radius.circular(8)), child: Card( @@ -35,6 +46,33 @@ class PostFeaturedList extends HookConsumerWidget { children: [ const Icon(Symbols.highlight), Text('Highlight Posts'), + Spacer(), + IconButton( + padding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + constraints: const BoxConstraints(), + onPressed: () { + pageViewController.animateToPage( + pageViewCurrent.value - 1, + duration: const Duration(milliseconds: 250), + curve: Curves.easeInOut, + ); + }, + icon: const Icon(Symbols.arrow_left), + ), + IconButton( + padding: EdgeInsets.zero, + visualDensity: VisualDensity.compact, + constraints: const BoxConstraints(), + onPressed: () { + pageViewController.animateToPage( + pageViewCurrent.value + 1, + duration: const Duration(milliseconds: 250), + curve: Curves.easeInOut, + ); + }, + icon: const Icon(Symbols.arrow_right), + ), ], ).padding(horizontal: 16, vertical: 8), featuredPostsAsync.when( @@ -44,6 +82,7 @@ class PostFeaturedList extends HookConsumerWidget { return SizedBox( height: 320, child: PageView.builder( + controller: pageViewController, scrollDirection: Axis.horizontal, itemCount: posts.length, itemBuilder: (context, index) {