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>
|
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(
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue