route.dart 11.8 KB
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:wow_english/app/splash_page.dart';
import 'package:wow_english/common/pages/wow_web_page.dart';
import 'package:wow_english/generated/json/base/json_convert_content.dart';
import 'package:wow_english/models/course_unit_entity.dart';
import 'package:wow_english/models/product_entity.dart';
import 'package:wow_english/pages/games/view.dart';
import 'package:wow_english/pages/home/view.dart';
import 'package:wow_english/pages/listen/listen_page.dart';
import 'package:wow_english/pages/login/forgetpwd/forget_password_home_page.dart';
import 'package:wow_english/pages/login/loginpage/login_page.dart';
import 'package:wow_english/pages/login/setpwd/set_pwd_page.dart';
import 'package:wow_english/pages/module/course_module_page.dart';
import 'package:wow_english/pages/practice/topic_picture_page.dart';
import 'package:wow_english/pages/repeatafter/repeat_after_page.dart';
import 'package:wow_english/pages/repeataftercontent/repeat_after_content_page.dart';
import 'package:wow_english/pages/shop/exchane/exchange_lesson_page.dart';
import 'package:wow_english/pages/shop/exchangelist/exchange_lesson_list_page.dart';
import 'package:wow_english/pages/shop/home/shop_desc_page.dart';
import 'package:wow_english/pages/shop/home/shop_home_page.dart';
import 'package:wow_english/pages/user/information/user_information_page.dart';
import 'package:wow_english/pages/user/modify/modify_user_avatar_page.dart';
import 'package:wow_english/pages/user/modify/modify_user_information_page.dart';
import 'package:wow_english/pages/user/setting/setting_page.dart';
import 'package:wow_english/pages/user/user_page.dart';
import 'package:wow_english/pages/video/lookvideo/look_video_page.dart';

import '../models/course_module_entity.dart';
import '../pages/reading/reading_page.dart';
import '../pages/section/section_page.dart';
import '../pages/shopping/view.dart';
import '../pages/tab/tab_page.dart';
import '../pages/unit/view.dart';
import '../pages/user/setting/delete_account_page.dart';
import '../pages/user/setting/reback_page.dart';

class AppRouteName {
  static const String splash = 'splash';
  static const String login = 'login';
  static const String home = 'home';
  static const String games = 'games';
  static const String fogPwd = 'fogPwd';

  /// 设置密码,修改密码;不要自己调用,使用[SetPassWordPage.push]方法,隐藏这种实现
  //static const String setPwd = 'setPwd';
  static const String webView = 'webView';
  static const String courseModule = 'courseModules';
  static const String courseUnit = 'courseUnits';
  static const String courseSection = 'courseSections';
  static const String listen = 'listen';
  static const String shop = 'shop';
  static const String shopDesc = 'shopDesc';
  static const String exLesson = 'exLesson';
  static const String exList = 'exList';
  static const String reAfter = 'reAfter';
  static const String topicPic = 'topicPic';
  static const String user = 'user';
  static const String pay = 'pay';

  /// 用户详细信息页
  static const String userInformation = 'userInformation';

  /// 修改用户头像
  static const String userAvatar = 'userAvatar';

  /// 用户修改信息页,不要自己调用,使用[ModifyUserInformationPage.push]方法,隐藏这种实现
  //static const String userModifyInformation = 'userModifyInformation';
  ///看视频
  static const String lookVideo = 'lookVideo';

  ///绘本
  static const String reading = 'reading';

  ///视频跟读详情
  static const String readAfterContent = 'readAfterContent';

  ///设置
  static const String setting = 'setting';

  ///注销账号
  static const String deleteAccount = 'deleteAccount';

  ///帮助与反馈
  static const String reBack = 'reBack';

  static const String tab = '/';
}

class AppRouter {
  static final navigatorKey = GlobalKey<NavigatorState>();

