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(); | 
