home_page.dart 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'dart:math';
  2. import 'package:flutter_windmill/views/windmill.dart';
  3. import 'package:fluttertoast/fluttertoast.dart';
  4. import 'package:record/record.dart';
  5. import 'package:flutter/material.dart';
  6. class HomePage extends StatefulWidget {
  7. const HomePage({super.key});
  8. @override
  9. State<HomePage> createState() => _HomePageState();
  10. }
  11. class _HomePageState extends State<HomePage> {
  12. final Record record = Record();
  13. double radius = 0; // 旋转角度
  14. @override
  15. Widget build(BuildContext context) {
  16. return Scaffold(
  17. body: Center(
  18. child: Column(
  19. children: [
  20. Text(
  21. "小风车",
  22. style: TextStyle(fontSize: 18),
  23. ),
  24. Text("用嘴巴吹小风车,用力吹转的越快!"),
  25. SizedBox(
  26. height: 300,
  27. width: 100,
  28. child: CustomPaint(
  29. size: const Size(100, 300),
  30. painter: Windmill(
  31. radians: radius,
  32. ),
  33. ),
  34. ),
  35. ],
  36. ),
  37. ),
  38. );
  39. }
  40. @override
  41. void initState() {
  42. super.initState();
  43. startRecord();
  44. }
  45. @override
  46. void dispose() {
  47. super.dispose();
  48. stopRecord();
  49. }
  50. void startRecord() async {
  51. bool hasPermission = await record.hasPermission();
  52. if (hasPermission) {
  53. await record.start();
  54. record
  55. ..onStateChanged().listen((event) {
  56. // logger.v(event.toString());
  57. })
  58. ..onAmplitudeChanged(const Duration(milliseconds: 200)).listen((event) {
  59. double scale = 1 / event.current;
  60. final r = (scale * 0.1 * 2 * pi).abs();
  61. radius += r;
  62. radius = radius > (2 * pi) ? radius - (2 * pi) : radius;
  63. // logger.v(radius.toString());
  64. if (mounted) {
  65. setState(() {});
  66. }
  67. });
  68. } else {
  69. Fluttertoast.showToast(msg: '无录音权限');
  70. }
  71. }
  72. void stopRecord() async {
  73. if (await record.isRecording()) record.dispose();
  74. }
  75. }