import 'dart:async'; import 'dart:io'; import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:limiting_direction_csx/limiting_direction_csx.dart'; import 'package:umeng_common_sdk/umeng_common_sdk.dart'; import 'package:wow_english/common/core/app_config_helper.dart'; import 'package:wow_english/common/core/user_util.dart'; import 'package:wow_english/common/extension/string_extension.dart'; import 'package:wow_english/common/request/config.dart'; import 'package:wow_english/common/request/dao/user_dao.dart'; import 'package:wow_english/models/user_entity.dart'; import 'package:wow_english/route/route.dart'; import 'package:wow_english/utils/audio_player_util.dart'; import 'package:wow_english/utils/log_util.dart'; import 'package:wow_english/utils/sp_util.dart'; import '../common/core/app_consts.dart'; import '../common/widgets/webview_dialog.dart'; class SplashPage extends StatelessWidget { const SplashPage({super.key}); @override Widget build(BuildContext context) { return const TransitionView(); } } class TransitionView extends StatefulWidget { const TransitionView({super.key}); @override State createState() { return _TransitionViewState(); } } class _TransitionViewState extends State { Future startTime() async { // 判断是否登录 UserEntity? userEntity = UserUtil.getUser(); Log.d('当前模式:kDebugMode=$kDebugMode, kProfileMode=$kProfileMode, kReleaseMode=$kReleaseMode'); Log.d('当前API地址:${RequestConfig.baseUrl}'); //BuildContext context = Navigator.of(context).context; //var currentPageName = ModalRoute.of(Navigator.of(AppRouter.context))?.settings.name; //Log.d('Splash读当前页面:$currentPageName'); Log.d('Splash读本地, userEntity: $userEntity'); int apartInMilliseconds = 0; // 获取系统配置信息 AppConfigHelper.getAppConfig(); // 调一下接口判断一下有效性再往下 if (userEntity != null && userEntity.token != null) { String token = userEntity.token!; DateTime startTime = DateTime.now(); await fetchNecessaryData(token); apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds; } /// 开屏最低2.5s,保证视觉与音乐同步 int duration = max(2500 - apartInMilliseconds, 0); Log.d('Splash getUserInfo 耗时:${apartInMilliseconds}ms, 最终duration=$duration'); Timer(Duration(milliseconds: duration), () { /*if (userEntity != null) { pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } else { pushNamedAndRemoveUntil(AppRouteName.login, (route) => false); }*/ bool isAggreementAccepted = AppConfigHelper.getAgreementAccepted(); if (isAggreementAccepted) { _initData(); } else { showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return WillPopScope( onWillPop: () => Future.value(false), child: WebviewDialog( title: "服务条款及隐私政策", webUrl: AppConsts.userPrivacyPolicyUrl, leftTap: () { AppConfigHelper.saveAgreementAccepted(true); _initData(); }, rightTap: () { // 退出应用 AppConfigHelper.exitApp(); }, ), ); }, ); } }); } ///初始化数据 void _initData() { UmengCommonSdk.initCommon("663b66b0b3362515012f4ea5", "663b66ecf32cc41105ae74b7", "official"); pushNamedAndRemoveUntil(AppRouteName.home, (route) => false); } Future fetchNecessaryData(String userToken, {Completer? completer}) async { completer ??= Completer(); // 获取用户信息 try { UserEntity? userEntity = await UserDao.getUserInfo(); Log.d('Splash在线更新, userEntity: $userEntity'); if (userEntity != null) { userEntity.token = userToken; Log.d('Splash重设token, userEntity: $userEntity'); UserUtil.saveUser(userEntity); } //todo 如果为null是否需要清除用户信息? completer.complete(); } catch (e) { debugPrint('Splash获取用户信息异常:$e'); //异常的话弹窗提示重试 showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return WillPopScope( onWillPop: () => Future.value(false), child: AlertDialog( title: const Text('温馨提示'), content: const Text('网络异常,请检查网络后重试'), actions: [ TextButton( child: const Text('退出'), onPressed: () => { // 关闭对话框并重试 Navigator.of(context).pop(), AppConfigHelper.exitApp(), completer?.complete(), }), TextButton( child: const Text('重试'), onPressed: () async { // 关闭对话框并重试 Navigator.of(context).pop(); await fetchNecessaryData(userToken, completer: completer); completer?.complete(); }, ), ], ), ); }, ); e.logE(); } // 等待completer完成,这会阻塞后续代码的执行,直到用户做出选择 await completer.future; } @override void initState() { super.initState(); init(); } void init() async { changeDevice(); await SpUtil.preInit(); AudioPlayerUtil.getInstance().playAudio(AudioPlayerUtilType.welcomeToWow); startTime(); } void changeDevice() async { ///设置设备默认方向 WidgetsFlutterBinding.ensureInitialized(); if (Platform.isIOS) { await LimitingDirectionCsx.setScreenDirection(DeviceDirectionMask.Landscape); } else { await SystemChrome.setPreferredOrientations([DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight]); } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage( 'splash'.assetGif, ), fit: BoxFit.fill)), ), ), ); } }