fix:按html的假数据demo

This commit is contained in:
jingyun
2026-06-05 11:12:55 +08:00
parent b4272b5ec9
commit 9727b906c6
28 changed files with 2159 additions and 711 deletions
+32 -32
View File
@@ -4,6 +4,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import '../../data/api/report_data_source.dart';
import '../../data/models/models.dart';
import '../../theme/app_icons.dart';
import '../../theme/yanting_text.dart';
import '../../theme/yanting_tokens.dart';
import '../../theme/wise_tokens.dart';
import '../../widgets/app_buttons.dart';
import '../../widgets/app_card.dart';
@@ -42,10 +45,11 @@ class ReportDetailPage extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final retryCount = useState(0);
final detailFuture = useMemoized(
() => dataSource.reportDetail(reportId),
[dataSource, reportId, retryCount.value],
);
final detailFuture = useMemoized(() => dataSource.reportDetail(reportId), [
dataSource,
reportId,
retryCount.value,
]);
final snapshot = useFuture(detailFuture);
const registry = ModuleRendererRegistry();
@@ -54,20 +58,20 @@ class ReportDetailPage extends HookConsumerWidget {
body: snapshot.connectionState != ConnectionState.done
? const LoadingState()
: snapshot.hasError
? ErrorState(
message: snapshot.error.toString(),
onRetry: () => retryCount.value++,
)
: _ReportDetailContent(
detail: snapshot.data!,
dataSource: dataSource,
player: player,
onStartAudio: onStartAudio,
onToggleAudio: onToggleAudio,
onSeekAudio: onSeekAudio,
onSpeed: onSpeed,
registry: registry,
),
? ErrorState(
message: snapshot.error.toString(),
onRetry: () => retryCount.value++,
)
: _ReportDetailContent(
detail: snapshot.data!,
dataSource: dataSource,
player: player,
onStartAudio: onStartAudio,
onToggleAudio: onToggleAudio,
onSeekAudio: onSeekAudio,
onSpeed: onSpeed,
registry: registry,
),
);
}
}
@@ -102,10 +106,11 @@ class _ReportDetailContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ListView(
padding: const EdgeInsets.all(WiseSpacing.x4),
padding: const EdgeInsets.fromLTRB(WiseSpacing.x4, 4, WiseSpacing.x4, 16),
children: [
AppCard(
color: WiseColors.secondary200,
color: YantingColors.brandSoft,
borderColor: YantingColors.brandSoftBorder,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
@@ -120,12 +125,11 @@ class _ReportDetailContent extends StatelessWidget {
if (detail.hasAudio)
const AppBadge(
text: '音频',
icon: Icons.graphic_eq,
icon: AppIcons.playCircle,
kind: BadgeKind.audio,
),
AppBadge(
text: asString(detail.source['source_tier']),
icon: Icons.verified_outlined,
kind: BadgeKind.tier,
),
],
@@ -135,19 +139,16 @@ class _ReportDetailContent extends StatelessWidget {
detail.titleCn,
maxLines: 3,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.headlineSmall,
style: YantingText.sectionTitle.copyWith(fontSize: 21),
),
if (detail.oneLiner.isNotEmpty) ...[
const SizedBox(height: WiseSpacing.x2),
Text(
detail.oneLiner,
style: Theme.of(context).textTheme.bodyMedium,
),
Text(detail.oneLiner, style: YantingText.body),
],
const SizedBox(height: WiseSpacing.x3),
Text(
'${detail.institution.nameCn} · ${formatDate(detail.releasedAt)}',
style: Theme.of(context).textTheme.bodySmall,
style: YantingText.meta,
),
],
),
@@ -188,17 +189,16 @@ class _ActionBar extends StatelessWidget {
Expanded(
child: AppButton(
label: '收藏',
icon: Icons.favorite_border,
icon: AppIcons.heart,
kind: AppButtonKind.ghost,
onPressed: () =>
showLoginSheet(context, reason: '登录后保存到你的收藏'),
onPressed: () => showLoginSheet(context, reason: '登录后保存到你的收藏'),
),
),
const SizedBox(width: WiseSpacing.x2),
Expanded(
child: AppButton(
label: '原文',
icon: Icons.open_in_new,
icon: AppIcons.externalLink,
kind: AppButtonKind.ghost,
onPressed: () => showOutboundSheet(context, title: detail.titleCn),
),