rwadurian/frontend/mining-app/lib/presentation/pages/home/home_page.dart

136 lines
4.0 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/constants/app_colors.dart';
import '../../../core/utils/format_utils.dart';
import '../../providers/user_providers.dart';
import '../../providers/mining_providers.dart';
import 'widgets/asset_card.dart';
import 'widgets/price_card.dart';
import 'widgets/quick_actions.dart';
class HomePage extends ConsumerWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final user = ref.watch(userNotifierProvider);
final accountSequence = user.accountSequence ?? '';
return Scaffold(
appBar: AppBar(
title: const Text('榴莲挖矿'),
backgroundColor: AppColors.primary,
foregroundColor: Colors.white,
actions: [
IconButton(
icon: const Icon(Icons.notifications_outlined),
onPressed: () {},
),
],
),
body: RefreshIndicator(
onRefresh: () async {
ref.invalidate(shareAccountProvider(accountSequence));
ref.invalidate(globalStateProvider);
},
child: SingleChildScrollView(
physics: const AlwaysScrollableScrollPhysics(),
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
// 资产卡片
AssetCard(accountSequence: accountSequence),
const SizedBox(height: 16),
// 当前价格
const PriceCard(),
const SizedBox(height: 24),
// 快捷操作
const Text(
'快捷操作',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 12),
const QuickActions(),
const SizedBox(height: 24),
// 全网数据
const Text(
'全网数据',
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 12),
_buildGlobalStats(ref),
],
),
),
),
);
}
Widget _buildGlobalStats(WidgetRef ref) {
final globalState = ref.watch(globalStateProvider);
return globalState.when(
data: (state) {
if (state == null) return const SizedBox.shrink();
return Card(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
children: [
_buildStatRow('全网算力', formatCompact(state.networkContribution)),
const Divider(),
_buildStatRow('已分配', formatCompact(state.totalDistributed)),
const Divider(),
_buildStatRow('已销毁', formatCompact(state.totalBurned)),
const Divider(),
_buildStatRow('流通池', formatCompact(state.circulationPool)),
],
),
),
);
},
loading: () => const Card(
child: Padding(
padding: EdgeInsets.all(32),
child: Center(child: CircularProgressIndicator()),
),
),
error: (_, __) => const Card(
child: Padding(
padding: EdgeInsets.all(32),
child: Center(child: Text('加载失败')),
),
),
);
}
Widget _buildStatRow(String label, String value) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(label, style: const TextStyle(color: AppColors.textSecondary)),
Text(
value,
style: const TextStyle(fontWeight: FontWeight.w500),
),
],
),
);
}
}