Commit 9e14f47ab961376d1058a8f1c814a8570da91ae0

Authored by 吴启风
1 parent 4f9b0fa4

feat:解决开场音乐前点击(带音乐)无响应问题以及首页背景音乐问题

lib/app/splash_page.dart
... ... @@ -60,8 +60,7 @@ class _TransitionViewState extends State<TransitionView> {
60 60 await fetchNecessaryData(token);
61 61 apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds;
62 62 }
63   - /// 开屏最低2.5s,保证视觉与音乐同步
64   - int duration = max(2500 - apartInMilliseconds, 0);
  63 + int duration = max(1500 - apartInMilliseconds, 0);
65 64 Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms, 最终duration=$duration');
66 65 Timer(Duration(milliseconds: duration), () {
67 66 /*if (userEntity != null) {
... ... @@ -77,8 +76,11 @@ class _TransitionViewState extends State<TransitionView> {
77 76 context: context,
78 77 barrierDismissible: false,
79 78 builder: (BuildContext context) {
80   - return WillPopScope(
81   - onWillPop: () => Future.value(false),
  79 + return PopScope(
  80 + canPop: false,
  81 + onPopInvoked: (didPop) {
  82 + Log.d('WQF isAggreementAccepted onPopInvoked didPop=$didPop');
  83 + },
82 84 child: WebviewDialog(
83 85 title: "服务条款及隐私政策",
84 86 webUrl: AppConsts.userPrivacyPolicyUrl,
... ... @@ -125,8 +127,11 @@ class _TransitionViewState extends State<TransitionView> {
125 127 context: context,
126 128 barrierDismissible: false,
127 129 builder: (BuildContext context) {
128   - return WillPopScope(
129   - onWillPop: () => Future.value(false),
  130 + return PopScope(
  131 + canPop: false,
  132 + onPopInvoked: (didPop) {
  133 + Log.d('WQF fetchNecessaryData onPopInvoked didPop=$didPop');
  134 + },
130 135 child: AlertDialog(
131 136 title: const Text('温馨提示'),
132 137 content: const Text('网络异常,请检查网络后重试'),
... ... @@ -169,7 +174,7 @@ class _TransitionViewState extends State<TransitionView> {
169 174 changeDevice();
170 175 await SpUtil.preInit();
171 176 ModuleCache.instance.init();
172   - AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.welcomeToWow);
  177 + await AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.welcomeToWow);
173 178 startTime();
174 179 }
175 180  
... ...
lib/pages/home/bloc.dart
... ... @@ -21,10 +21,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
21 21  
22 22 void _init(InitEvent event, Emitter<HomeState> emit) async {
23 23 if (UserUtil.isLogined()) {
24   - /// 增加1s避免与开屏音乐撞车(覆盖)
25   - Timer(const Duration(seconds: 1), () {
26   - AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch);
27   - });
  24 + AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch);
28 25 }
29 26 await _checkUpdate(emit);
30 27 }
... ...
lib/pages/home/view.dart
... ... @@ -84,6 +84,9 @@ class _HomePageView extends StatelessWidget {
84 84 () async {
85 85 pushNamed(AppRouteName.courseUnit)
86 86 .then((value) => {
  87 + AudioPlayerUtil.getInstance()
  88 + .playAudio(
  89 + AudioPlayerUtilType.touch),
87 90 if (value != null)
88 91 {
89 92 bloc.exchangeResult =
... ... @@ -172,9 +175,10 @@ class _HomePageView extends StatelessWidget {
172 175 return GestureDetector(
173 176 onTap: () {
174 177 _checkPermission(() async {
175   - await clickController.playMusicAndPerformAction(
176   - context, AudioPlayerUtilType.gameTime,
177   - () async {
  178 + await clickController
  179 + .playMusicAndPerformAction(context,
  180 + AudioPlayerUtilType.gameTime,
  181 + () async {
178 182 pushNamed(AppRouteName.games)
179 183 .then((value) => {
180 184 AudioPlayerUtil.getInstance()
... ...
lib/route/custom_navigator_observer.dart
... ... @@ -2,25 +2,27 @@
2 2  
3 3 import 'package:flutter/cupertino.dart';
4 4 import 'package:wow_english/common/utils/click_with_music_controller.dart';
5   -import 'package:wow_english/utils/audio_player_util.dart';
6 5  
7 6 import '../utils/log_util.dart';
8 7  
9 8 class CustomNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
  9 +
  10 + final TAG = 'CustomNavigatorObserver';
  11 +
10 12 @override
11   - void didPush(Route route, Route? previousRoute) {
12   - Log.d("WQF CustomNavigatorObserver didPush route=$route previousRoute=$previousRoute");
  13 + Future<void> didPush(Route route, Route? previousRoute) async {
  14 + Log.d("$TAG didPush route=$route previousRoute=$previousRoute");
13 15 if (route is PageRoute) {
14   - ClickWithMusicController.instance.reset();
  16 + await ClickWithMusicController.instance.reset();
15 17 }
16 18 super.didPush(route, previousRoute);
17 19 }
18 20  
19 21 @override
20   - void didPop(Route route, Route? previousRoute) {
21   - Log.d("WQF CustomNavigatorObserver didPop route=$route previousRoute=$previousRoute");
  22 + Future<void> didPop(Route route, Route? previousRoute) async {
  23 + Log.d("$TAG didPop route=$route previousRoute=$previousRoute");
22 24 if (route is PageRoute) {
23   - ClickWithMusicController.instance.reset();
  25 + await ClickWithMusicController.instance.reset();
24 26 }
25 27 super.didPop(route, previousRoute);
26 28 }
... ...
lib/utils/audio_player_util.dart
... ... @@ -2,6 +2,7 @@ import &#39;package:audioplayers/audioplayers.dart&#39;;
2 2 import 'package:flutter/cupertino.dart';
3 3 import 'package:wow_english/common/extension/string_extension.dart';
4 4  
  5 +import '../common/request/basic_config.dart';
5 6 import 'log_util.dart';
6 7  
7 8 enum AudioPlayerUtilType {
... ... @@ -39,7 +40,11 @@ class AudioPlayerUtil extends WidgetsBindingObserver {
39 40 // 监听应用生命周期
40 41 WidgetsBinding.instance.addObserver(this);
41 42 _audioPlayer = AudioPlayer();
  43 + if (!BasicConfig.isEnvProd()) {
  44 + AudioLogger.logLevel = AudioLogLevel.info;
  45 + }
42 46 _audioPlayer.onPlayerStateChanged.listen((event) async {
  47 + Log.d("$TAG onPlayerStateChanged $event _wasPlaying=$_wasPlaying");
43 48 if (event == PlayerState.completed) {
44 49 // 播放结束再次播放
45 50 if (currentType == AudioPlayerUtilType.inMyTummy) {
... ... @@ -64,17 +69,20 @@ class AudioPlayerUtil extends WidgetsBindingObserver {
64 69  
65 70 // 播放音频
66 71 Future<void> playAudio(AudioPlayerUtilType type) async {
67   - Log.d("$TAG playAudio $type");
  72 + Log.d('$TAG playAudio begin $type');
68 73 currentType = type;
69 74 String path = type.path;
70 75 await _audioPlayer.play(AssetSource(path.assetMp3), volume: 0.5);
71 76 await _audioPlayer.onPlayerComplete.first;
  77 + Log.d('$TAG playAudio end $type');
72 78 }
73 79  
74 80 // stop
75 81 Future<void> stop() async {
76 82 Log.d("$TAG stop _audioPlayer.state=${_audioPlayer.state}");
77   - await _audioPlayer.stop();
  83 + if (_audioPlayer.state == PlayerState.playing) {
  84 + await _audioPlayer.stop();
  85 + }
78 86 }
79 87  
80 88 // pause
... ... @@ -109,6 +117,10 @@ class AudioPlayerUtil extends WidgetsBindingObserver {
109 117 }
110 118 }
111 119  
  120 + bool isPlaying() {
  121 + return _audioPlayer.state == PlayerState.playing;
  122 + }
  123 +
112 124 void dispose() {
113 125 Log.d("$TAG dispose _audioPlayer.state=${_audioPlayer.state}");
114 126 _audioPlayer.dispose();
... ...