splash_page.dart 6.89 KB
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/core/module_cache.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<StatefulWidget> createState() {
    return _TransitionViewState();
  }
}

class _TransitionViewState extends State<TransitionView> {
  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;
    }
    int duration = max(1500 - 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 PopScope(
              canPop: false,
              onPopInvoked: (didPop) {
                Log.d('WQF isAggreementAccepted onPopInvoked didPop=$didPop');
              },
              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<void> fetchNecessaryData(String userToken,
      {Completer<void>? completer}) async {
    completer ??= Completer<void>();
    // 获取用户信息
    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 PopScope(
            canPop: false,
            onPopInvoked: (didPop) {
              Log.d('WQF fetchNecessaryData onPopInvoked didPop=$didPop');
            },
            child: AlertDialog(
              title: const Text('温馨提示'),
              content: const Text('网络异常,请检查网络后重试'),
              actions: <Widget>[
                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();
    ModuleCache.instance.init();
    await 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)),
        ),
      ),
    );
  }
}