splash_page.dart 4.7 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: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/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<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;
    // 阻塞获取系统配置信息
    await AppConfigHelper.getAppConfig();
    // 调一下接口判断一下有效性再往下
    if (userEntity != null && userEntity.token != null) {
      String token = userEntity.token!;
      DateTime startTime = DateTime.now();
      try {
        userEntity = await UserDao.getUserInfo();
        Log.d('Splash在线更新, userEntity: $userEntity');
        if (userEntity != null) {
          userEntity.token = token;
          Log.d('Splash重设token, userEntity: $userEntity');
          UserUtil.saveUser(userEntity);
        }
      } catch (e) {
        e.logE();
      }
      apartInMilliseconds = DateTime.now().difference(startTime).inMilliseconds;
    }
    int duration = max(2000 - 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) {
        pushNamedAndRemoveUntil(AppRouteName.moduleSelect, (route) => false);
      } 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);
                  pushNamedAndRemoveUntil(
                      AppRouteName.moduleSelect, (route) => false);
                },
                rightTap: () {
                  // 退出应用
                  SystemNavigator.pop();
                },
              ),
            );
          },
        );
      }
    });
  }

  @override
  void initState() {
    super.initState();
    init();
  }

  void init() async {
    await SpUtil.preInit();
    startTime();
    changeDevice();
  }

  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)),
        ),
      ),
    );
  }
}