diff --git a/lib/pages/rank/controller.dart b/lib/pages/rank/controller.dart index 4a1421d0b..907f35638 100644 --- a/lib/pages/rank/controller.dart +++ b/lib/pages/rank/controller.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:PiliPlus/models/common/rank_type.dart'; import 'package:PiliPlus/pages/common/common_controller.dart'; import 'package:PiliPlus/pages/rank/zone/controller.dart'; +import 'package:flutter/foundation.dart' show clampDouble; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -19,6 +20,22 @@ class RankController extends GetxController @override ScrollController get scrollController => controller.scrollController; + final tabScrollController = ScrollController(); + + void scrollToCurrentIndex(double tabHeight, int index) { + final position = tabScrollController.position; + final offset = clampDouble( + (tabHeight * (2 * index + 1) - position.viewportDimension) / 2.0 + 80.0, + position.minScrollExtent, + position.maxScrollExtent, + ); + tabScrollController.animateTo( + offset, + duration: kTabScrollDuration, + curve: Curves.ease, + ); + } + @override void onInit() { super.onInit(); @@ -28,6 +45,7 @@ class RankController extends GetxController @override void onClose() { tabController.dispose(); + tabScrollController.dispose(); super.onClose(); } diff --git a/lib/pages/rank/view.dart b/lib/pages/rank/view.dart index ad83a63a1..ad178d1ef 100644 --- a/lib/pages/rank/view.dart +++ b/lib/pages/rank/view.dart @@ -43,18 +43,22 @@ class _RankPageState extends State ); } + static const double _tabHeight = 35.0; + Widget _buildTab(ThemeData theme) { return SizedBox( width: 64, child: Obx(() { final tabIndex = _rankController.tabIndex.value; return ListView.builder( + controller: _rankController.tabScrollController, padding: .only(bottom: MediaQuery.paddingOf(context).bottom + 105), itemCount: RankType.values.length, itemBuilder: (context, index) { final item = RankType.values[index]; final isCurr = index == tabIndex; - return IntrinsicHeight( + return SizedBox( + height: _tabHeight, child: Material( color: isCurr ? theme.colorScheme.onInverseSurface @@ -64,7 +68,8 @@ class _RankPageState extends State ? _rankController.animateToTop : () => _rankController ..tabIndex.value = index - ..tabController.animateTo(index), + ..tabController.animateTo(index) + ..scrollToCurrentIndex(_tabHeight, index), child: Row( mainAxisSize: MainAxisSize.min, children: [