From 9e14f47ab961376d1058a8f1c814a8570da91ae0 Mon Sep 17 00:00:00 2001 From: wuqifeng <540416539@qq.com> Date: Sun, 4 Aug 2024 23:53:49 +0800 Subject: [PATCH] feat:解决开场音乐前点击(带音乐)无响应问题以及首页背景音乐问题 --- lib/app/splash_page.dart | 19 ++++++++++++------- lib/pages/home/bloc.dart | 5 +---- lib/pages/home/view.dart | 10 +++++++--- lib/route/custom_navigator_observer.dart | 16 +++++++++------- lib/utils/audio_player_util.dart | 16 ++++++++++++++-- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/lib/app/splash_page.dart b/lib/app/splash_page.dart index 5cb8f40..0f92c0e 100644 --- a/lib/app/splash_page.dart +++ b/lib/app/splash_page.dart @@ -60,8 +60,7 @@ class _TransitionViewState extends State { await fetchNecessaryData(token); apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds; } - /// 开屏最低2.5s,保证视觉与音乐同步 - int duration = max(2500 - apartInMilliseconds, 0); + int duration = max(1500 - apartInMilliseconds, 0); Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms, 最终duration=$duration'); Timer(Duration(milliseconds: duration), () { /*if (userEntity != null) { @@ -77,8 +76,11 @@ class _TransitionViewState extends State { context: context, barrierDismissible: false, builder: (BuildContext context) { - return WillPopScope( - onWillPop: () => Future.value(false), + return PopScope( + canPop: false, + onPopInvoked: (didPop) { + Log.d('WQF isAggreementAccepted onPopInvoked didPop=$didPop'); + }, child: WebviewDialog( title: "服务条款及隐私政策", webUrl: AppConsts.userPrivacyPolicyUrl, @@ -125,8 +127,11 @@ class _TransitionViewState extends State { context: context, barrierDismissible: false, builder: (BuildContext context) { - return WillPopScope( - onWillPop: () => Future.value(false), + return PopScope( + canPop: false, + onPopInvoked: (didPop) { + Log.d('WQF fetchNecessaryData onPopInvoked didPop=$didPop'); + }, child: AlertDialog( title: const Text('温馨提示'), content: const Text('网络异常,请检查网络后重试'), @@ -169,7 +174,7 @@ class _TransitionViewState extends State { changeDevice(); await SpUtil.preInit(); ModuleCache.instance.init(); - AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.welcomeToWow); + await AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.welcomeToWow); startTime(); } diff --git a/lib/pages/home/bloc.dart b/lib/pages/home/bloc.dart index 56df743..048f624 100644 --- a/lib/pages/home/bloc.dart +++ b/lib/pages/home/bloc.dart @@ -21,10 +21,7 @@ class HomeBloc extends Bloc { void _init(InitEvent event, Emitter emit) async { if (UserUtil.isLogined()) { - /// 增加1s避免与开屏音乐撞车(覆盖) - Timer(const Duration(seconds: 1), () { - AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch); - }); + AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.touch); } await _checkUpdate(emit); } diff --git a/lib/pages/home/view.dart b/lib/pages/home/view.dart index 7f44a0a..22a3a15 100644 --- a/lib/pages/home/view.dart +++ b/lib/pages/home/view.dart @@ -84,6 +84,9 @@ class _HomePageView extends StatelessWidget { () async { pushNamed(AppRouteName.courseUnit) .then((value) => { + AudioPlayerUtil.getInstance() + .playAudio( + AudioPlayerUtilType.touch), if (value != null) { bloc.exchangeResult = @@ -172,9 +175,10 @@ class _HomePageView extends StatelessWidget { return GestureDetector( onTap: () { _checkPermission(() async { - await clickController.playMusicAndPerformAction( - context, AudioPlayerUtilType.gameTime, - () async { + await clickController + .playMusicAndPerformAction(context, + AudioPlayerUtilType.gameTime, + () async { pushNamed(AppRouteName.games) .then((value) => { AudioPlayerUtil.getInstance() diff --git a/lib/route/custom_navigator_observer.dart b/lib/route/custom_navigator_observer.dart index fa1c071..6709550 100644 --- a/lib/route/custom_navigator_observer.dart +++ b/lib/route/custom_navigator_observer.dart @@ -2,25 +2,27 @@ import 'package:flutter/cupertino.dart'; import 'package:wow_english/common/utils/click_with_music_controller.dart'; -import 'package:wow_english/utils/audio_player_util.dart'; import '../utils/log_util.dart'; class CustomNavigatorObserver extends RouteObserver> { + + final TAG = 'CustomNavigatorObserver'; + @override - void didPush(Route route, Route? previousRoute) { - Log.d("WQF CustomNavigatorObserver didPush route=$route previousRoute=$previousRoute"); + Future didPush(Route route, Route? previousRoute) async { + Log.d("$TAG didPush route=$route previousRoute=$previousRoute"); if (route is PageRoute) { - ClickWithMusicController.instance.reset(); + await ClickWithMusicController.instance.reset(); } super.didPush(route, previousRoute); } @override - void didPop(Route route, Route? previousRoute) { - Log.d("WQF CustomNavigatorObserver didPop route=$route previousRoute=$previousRoute"); + Future didPop(Route route, Route? previousRoute) async { + Log.d("$TAG didPop route=$route previousRoute=$previousRoute"); if (route is PageRoute) { - ClickWithMusicController.instance.reset(); + await ClickWithMusicController.instance.reset(); } super.didPop(route, previousRoute); } diff --git a/lib/utils/audio_player_util.dart b/lib/utils/audio_player_util.dart index dad5c10..a0cfaaa 100644 --- a/lib/utils/audio_player_util.dart +++ b/lib/utils/audio_player_util.dart @@ -2,6 +2,7 @@ import 'package:audioplayers/audioplayers.dart'; import 'package:flutter/cupertino.dart'; import 'package:wow_english/common/extension/string_extension.dart'; +import '../common/request/basic_config.dart'; import 'log_util.dart'; enum AudioPlayerUtilType { @@ -39,7 +40,11 @@ class AudioPlayerUtil extends WidgetsBindingObserver { // 监听应用生命周期 WidgetsBinding.instance.addObserver(this); _audioPlayer = AudioPlayer(); + if (!BasicConfig.isEnvProd()) { + AudioLogger.logLevel = AudioLogLevel.info; + } _audioPlayer.onPlayerStateChanged.listen((event) async { + Log.d("$TAG onPlayerStateChanged $event _wasPlaying=$_wasPlaying"); if (event == PlayerState.completed) { // 播放结束再次播放 if (currentType == AudioPlayerUtilType.inMyTummy) { @@ -64,17 +69,20 @@ class AudioPlayerUtil extends WidgetsBindingObserver { // 播放音频 Future playAudio(AudioPlayerUtilType type) async { - Log.d("$TAG playAudio $type"); + Log.d('$TAG playAudio begin $type'); currentType = type; String path = type.path; await _audioPlayer.play(AssetSource(path.assetMp3), volume: 0.5); await _audioPlayer.onPlayerComplete.first; + Log.d('$TAG playAudio end $type'); } // stop Future stop() async { Log.d("$TAG stop _audioPlayer.state=${_audioPlayer.state}"); - await _audioPlayer.stop(); + if (_audioPlayer.state == PlayerState.playing) { + await _audioPlayer.stop(); + } } // pause @@ -109,6 +117,10 @@ class AudioPlayerUtil extends WidgetsBindingObserver { } } + bool isPlaying() { + return _audioPlayer.state == PlayerState.playing; + } + void dispose() { Log.d("$TAG dispose _audioPlayer.state=${_audioPlayer.state}"); _audioPlayer.dispose(); -- libgit2 0.22.2