challenge_detail_screen.dart 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:flutter/material.dart';
  2. import 'package:intl/intl.dart';
  3. import 'package:japp_flutter/core/models/challenge_model.dart';
  4. import 'package:japp_flutter/features/challenge/view_models/challenge_detail_vm.dart';
  5. import 'package:flutter_riverpod/flutter_riverpod.dart';
  6. class ChallengeDetailScreen extends ConsumerWidget {
  7. final int challengeId;
  8. const ChallengeDetailScreen({super.key, required this.challengeId});
  9. @override
  10. Widget build(BuildContext context, WidgetRef ref) {
  11. final challengeAsync = ref.watch(challengeDetailProvider);
  12. return Scaffold(
  13. appBar: AppBar(
  14. title: const Text("挑战详情"),
  15. actions: [
  16. IconButton(
  17. icon: const Icon(Icons.edit),
  18. onPressed: () {
  19. final challenge = challengeAsync.value;
  20. if (challenge != null) {
  21. Navigator.pushNamed(context, '/edit/${challenge.id}');
  22. }
  23. },
  24. ),
  25. ],
  26. ),
  27. body: switch (challengeAsync) {
  28. AsyncError(:final error) => Center(child: Text('加载失败: $error')),
  29. AsyncData(value: final value) => _buildChallengeContent(value!),
  30. _ => const Center(child: CircularProgressIndicator()),
  31. },
  32. );
  33. }
  34. Widget _buildChallengeContent(ChallengeModel challenge) {
  35. return SingleChildScrollView(
  36. padding: const EdgeInsets.all(16),
  37. child: Column(
  38. crossAxisAlignment: CrossAxisAlignment.start,
  39. children: [
  40. Text(
  41. challenge.title,
  42. style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
  43. ),
  44. const SizedBox(height: 16),
  45. Text(
  46. challenge.description,
  47. style: const TextStyle(fontSize: 16, height: 1.5),
  48. ),
  49. ],
  50. ),
  51. );
  52. }
  53. Widget _buildDateInfo(String label, DateTime date) {
  54. return Padding(
  55. padding: const EdgeInsets.only(bottom: 8),
  56. child: Row(
  57. children: [
  58. Text('$label: ', style: const TextStyle(fontWeight: FontWeight.bold)),
  59. Text(DateFormat('yyyy年MM月dd日').format(date)),
  60. ],
  61. ),
  62. );
  63. }
  64. Widget _buildParticipantInfo(int count) {
  65. return Row(
  66. children: [
  67. const Icon(Icons.people, size: 20),
  68. const SizedBox(width: 8),
  69. Text('$count 人参与'),
  70. ],
  71. );
  72. }
  73. }