Commit 9e14f47ab961376d1058a8f1c814a8570da91ae0

Authored by 吴启风
1 parent 4f9b0fa4

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

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 &#39;package:audioplayers/audioplayers.dart&#39;; @@ -2,6 +2,7 @@ import &#39;package:audioplayers/audioplayers.dart&#39;;
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();