web_page.dart 9.88 KB
import 'package:appframe/bloc/web_cubit.dart';
import 'package:appframe/config/constant.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 StatelessWidget {
  const WebPage({super.key});

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

    var ip = extraData?['ip'] ?? Constant.localServerHost;
    var sessionCode = extraData?['sessionCode'];
    var userCode = extraData?['userCode'];
    var classCode = extraData?['classCode'];
    var userType = extraData?['userType'];
    var stuId = extraData?['stuId'];

    if (sessionCode == null || sessionCode == '') {
      var sharedPreferences = getIt.get<SharedPreferences>();
      sessionCode = sharedPreferences.getString('auth_sessionCode');
      userCode = sharedPreferences.getString('auth_userCode');
      classCode = sharedPreferences.getString('auth_classCode');
      userType = sharedPreferences.getInt('auth_userType');
      stuId = sharedPreferences.getString('auth_stuId');
      ip = sharedPreferences.getString('auth_ip');
    }

    return BlocProvider(
      create: (context) => WebCubit(
        WebState(
          ip: ip,
          sessionCode: sessionCode,
          userCode: userCode,
          classCode: classCode,
          userType: userType,
          stuId: stuId,
        ),
      ),
      child: BlocConsumer<WebCubit, WebState>(
        builder: (ctx, state) {
          return PopScope(
            canPop: false,
            onPopInvokedWithResult: (didPop, result) {
              ctx.read<WebCubit>().handleBack();
            },
            child: Scaffold(
              appBar: AppBar(
                title: Text(state.title),
                centerTitle: true,
                automaticallyImplyLeading: false,
                leading: state.beBack
                    ? IconButton(
                        icon: const Icon(Icons.arrow_back),
                        onPressed: () {
                          ctx.read<WebCubit>().handleBack();
                        },
                      )
                    : null,
                // actions: [
                //   Builder(
                //     builder: (BuildContext context) {
                //       return IconButton(
                //         icon: const Icon(Icons.more_vert),
                //         onPressed: () {
                //           showModalBottomSheet(
                //             context: context,
                //             builder: (BuildContext context) {
                //               return SizedBox(
                //                 height: 300,
                //                 child: Column(
                //                   children: [
                //                     ListTile(
                //                       leading: const Icon(Icons.chat_outlined),
                //                       title: const Text('微信授权'),
                //                       onTap: () {
                //                         Navigator.pop(context);
                //                         ctx.read<WebCubit>().goWechatAuth();
                //                       },
                //                     ),
                //                     ListTile(
                //                       leading: const Icon(Icons.accessibility_new),
                //                       title: const Text('身份认证'),
                //                       onTap: () {
                //                         Navigator.pop(context);
                //                         ctx.read<WebCubit>().goAuth();
                //                       },
                //                     ),
                //                     ListTile(
                //                       leading: const Icon(Icons.app_blocking_sharp),
                //                       title: const Text('打开小程序'),
                //                       onTap: () {
                //                         Navigator.pop(context);
                //                         ctx.read<WebCubit>().goMiniProgram();
                //                       },
                //                     ),
                //                     ListTile(
                //                       leading: const Icon(Icons.refresh),
                //                       title: const Text('刷新'),
                //                       onTap: () {
                //                         Navigator.pop(context);
                //                         ctx.read<WebCubit>().refresh();
                //                       },
                //                     ),
                //                     ListTile(
                //                       leading: const Icon(Icons.cleaning_services),
                //                       title: const Text('清理缓存'),
                //                       onTap: () {
                //                         Navigator.pop(context);
                //                         ctx.read<WebCubit>().clearStorage();
                //                       },
                //                     ),
                //                   ],
                //                 ),
                //               );
                //             },
                //           );
                //         },
                //       );
                //     },
                //   ),
                // ],
              ),
              endDrawer: Drawer(
                  width: MediaQuery.of(ctx).size.width * 0.8,
                  child: ListView(padding: EdgeInsets.zero, children: [
                    // DrawerHeader(
                    //     decoration: BoxDecoration(
                    //       color: Theme.of(ctx).colorScheme.primary,
                    //     ),
                    //     child: Text('设置',
                    //         style: TextStyle(
                    //           color: Theme.of(ctx).colorScheme.onPrimary,
                    //           fontSize: 24,
                    //         ))),
                    ListTile(
                      tileColor: Theme.of(ctx).colorScheme.primary,
                      title: Text('设置',
                          style: TextStyle(
                            color: Theme.of(ctx).colorScheme.onPrimary,
                            fontSize: 24,
                          )
                      ),
                    ),
                    ListTile(
                      leading: const Icon(Icons.login),
                      title: const Text('登录界面'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().goLogin();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.chat_outlined),
                      title: const Text('微信授权'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().goWechatAuth();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.accessibility_new),
                      title: const Text('身份认证'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().goAuth();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.app_blocking_sharp),
                      title: const Text('打开小程序'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().goMiniProgram();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.refresh),
                      title: const Text('刷新'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().refresh();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.cleaning_services),
                      title: const Text('清理缓存'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().clearStorage();
                      },
                    ),
                  ])),
              body: state.loaded
                  ? SizedBox(
                      height: MediaQuery.of(ctx).size.height - 120, // 减去100像素留空
                      child: WebViewWidget(controller: ctx.read<WebCubit>().controller),
                    )
                  : const Center(child: CircularProgressIndicator()),
            ),
          );
        },
        listener: (context, state) {
          if (state.orientationCmdFlag) {
            context.read<WebCubit>().getOrientation(context);
          } else if (state.windowInfoCmdFlag) {
            context.read<WebCubit>().getWindowInfo(context);
          } else if (state.chooseImageCmdFlag) {
            context.read<WebCubit>().chooseImage(context);
          } else if (state.chooseVideoCmdFlag) {
            context.read<WebCubit>().chooseVideo(context);
          }
        },
      ),
    );
  }
}

class LoginMainState {
  final bool loaded;
  final bool orientationCmdFlag;
  final bool windowInfoCmdFlag;
  final bool chooseImageCmdFlag;
  final bool chooseVideoCmdFlag;

  LoginMainState({
    required this.loaded,
    required this.orientationCmdFlag,
    required this.windowInfoCmdFlag,
    required this.chooseImageCmdFlag,
    required this.chooseVideoCmdFlag,
  });
}