web_page.dart 8.09 KB
import 'dart:convert';

import 'package:appframe/bloc/web_cubit.dart';
import 'package:appframe/config/locator.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:webview_flutter/webview_flutter.dart';

class WebPage extends StatefulWidget {
  const WebPage({super.key});

  @override
  State<WebPage> createState() => _WebPageState();
}

class _WebPageState extends State<WebPage> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addObserver(this);
  }

  @override
  void dispose() {
    WidgetsBinding.instance.removeObserver(this);
    super.dispose();
  }

  Orientation? _lastOrientation;

  /// 用于监听处理屏幕方向变化
  @override
  Future<void> didChangeMetrics() async {
    print('didChangeMetrics------------------------------->');
    final mediaQuery = MediaQuery.of(context);
    // 方向
    final orientation = mediaQuery.orientation;
    if (orientation != _lastOrientation) {
      _lastOrientation = orientation;
      await getIt.get<SharedPreferences>().setString(
        'orientation',
        orientation == Orientation.portrait ? "portrait" : "landscape",
      );

      final viewPadding = mediaQuery.viewPadding;
      final size = mediaQuery.size;
      final safeArea = mediaQuery.padding;
      final devicePixelRatio = mediaQuery.devicePixelRatio;

      // 计算安全区域坐标
      final safeAreaLeft = safeArea.left;
      final safeAreaRight = size.width - safeArea.right;
      final safeAreaTop = safeArea.top;
      final safeAreaBottom = size.height - safeArea.bottom;
      final safeAreaWidth = size.width - safeArea.horizontal;
      final safeAreaHeight = size.height - safeArea.vertical;

      final windowInfo = {
        'pixelRatio': devicePixelRatio,
        'screenWidth': size.width * devicePixelRatio,
        'screenHeight': size.height * devicePixelRatio,
        'windowWidth': size.width,
        'windowHeight': size.height,
        'statusBarHeight': viewPadding.top,
        'screenTop': 0, // Flutter中通常不使用此值,设为0
        'safeArea': {
          'left': safeAreaLeft,
          'right': safeAreaRight,
          'top': safeAreaTop,
          'bottom': safeAreaBottom,
          'width': safeAreaWidth,
          'height': safeAreaHeight,
        },
      };
      await getIt.get<SharedPreferences>().setString('windowInfo', jsonEncode(windowInfo));
    }
  }

  @override
  Widget build(BuildContext context) {
    final Map<String, dynamic>? extraData = GoRouterState.of(context).extra as Map<String, dynamic>?;

    var ip = extraData?['ip'] ?? '127.0.0.1';
    var sessionCode = extraData?['sessionCode'];
    var userCode = extraData?['userCode'];
    var classCode = extraData?['classCode'];
    var userType = extraData?['userType'];
    var stuId = extraData?['stuId'];

    return BlocProvider(
      create: (context) => WebCubit(
        WebState(
          ip: ip,
          sessionCode: sessionCode,
          userCode: userCode,
          classCode: classCode,
          userType: userType,
          stuId: stuId,
        ),
      ),
      child: BlocConsumer<WebCubit, WebState>(
        builder: (context, state) {
          return PopScope(
            canPop: false,
            onPopInvokedWithResult: (didPop, result) {
              context.read<WebCubit>().handleBack();
            },
            child: Scaffold(
              appBar: AppBar(title: Text(state.title)),
              body: state.loaded
                  ? SizedBox(
                      height: MediaQuery.of(context).size.height - 120, // 减去100像素留空
                      child: WebViewWidget(controller: context.read<WebCubit>().controller),
                    )
                  : const Center(child: CircularProgressIndicator()),
              // 用于测试一下点击跳转路由
              floatingActionButton: Column(
                mainAxisAlignment: MainAxisAlignment.end,
                children: [
                  FloatingActionButton(
                    heroTag: "btn1",
                    onPressed: () {
                      context.read<WebCubit>().goWechatAuth();
                    },
                    child: const Icon(Icons.chat_outlined),
                  ),
                  const SizedBox(height: 16),
                  FloatingActionButton(
                    heroTag: "btn2",
                    onPressed: () {
                      context.read<WebCubit>().goAuth();
                    },
                    child: const Icon(Icons.accessibility_new),
                  ),
                  const SizedBox(height: 16),
                  FloatingActionButton(
                    heroTag: "btn3",
                    onPressed: () {
                      context.read<WebCubit>().goMiniProgram();
                    },
                    child: const Icon(Icons.app_blocking_sharp),
                  ),
                ],
              ),
            ),
          );
        },
        listener: (context, state) {
          if (!state.recorderIsInit) {}
        },
      ),
    );
  }
}

// class WebPage extends StatelessWidget {
//   const WebPage({super.key});
//
//   @override
//   Widget build(BuildContext context) {
//     final Map<String, dynamic>? extraData = GoRouterState.of(context).extra as Map<String, dynamic>?;
//
//     var ip = extraData?['ip'] ?? '127.0.0.1';
//     var sessionCode = extraData?['sessionCode'];
//     var userCode = extraData?['userCode'];
//     var classCode = extraData?['classCode'];
//     var userType = extraData?['userType'];
//     var stuId = extraData?['stuId'];
//
//     return BlocProvider(
//       create: (context) => WebCubit(
//         WebState(
//           ip: ip,
//           sessionCode: sessionCode,
//           userCode: userCode,
//           classCode: classCode,
//           userType: userType,
//           stuId: stuId,
//         ),
//       ),
//       child: BlocConsumer<WebCubit, WebState>(
//         builder: (context, state) {
//           return PopScope(
//             canPop: false,
//             onPopInvokedWithResult: (didPop, result) {
//               context.read<WebCubit>().handleBack();
//             },
//             child: Scaffold(
//               appBar: AppBar(title: Text(state.title)),
//               body: state.loaded
//                   ? SizedBox(
//                       height: MediaQuery.of(context).size.height - 120, // 减去100像素留空
//                       child: WebViewWidget(controller: context.read<WebCubit>().controller),
//                     )
//                   : const Center(child: CircularProgressIndicator()),
//               // 用于测试一下点击跳转路由
//               floatingActionButton: Column(
//                 mainAxisAlignment: MainAxisAlignment.end,
//                 children: [
//                   FloatingActionButton(
//                     heroTag: "btn1",
//                     onPressed: () {
//                       context.read<WebCubit>().goWechatAuth();
//                     },
//                     child: const Icon(Icons.chat_outlined),
//                   ),
//                   const SizedBox(height: 16),
//                   FloatingActionButton(
//                     heroTag: "btn2",
//                     onPressed: () {
//                       context.read<WebCubit>().goAuth();
//                     },
//                     child: const Icon(Icons.accessibility_new),
//                   ),
//                   const SizedBox(height: 16),
//                   FloatingActionButton(
//                     heroTag: "btn3",
//                     onPressed: () {
//                       context.read<WebCubit>().goMiniProgram();
//                     },
//                     child: const Icon(Icons.app_blocking_sharp),
//                   ),
//                 ],
//               ),
//             ),
//           );
//         },
//         listener: (context, state) {
//           if(!state.recorderIsInit) {
//
//           }
//         },
//       ),
//     );
//   }
//
//
// }