records.dart 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. import 'dart:io';
  2. import 'package:audioplayers/audioplayers.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:fluttertoast/fluttertoast.dart';
  5. // 录音列表
  6. class Records extends StatefulWidget {
  7. final List<String> records;
  8. const Records({
  9. Key? key,
  10. required this.records,
  11. }) : super(key: key);
  12. @override
  13. _RecordsState createState() => _RecordsState();
  14. }
  15. class _RecordsState extends State<Records> {
  16. late int _totalTime;
  17. late int _currentTime;
  18. double _percent = 0.0;
  19. int _selected = -1;
  20. bool isPlay = false;
  21. AudioPlayer advancedPlayer = AudioPlayer();
  22. @override
  23. Widget build(BuildContext context) {
  24. return ListView.builder(
  25. itemCount: widget.records.length,
  26. shrinkWrap: true,
  27. reverse: true,
  28. itemBuilder: (BuildContext context, int i) {
  29. return Card(
  30. elevation: 5,
  31. child: ExpansionTile(
  32. title: Text(
  33. 'Record ${widget.records.length - i}',
  34. style: TextStyle(color: Colors.black),
  35. ),
  36. subtitle: Text(
  37. _getTime(filePath: widget.records.elementAt(i)),
  38. style: TextStyle(color: Colors.black38),
  39. ),
  40. onExpansionChanged: ((newState) {
  41. if (newState) {
  42. setState(() {
  43. _selected = i;
  44. });
  45. }
  46. }),
  47. children: [
  48. Container(
  49. height: 100,
  50. padding: const EdgeInsets.all(10),
  51. child: Column(
  52. mainAxisAlignment: MainAxisAlignment.center,
  53. children: [
  54. LinearProgressIndicator(
  55. minHeight: 5,
  56. backgroundColor: Colors.black,
  57. valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
  58. value: _selected == i ? _percent : 0,
  59. ),
  60. Row(
  61. children: [
  62. (isPlay)
  63. ? _Presso(
  64. ico: Icons.pause,
  65. onPressed: () {
  66. setState(() {
  67. isPlay = false;
  68. });
  69. advancedPlayer.pause();
  70. })
  71. : _Presso(
  72. ico: Icons.play_arrow,
  73. onPressed: () {
  74. setState(() {
  75. isPlay = true;
  76. });
  77. advancedPlayer.play(
  78. widget.records.elementAt(i),
  79. isLocal: true);
  80. setState(() {});
  81. setState(() {
  82. _selected = i;
  83. _percent = 0.0;
  84. });
  85. advancedPlayer.onPlayerCompletion.listen((_) {
  86. setState(() {
  87. _percent = 0.0;
  88. });
  89. });
  90. advancedPlayer.onDurationChanged
  91. .listen((duration) {
  92. setState(() {
  93. _totalTime = duration.inMicroseconds;
  94. });
  95. });
  96. advancedPlayer.onAudioPositionChanged
  97. .listen((duration) {
  98. setState(() {
  99. _currentTime = duration.inMicroseconds;
  100. _percent = _currentTime.toDouble() /
  101. _totalTime.toDouble();
  102. });
  103. });
  104. }),
  105. _Presso(
  106. ico: Icons.stop,
  107. onPressed: () {
  108. advancedPlayer.stop();
  109. setState(() {
  110. _percent = 0.0;
  111. });
  112. }),
  113. _Presso(
  114. ico: Icons.delete,
  115. onPressed: () {
  116. Directory appDirec =
  117. Directory(widget.records.elementAt(i));
  118. appDirec.delete(recursive: true);
  119. Fluttertoast.showToast(msg: "File Deleted");
  120. setState(() {
  121. widget.records
  122. .remove(widget.records.elementAt(i));
  123. });
  124. }),
  125. _Presso(
  126. ico: Icons.share,
  127. onPressed: () {
  128. Directory appDirec =
  129. Directory(widget.records.elementAt(i));
  130. List<String> list = List.empty(growable: true);
  131. list.add(appDirec.path);
  132. // Share.shareFiles(list);
  133. }),
  134. ],
  135. mainAxisAlignment: MainAxisAlignment.spaceEvenly,
  136. ),
  137. ],
  138. ),
  139. ),
  140. ],
  141. ),
  142. );
  143. },
  144. );
  145. }
  146. String _getTime({required String filePath}) {
  147. String fromPath = filePath.substring(
  148. filePath.lastIndexOf('/') + 1, filePath.lastIndexOf('.'));
  149. if (fromPath.startsWith("1", 0)) {
  150. DateTime dateTime =
  151. DateTime.fromMillisecondsSinceEpoch(int.parse(fromPath));
  152. int year = dateTime.year;
  153. int month = dateTime.month;
  154. int day = dateTime.day;
  155. int hour = dateTime.hour;
  156. int min = dateTime.minute;
  157. String dato = '$year-$month-$day--$hour:$min';
  158. return dato;
  159. } else {
  160. return "No Date";
  161. }
  162. }
  163. }
  164. class _Presso extends StatelessWidget {
  165. final IconData ico;
  166. final VoidCallback onPressed;
  167. const _Presso({Key? key, required this.ico, required this.onPressed})
  168. : super(key: key);
  169. @override
  170. Widget build(BuildContext context) {
  171. return ButtonTheme(
  172. minWidth: 48.0,
  173. child: RaisedButton(
  174. child: Icon(
  175. ico,
  176. color: Colors.white,
  177. ),
  178. onPressed: onPressed),
  179. );
  180. }
  181. }