Commit 9e14f47ab961376d1058a8f1c814a8570da91ae0
1 parent
4f9b0fa4
feat:解决开场音乐前点击(带音乐)无响应问题以及首页背景音乐问题
Showing
5 changed files
with
43 additions
and
23 deletions
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 'package:audioplayers/audioplayers.dart'; |
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(); | ... | ... |