web_page.dart 9.17 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, style: TextStyle(color: Color(state.titleColor), fontSize: 18)),
                centerTitle: true,
                automaticallyImplyLeading: false,
                backgroundColor: Color(state.bgColor),
                actionsIconTheme: IconThemeData(color: Colors.white),
                // leading: state.beBack
                //     ? IconButton(
                //         icon: const Icon(Icons.arrow_back, color: Colors.white),
                //         onPressed: () {
                //           ctx.read<WebCubit>().handleBack();
                //         },
                //       )
                //     : null,
                leading: state.opIcon == 'back'
                    ? IconButton(
                        icon: const Icon(Icons.arrow_back, color: Colors.white),
                        onPressed: () {
                          ctx.read<WebCubit>().handleBack();
                        },
                      )
                    : (state.opIcon == 'home'
                        ? IconButton(
                            icon: const Icon(Icons.home, color: Colors.white),
                            onPressed: () {
                              ctx.read<WebCubit>().handleHome();
                            },
                          )
                        : null),
              ),
              endDrawer: Drawer(
                  width: MediaQuery.of(ctx).size.width * 0.8,
                  child: ListView(padding: EdgeInsets.zero, children: [
                    DrawerHeader(
                        decoration: BoxDecoration(
                          color: Color(0xFF7691FA),
                        ),
                        child: Text('设置',
                            style: TextStyle(
                              // color: Theme.of(ctx).colorScheme.onPrimary,
                              fontSize: 24,
                              color: Colors.white,
                            ))),
                    /*ListTile(
                      tileColor: Color(0xFF7691FA),
                      title: Text('设置',
                          style: TextStyle(
                            color: Theme.of(ctx).colorScheme.onPrimary,
                            fontSize: 24,
                          )),
                    ),*/
                    ListTile(
                      leading: const Icon(Icons.chat_bubble_outline),
                      title: const Text('消息测试'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().goIm();
                      },
                    ),
                    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();
                        ctx.read<WebCubit>().handleRefreshPage();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.cleaning_services),
                      title: const Text('清理缓存'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().clearStorage();
                      },
                    ),
                    ListTile(
                      leading: const Icon(Icons.logout),
                      title: const Text('退出登录'),
                      onTap: () {
                        Navigator.pop(ctx);
                        ctx.read<WebCubit>().logout();
                      },
                    ),
                  ])),
              body: state.loaded
                  ? SizedBox(
                      height: MediaQuery.of(ctx).size.height - 60, // 减去100像素留空
                      child: WebViewWidget(controller: ctx.read<WebCubit>().controller),
                    )
                  : const Center(child: CircularProgressIndicator()),
              bottomNavigationBar: state.showBottomNavBar
                  ? BottomNavigationBar(
                      type: BottomNavigationBarType.fixed,
                      currentIndex: state.selectedIndex,
                      selectedItemColor: Color(0xFF7691fa),
                      unselectedItemColor: Color(0xFF969799),
                      onTap: (index) {
                        // 更新选中索引
                        ctx.read<WebCubit>().updateSelectedIndex(index);
                        // 根据 index 执行相应的操作
                      },
                      items: const [
                        BottomNavigationBarItem(
                          icon: Icon(Icons.home, size: 32),
                          label: '我的班级',
                        ),
                        BottomNavigationBarItem(
                          icon: Icon(Icons.contact_page, size: 32),
                          label: '通讯录',
                        ),
                        BottomNavigationBarItem(
                          icon: Icon(Icons.find_in_page, size: 32),
                          label: '发现',
                        ),
                        BottomNavigationBarItem(
                          icon: Icon(Icons.person, size: 32),
                          label: '我的',
                        ),
                      ],
                    )
                  : null,
            ),
          );
        },
        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);
          }
        },
      ),
    );
  }
}