web_page.dart 6.37 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();
                                      },
                                    ),
                                  ],
                                ),
                              );
                            },
                          );
                        },
                      );
                    },
                  ),
                ],
              ),
              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);
          }
        },
      ),
    );
  }
}