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