import 'package:flutter/material.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; import '../../../common/widgets/adaptive.dart'; import '../application/news_controller.dart'; class NewsPage extends ConsumerWidget { const NewsPage({super.key}); @override Widget build(BuildContext context, WidgetRef ref) { final news = ref.watch(newsControllerProvider); final cs = ShadTheme.of(context).colorScheme; return SafeArea( top: false, child: ListView( padding: const EdgeInsets.fromLTRB(18, 18, 18, 24), children: [ Center( child: ConstrainedBox( constraints: const BoxConstraints( maxWidth: Adaptive.contentMaxWidth, ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ Row( children: [ Expanded( child: Text( '信息整理 · 非投资建议', style: TextStyle( color: cs.mutedForeground, fontSize: 13, ), ), ), TextButton( onPressed: () => ref.read(newsControllerProvider.notifier).refresh(), child: const Text('刷新'), ), ], ), const SizedBox(height: 8), for (final item in news.items) Padding( padding: const EdgeInsets.only(bottom: 10), child: DecoratedBox( decoration: BoxDecoration( color: cs.card, border: Border.all(color: cs.border), borderRadius: BorderRadius.circular(12), ), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Container( padding: const EdgeInsets.symmetric( horizontal: 8, vertical: 3, ), decoration: BoxDecoration( color: item.metal.color.withValues( alpha: 0.12, ), borderRadius: BorderRadius.circular(999), ), child: Text( item.metal.shortLabel, style: TextStyle( color: item.metal.color, fontWeight: FontWeight.w700, ), ), ), const SizedBox(width: 8), Text( '${item.source} · ${item.publishedAt.hour.toString().padLeft(2, '0')}:${item.publishedAt.minute.toString().padLeft(2, '0')}', style: TextStyle( color: cs.mutedForeground, fontSize: 12, ), ), ], ), const SizedBox(height: 10), Text( item.title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w700, color: cs.foreground, ), ), const SizedBox(height: 8), Text( item.summary, style: TextStyle( color: cs.mutedForeground, height: 1.5, ), ), ], ), ), ), ), ], ), ), ), ], ), ); } }