routes.dart 4.01 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_page.dart';
import 'package:appframe/ui/pages/setting/account_phone_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: '/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);

    debugPrint("前一个路由:${previousRoute?.settings.name} 新路由:${route.settings.name}");
    debugPrint("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");

    if (previousRoute?.settings.name == '/web') {
      // 前一个路由是web,代表是从web路由中push到此路由
      // 清空手势监听回调
      debugPrint("取消监听--------");
      IosEdgeSwipeDetector.dispose();
    }
  }

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

    debugPrint("前一个路由:${previousRoute?.settings.name} 新路由:${route.settings.name}");
    debugPrint("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");

    if (previousRoute?.settings.name == '/web') {
      // 前一个路由是web,代表会到web
      WebCubitHolder.instance?.test();

      if (WebCubitHolder.instance != null) {
        // 设置手势监听回调
        debugPrint("设置监听--------");
        IosEdgeSwipeDetector.onEdgeSwipe(WebCubitHolder.instance!.handleBack);
      }
    }
  }
}

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

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

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