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:
parent
c91bfa4952
commit
723d70e4b8
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Reference in New Issue