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