  // App 根节点Context
  static BuildContext get context => navigatorKey.currentContext!;

  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case AppRouteName.splash:
        return PageRouteBuilder(
            opaque: false,
            pageBuilder: (_, __, ___) => const SplashPage(),
            transitionDuration: Duration.zero,
            transitionsBuilder: (_, __, ___, child) => child);
      case AppRouteName.login:
        // 是否默认密码登录,修改密码后跳登录页,优先密码登录体验好点
        final bool showPasswordPage = (settings.arguments as Map?)
                ?.getOrNull('showPasswordPage') as bool? ??
            false;
        return CupertinoPageRoute(
            builder: (_) =>
                LoginPage(preferencesPasswordLogin: showPasswordPage));
      case AppRouteName.home:
        return CupertinoPageRoute(builder: (_) => const HomePage());
      case AppRouteName.games:
        return CupertinoPageRoute(builder: (_) => const GamesPage());
      case AppRouteName.fogPwd:
        return CupertinoPageRoute(
            builder: (_) => const ForgetPasswordHomePage());
      case AppRouteName.courseModule:
        return CupertinoPageRoute(builder: (_) => const CourseModulePage());
      case AppRouteName.courseUnit:
        CourseModuleEntity? courseModuleEntity;
        if (settings.arguments != null) {
          courseModuleEntity = (settings.arguments as Map)
              .getOrNull('courseModuleEntity') as CourseModuleEntity;
        }
        return CupertinoPageRoute(
            builder: (_) => UnitPage(courseModuleEntity: courseModuleEntity));
      case AppRouteName.courseSection:
        CourseUnitEntity courseUnitEntity = CourseUnitEntity();
        int courseUnitDetail = 0;
        if (settings.arguments != null) {
          courseUnitEntity = (settings.arguments as Map)
              .getOrNull('courseUnitEntity') as CourseUnitEntity;
          courseUnitDetail =
              (settings.arguments as Map).getOrNull('courseUnitId');
        }
        return CupertinoPageRoute(
            builder: (_) => SectionPage(
                courseUnitEntity: courseUnitEntity,
                courseUnitId: courseUnitDetail));
      case AppRouteName.listen:
        return CupertinoPageRoute(builder: (_) => const ListenPage());
      case AppRouteName.shop:
        return CupertinoPageRoute(builder: (_) => const ShopHomePage());
      case AppRouteName.shopDesc:
        return CupertinoPageRoute(builder: (_) => const ShopDescPage());
      case AppRouteName.pay:
        var productEntity = ProductEntity();
        if (settings.arguments != null && settings.arguments is ProductEntity) {
          productEntity = settings.arguments as ProductEntity;
        }
        return CupertinoPageRoute(
            builder: (_) => ShoppingPage(productEntity: productEntity));
      case AppRouteName.exLesson:
        return CupertinoPageRoute(builder: (_) => const ExchangeLessonPage());
      case AppRouteName.exList:
        return CupertinoPageRoute(
            builder: (_) => const ExchangeLessonListPage());
      case AppRouteName.reAfter:
        return CupertinoPageRoute(builder: (_) => const RepeatAfterPage());
      case AppRouteName.user:
        return CupertinoPageRoute(builder: (_) => const UserPage());
      case AppRouteName.userInformation:
        return CupertinoPageRoute(builder: (_) => const UserInformationPage());
      case AppRouteName.userAvatar:
        var pageType = 0;
        if (settings.arguments != null) {
          final content = (settings.arguments as Map)['pageType'] as String;
          pageType = int.parse(content);
        }
        return CupertinoPageRoute(
            builder: (_) => ModifyUserAvatarPage(
                  pageType: pageType,
                ));
      /*case AppRouteName.userModifyInformation:
        return CupertinoPageRoute(builder: (_) {
          ModifyUserInformationType argument = ModifyUserInformationType.name;
          if (settings.arguments != null) {
            argument = settings.arguments as ModifyUserInformationType;
          }
          return ModifyUserInformationPage(type: argument);
        });*/
      case AppRouteName.topicPic:
        var courseLessonId = '';
        Color? moduleColor;
        if (settings.arguments != null) {
          courseLessonId =
              (settings.arguments as Map)['courseLessonId'] as String;
          moduleColor = (settings.arguments as Map)['moduleColor'] as Color?;
        }
        return CupertinoPageRoute(
            builder: (_) => TopicPicturePage(
                courseLessonId: courseLessonId, moduleColor: moduleColor));
      case AppRouteName.lookVideo:
        final videoUrl = (settings.arguments as Map)['videoUrl'] as String?;
        final title = (settings.arguments as Map)['title'] as String?;
        final courseLessonId =
            (settings.arguments as Map)['courseLessonId'] as String?;

        ///是否是课程内的视频环节,用于播放结束判断要不要再来一次以及下一环节用
        final isTopic =
            (settings.arguments as Map)['isTopic'] as bool? ?? false;
        return CupertinoPageRoute(
            builder: (_) => LookVideoPage(
                  videoUrl: videoUrl,
                  typeTitle: title,
                  courseLessonId: courseLessonId,
                  isTopic: isTopic,
                ));
      /*case AppRouteName.setPwd:
      case AppRouteName.setPwd:
                  phoneNum: phoneNum,
                  smsCode: smsCode,
                  pageType: pageType,
                ));*/
      case AppRouteName.webView:
        final urlStr = (settings.arguments as Map)['urlStr'] as String;
        final webViewTitle =
            (settings.arguments as Map)['webViewTitle'] as String;
        return CupertinoPageRoute(
            builder: (_) => WowWebViewPage(
                  urlStr: urlStr,
                  webViewTitle: webViewTitle,
                ));
      case AppRouteName.readAfterContent:
        var videoFollowReadId = '';
        if (settings.arguments != null) {
          videoFollowReadId =
              (settings.arguments as Map)['videoFollowReadId'] as String;
        }
        return CupertinoPageRoute(
            builder: (_) =>
                RepeatAfterContentPage(videoFollowReadId: videoFollowReadId));
      case AppRouteName.setting:
        return CupertinoPageRoute(builder: (_) => const SettingPage());
      case AppRouteName.deleteAccount:
        return CupertinoPageRoute(builder: (_) => const DeleteAccountPage());
      case AppRouteName.reBack:
        return CupertinoPageRoute(builder: (_) => const ReBackPage());
      case AppRouteName.tab:
        return PageRouteBuilder(
            opaque: false,
            settings: const RouteSettings(name: AppRouteName.tab),
            transitionDuration: Duration.zero,
            pageBuilder: (_, __, ___) => const TabPage(),
            transitionsBuilder: (_, __, ___, child) => child);
      case AppRouteName.reading:
        var courseLessonId = '';
        if (settings.arguments != null) {
          courseLessonId =
              (settings.arguments as Map)['courseLessonId'] as String;
        }
        return CupertinoPageRoute(
            builder: (_) => ReadingPage(courseLessonId: courseLessonId));
      default:
        return CupertinoPageRoute(
            builder: (_) => Scaffold(
                body: Center(
                    child: Text('No route defined for ${settings.name}'))));
    }
  }
}

Future pushNamed(String routeName, {Object? arguments}) {
  return Navigator.of(AppRouter.context)
      .pushNamed(routeName, arguments: arguments)
      .then((value) {
    return value;
  });
}

Future pushNamedAndRemoveUntil(String routeName, RoutePredicate predicate,
    {Object? arguments}) {
  return Navigator.of(AppRouter.context)
      .pushNamedAndRemoveUntil(routeName, predicate, arguments: arguments);
}

void popPage({dynamic data}) {
  Navigator.of(AppRouter.context).pop(data);
}