fix(mobile-app): 修复账本明细筛选栏滚动重置问题

使用 ScrollController 保持筛选栏滚动位置

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-22 20:21:31 -08:00
parent c91bfa4952
commit 723d70e4b8
1 changed files with 9 additions and 3 deletions

View File

@ -15,6 +15,7 @@ class LedgerDetailPage extends ConsumerStatefulWidget {
class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
with SingleTickerProviderStateMixin {
late TabController _tabController;
late ScrollController _filterScrollController;
//
bool _isLoading = true;
@ -25,6 +26,7 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
//
String? _selectedEntryType;
int _selectedFilterIndex = 0;
int _currentPage = 1;
static const int _pageSize = 20;
@ -45,12 +47,14 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
_filterScrollController = ScrollController();
_loadData();
}
@override
void dispose() {
_tabController.dispose();
_filterScrollController.dispose();
super.dispose();
}
@ -125,9 +129,10 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
}
///
Future<void> _filterByEntryType(String? entryType) async {
Future<void> _filterByEntryType(String? entryType, int index) async {
setState(() {
_selectedEntryType = entryType?.isEmpty == true ? null : entryType;
_selectedFilterIndex = index;
_currentPage = 1;
_isLoading = true;
});
@ -771,15 +776,16 @@ class _LedgerDetailPageState extends ConsumerState<LedgerDetailPage>
height: 44,
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: ListView.builder(
controller: _filterScrollController,
scrollDirection: Axis.horizontal,
itemCount: _entryTypes.length,
itemBuilder: (context, index) {
final type = _entryTypes[index];
final isSelected = (_selectedEntryType ?? '') == type['value'];
final isSelected = _selectedFilterIndex == index;
return Padding(
padding: const EdgeInsets.only(right: 8),
child: GestureDetector(
onTap: () => _filterByEntryType(type['value']),
onTap: () => _filterByEntryType(type['value'], index),
child: Container(
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
decoration: BoxDecoration(