feat(mobile-app): 为3个主导航页面添加下拉刷新功能

- TradingPage (兑换): 添加 RefreshIndicator,刷新时重新加载钱包和收益数据
- RankingPage (龙虎榜): 添加 RefreshIndicator,刷新时 invalidate leaderboardStatusProvider
  - 列表视图和待开启状态视图均支持下拉刷新
- MiningPage (监控): 使用 LayoutBuilder + IntrinsicHeight 模式实现
  - 刷新时并行加载用户数据、授权数据和钱包状态

注:ProfilePage 已有完整的下拉刷新实现,无需修改

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
hailin 2026-02-05 21:50:43 -08:00
parent a1aba14ccf
commit 5bacd21840
3 changed files with 129 additions and 62 deletions

View File

@ -224,6 +224,16 @@ class _MiningPageState extends ConsumerState<MiningPage> {
);
}
///
Future<void> _onRefresh() async {
debugPrint('[MiningPage] 下拉刷新');
await Future.wait([
_loadUserData(),
_loadAuthorizationData(),
_checkWalletStatus(),
]);
}
///
void _startMonitor() {
setState(() {
@ -268,6 +278,17 @@ class _MiningPageState extends ConsumerState<MiningPage> {
),
),
child: SafeArea(
child: RefreshIndicator(
onRefresh: _onRefresh,
color: const Color(0xFFD4AF37),
backgroundColor: Colors.white,
child: LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: ConstrainedBox(
constraints: BoxConstraints(minHeight: constraints.maxHeight),
child: IntrinsicHeight(
child: Column(
children: [
//
@ -284,6 +305,12 @@ class _MiningPageState extends ConsumerState<MiningPage> {
),
),
);
},
),
),
),
),
);
}
///

View File

@ -88,6 +88,13 @@ class _RankingPageState extends ConsumerState<RankingPage> {
),
];
///
Future<void> _onRefresh() async {
debugPrint('[RankingPage] 下拉刷新');
ref.invalidate(leaderboardStatusProvider);
// TODO: invalidate Provider
}
///
void _selectRankingType(RankingType type) {
setState(() {
@ -198,7 +205,17 @@ class _RankingPageState extends ConsumerState<RankingPage> {
break;
}
return Center(
return RefreshIndicator(
onRefresh: _onRefresh,
color: const Color(0xFFD4AF37),
backgroundColor: Colors.white,
child: LayoutBuilder(
builder: (context, constraints) {
return SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: ConstrainedBox(
constraints: BoxConstraints(minHeight: constraints.maxHeight),
child: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -239,6 +256,11 @@ class _RankingPageState extends ConsumerState<RankingPage> {
),
],
),
),
),
);
},
),
);
}
@ -461,7 +483,12 @@ class _RankingPageState extends ConsumerState<RankingPage> {
///
Widget _buildRankingList() {
return ListView.builder(
return RefreshIndicator(
onRefresh: _onRefresh,
color: const Color(0xFFD4AF37),
backgroundColor: Colors.white,
child: ListView.builder(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
itemCount: _mockRankingData.length,
itemBuilder: (context, index) {
@ -470,6 +497,7 @@ class _RankingPageState extends ConsumerState<RankingPage> {
child: _buildRankingItem(_mockRankingData[index]),
);
},
),
);
}

View File

@ -218,6 +218,12 @@ class _TradingPageState extends ConsumerState<TradingPage> {
}
}
///
Future<void> _onRefresh() async {
debugPrint('[TradingPage] 下拉刷新');
await _loadWalletData();
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -236,7 +242,12 @@ class _TradingPageState extends ConsumerState<TradingPage> {
),
),
child: SafeArea(
child: RefreshIndicator(
onRefresh: _onRefresh,
color: const Color(0xFFD4AF37),
backgroundColor: Colors.white,
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
child: Column(
children: [
//
@ -274,6 +285,7 @@ class _TradingPageState extends ConsumerState<TradingPage> {
),
),
),
),
);
}