diff --git a/lib/muyu/animate_text.dart b/lib/muyu/animate_text.dart index 0b273c3..abc14a2 100644 --- a/lib/muyu/animate_text.dart +++ b/lib/muyu/animate_text.dart @@ -1,15 +1,17 @@ import 'package:flutter/material.dart'; -class AnimateText extends StatefulWidget { - final String text; +import 'models/merit_record.dart'; - const AnimateText({Key? key, required this.text}) : super(key: key); +class AnimateText extends StatefulWidget { + final MeritRecord record; + + const AnimateText({Key? key, required this.record}) : super(key: key); @override - State createState() => _FadTextState(); + State createState() => _AnimateTextState(); } -class _FadTextState extends State with SingleTickerProviderStateMixin { +class _AnimateTextState extends State with SingleTickerProviderStateMixin { late AnimationController controller; late Animation opacity; late Animation position; @@ -18,17 +20,23 @@ class _FadTextState extends State with SingleTickerProviderStateMix @override void initState() { super.initState(); - controller = AnimationController(vsync: this, duration: Duration(milliseconds: 500)); + controller = + AnimationController(vsync: this, duration: Duration(milliseconds: 500)); opacity = Tween(begin: 1.0, end: 0.0).animate(controller); scale = Tween(begin: 1.0, end: 0.9).animate(controller); - position = Tween(begin: const Offset(0, 2), end: Offset.zero,).animate(controller); + position = Tween( + begin: const Offset(0, 2), + end: Offset.zero, + ).animate(controller); controller.forward(); } @override void didUpdateWidget(covariant AnimateText oldWidget) { super.didUpdateWidget(oldWidget); - controller.forward(from: 0); + if (oldWidget.record.id != widget.record.id) { + controller.forward(from: 0); + } } @override @@ -45,8 +53,8 @@ class _FadTextState extends State with SingleTickerProviderStateMix position: position, child: FadeTransition( opacity: opacity, - child: Text(widget.text), + child: Text('功德+${widget.record.value}'), )), ); } -} \ No newline at end of file +} diff --git a/lib/muyu/models/merit_record.dart b/lib/muyu/models/merit_record.dart new file mode 100644 index 0000000..45dba2c --- /dev/null +++ b/lib/muyu/models/merit_record.dart @@ -0,0 +1,9 @@ +class MeritRecord { + final String id; + final int timestamp; + final int value; + final String image; + final String audio; + + MeritRecord(this.id, this.timestamp, this.value, this.image, this.audio); +} diff --git a/lib/muyu/muyu_page.dart b/lib/muyu/muyu_page.dart index a0d71ab..70dee04 100644 --- a/lib/muyu/muyu_page.dart +++ b/lib/muyu/muyu_page.dart @@ -5,13 +5,16 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_first_station/muyu/animate_text.dart'; import 'package:flutter_first_station/muyu/options/select_audio.dart'; +import 'package:uuid/uuid.dart'; import 'models/audio_option.dart'; import 'models/image_option.dart'; +import 'models/merit_record.dart'; import 'muyu_image.dart'; import 'count_panel.dart'; import 'muyu_app_bar.dart'; import 'options/select_image.dart'; +import 'record_history.dart'; class MuyuPage extends StatefulWidget { const MuyuPage({Key? key}) : super(key: key); @@ -22,12 +25,16 @@ class MuyuPage extends StatefulWidget { class _MuyuPageState extends State { int _counter = 0; - int _cruValue = 0; + MeritRecord? _cruRecord; int _activeImageIndex = 0; int _activeAudioIndex = 0; final Random _random = Random(); + final Uuid uuid = Uuid(); + + List _records = []; + final List audioOptions = const [ AudioOption('音效1', 'muyu_1.mp3'), @@ -78,7 +85,7 @@ class _MuyuPageState extends State { image: activeImage, onTap: _onKnock, ), - if (_cruValue != 0) AnimateText(text: '功德+$_cruValue') + if (_cruRecord != null) AnimateText(record: _cruRecord!,) ], ), ), @@ -87,7 +94,9 @@ class _MuyuPageState extends State { ); } - void _toHistory() {} + void _toHistory() { + Navigator.of(context).push(MaterialPageRoute(builder: (_)=>RecordHistory(record: _records.reversed.toList()))); + } void _onTapSwitchAudio() { showCupertinoModalPopup( @@ -118,8 +127,17 @@ class _MuyuPageState extends State { void _onKnock() { pool?.start(); setState(() { - _cruValue = knockValue; - _counter += _cruValue; + String id = uuid.v4(); + _cruRecord = MeritRecord( + id, + DateTime.now().millisecondsSinceEpoch, + knockValue, + activeImage, + audioOptions[_activeAudioIndex].name, + ); + _counter += _cruRecord!.value; + // 添加功德记录 + _records.add(_cruRecord!); }); } diff --git a/lib/muyu/record_history.dart b/lib/muyu/record_history.dart new file mode 100644 index 0000000..c223e5e --- /dev/null +++ b/lib/muyu/record_history.dart @@ -0,0 +1,40 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; + +import 'models/merit_record.dart'; + +DateFormat format = DateFormat('yyyy年MM月dd日 HH:mm:ss'); + +class RecordHistory extends StatelessWidget { + final List record; + const RecordHistory({Key? key, required this.record}) : super(key: key); + + @override + Widget build(BuildContext context) { + + return Scaffold( + appBar: AppBar( + iconTheme: const IconThemeData(color: Colors.black), + centerTitle: true, + title: const Text('功德记录',style: TextStyle(color: Colors.black,fontSize: 16),), + elevation: 0, + backgroundColor: Colors.white,), + body: ListView.builder( + itemBuilder: _buildItem,itemCount: record.length,), + ); + } + + Widget? _buildItem(BuildContext context, int index) { + MeritRecord merit = record[index]; + String date = format.format(DateTime.fromMillisecondsSinceEpoch(merit.timestamp)); + return ListTile( + leading: CircleAvatar( + backgroundColor: Colors.blue, + backgroundImage: AssetImage(merit.image), + ), + title: Text('功德 +${merit.value}'), + subtitle: Text('${merit.audio}'), + trailing: Text(date,style: const TextStyle(fontSize: 12,color: Colors.grey),), + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 4e58d1e..0989dde 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -192,6 +192,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.flutter-io.cn" + source: hosted + version: "0.18.1" js: dependency: transitive description: @@ -390,7 +398,7 @@ packages: source: hosted version: "1.3.1" uuid: - dependency: transitive + dependency: "direct main" description: name: uuid sha256: "648e103079f7c64a36dc7d39369cabb358d377078a051d6ae2ad3aa539519313" diff --git a/pubspec.yaml b/pubspec.yaml index fef1590..7b4d9e5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,8 @@ dependencies: flutter: sdk: flutter flame_audio: ^2.0.2 + uuid: ^3.0.7 + intl: ^0.18.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2