routes.dart 4.76 KB
import 'dart:io';

import 'package:appframe/bloc/web_cubit.dart';
import 'package:appframe/ui/pages/adv_page.dart';
import 'package:appframe/ui/pages/im_page.dart';
import 'package:appframe/ui/pages/link_page.dart';
import 'package:appframe/ui/pages/login_main_page.dart';
import 'package:appframe/ui/pages/login_phone_page.dart';
import 'package:appframe/ui/pages/login_qr_page.dart';
import 'package:appframe/ui/pages/reload_page.dart';
import 'package:appframe/ui/pages/scan_code_page.dart';
import 'package:appframe/ui/pages/setting/account_logoff_page.dart';
import 'package:appframe/ui/pages/setting/account_page.dart';
import 'package:appframe/ui/pages/setting/account_phone_page.dart';
import 'package:appframe/ui/pages/setting/account_user_page.dart';
import 'package:appframe/ui/pages/web_page.dart';
import 'package:appframe/ui/widgets/ios_edge_swipe_detector.dart';
import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';

final GoRouter router = GoRouter(
  initialLocation: '/web',
  observers: Platform.isIOS ? [AppRouteObserver()] : [],
  routes: <RouteBase>[
    GoRoute(
      path: '/web',
      builder: (BuildContext context, GoRouterState state) {
        return const WebPage();
      },
    ),
    GoRoute(
      path: '/scanCode',
      builder: (BuildContext context, GoRouterState state) {
        return const ScanCodePage();
      },
    ),
    GoRoute(
      path: '/link',
      builder: (BuildContext context, GoRouterState state) {
        return const LinkPage();
      },
    ),
    GoRoute(
      path: '/loginMain',
      builder: (BuildContext context, GoRouterState state) {
        return const LoginMainPage();
      },
    ),
    GoRoute(
      path: '/loginPhone',
      builder: (BuildContext context, GoRouterState state) {
        return const LoginPhonePage();
      },
    ),
    GoRoute(
      path: '/loginQr',
      builder: (BuildContext context, GoRouterState state) {
        return const LoginQrPage();
      },
    ),
    GoRoute(
      path: '/account',
      builder: (BuildContext context, GoRouterState state) {
        return const AccountPage();
      },
    ),
    GoRoute(
      path: '/account/phone',
      builder: (BuildContext context, GoRouterState state) {
        return const AccountPhonePage();
      },
    ),
    GoRoute(
      path: '/account/user',
      builder: (BuildContext context, GoRouterState state) {
        return const AccountUserPage();
      },
    ),
    GoRoute(
      path: '/account/logoff',
      builder: (BuildContext context, GoRouterState state) {
        return const AccountLogoffPage();
      },
    ),
    GoRoute(
      path: '/adv',
      builder: (BuildContext context, GoRouterState state) {
        return const AdvPage();
      },
    ),
    GoRoute(
      path: '/im',
      builder: (BuildContext context, GoRouterState state) {
        return const ImPage();
      },
    ),
    GoRoute(
      path: '/reload',
      builder: (BuildContext context, GoRouterState state) {
        return const ReloadPage();
      },
    ),
  ],
);

///
/// 只针对iOS使用
///
class AppRouteObserver extends NavigatorObserver {
  @override
  void didPush(Route route, Route? previousRoute) {
    super.didPush(route, previousRoute);

    if (route.settings.name == '/web') {
      // push时,当前路由为 /web,代表 /web 路由被push进栈,展示web页面
      // 设置手势监听回调
      debugPrint("设置监听--------");
      IosEdgeSwipeDetector.onEdgeSwipe(
        () {
          WebCubitHolder.instance?.handleBack();
        },
      );
    } else if (previousRoute?.settings.name == '/web') {
      // push时,前一个路由是 /web,代表是从web页进入此页面
      // 将手势监听回调取消
      debugPrint("取消监听--------");
      IosEdgeSwipeDetector.dispose();
    }
  }

  @override
  void didPop(Route route, Route? previousRoute) {
    super.didPop(route, previousRoute);

    if (previousRoute?.settings.name == '/web') {
      // Pop时, 前一个路由是/web,代表回到web页面
      // 设置手势监听回调
      debugPrint("设置监听--------");
      IosEdgeSwipeDetector.onEdgeSwipe(
        () {
          WebCubitHolder.instance?.handleBack();
        },
      );
    }
  }

  @override
  void didRemove(Route route, Route? previousRoute) {
    super.didRemove(route, previousRoute);

    if (route.settings.name == '/web') {
      // remove时, 当前路由为 /web, 代表 /web 路由被删除,展示的不是web页面
      // 将手势监听回调取消
      debugPrint("取消监听--------");
      IosEdgeSwipeDetector.dispose();
    }
  }
}

///
/// 只针对iOS使用
///
class WebCubitHolder {
  static WebCubit? instance;

  static void register(WebCubit cubit) {
    instance = cubit;
  }

  static void unregister() {
    instance = null;
  }
}