import 'dart:io'; import 'package:EasyDartModule/EasyDartModule.dart' as edm; import 'package:ef/ef.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:flutterflow_ui/flutterflow_ui.dart'; import 'package:vbvs_app/common/color/appConstants.dart'; import 'package:vbvs_app/common/color/app_uri_status.dart'; import 'package:vbvs_app/common/util/DailyLogUtils.dart'; import 'package:vbvs_app/common/util/FitTool.dart'; import 'package:vbvs_app/common/util/MyUtils.dart'; import 'package:vbvs_app/component/tool/ClickableContainer.dart'; import 'package:vbvs_app/component/tool/CustomCard.dart'; import 'package:vbvs_app/component/tool/TopSlideNotification.dart'; import 'package:vbvs_app/controller/login/login_controller.dart'; import 'package:vbvs_app/controller/main_bottom/global_controller.dart'; import 'package:vbvs_app/controller/theme_controller/ThemeController.dart'; import 'package:vbvs_app/controller/time/countdown_controller.dart'; import 'package:vbvs_app/controller/user_info_controller.dart'; import 'package:vbvs_app/model/api_response.dart'; class OtherLoginPage extends StatefulWidget { const OtherLoginPage({super.key}); @override State createState() => _OtherLoginPageState(); } class _OtherLoginPageState extends State { GlobalController globalController = Get.find(); UserInfoController userInfoController = Get.find(); ThemeController themeController = Get.find(); CountdownController countdownController = Get.find(); LoginController loginController = Get.find(); @override Widget build(BuildContext context) { return LayoutBuilder( builder: (context, bodysize) => GestureDetector( onTap: () => FocusScope.of(context).unfocus(), child: Container( decoration: BoxDecoration( image: DecorationImage( image: AssetImage('assets/img/bgImage.png'), // 本地图片 fit: BoxFit.fill, // 填满整个 Container ), ), child: Scaffold( backgroundColor: Colors.transparent, body: SafeArea( top: true, child: Padding( padding: EdgeInsetsDirectional.fromSTEB(75.rpx, 0.rpx, 75.rpx, 0), child: Column( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( children: [ SizedBox( height: 66.rpx, ), ClickableContainer( backgroundColor: Colors.transparent, // 容器背景色 highlightColor: themeController.currentColor.sc21, // 点击时的背景色 padding: EdgeInsets.zero, // 这里去掉外部的 padding,避免影响点击范围 onTap: () { Get.back(); }, child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 16.rpx, 10.rpx, 16.rpx, 10.rpx), child: SvgPicture.asset( 'assets/img/icon/arrow_left.svg', width: 25.rpx, height: 25.rpx, // 如果 SVG 中没有固定颜色,使用 color 设置 color: themeController.currentColor.sc3, ), ), ), ], ), Expanded( child: SingleChildScrollView( child: Column( mainAxisSize: MainAxisSize.max, children: [ Align( alignment: AlignmentDirectional(-1, 0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 141.rpx, 0, 0), child: Container( width: double.infinity, decoration: BoxDecoration(), child: Align( alignment: AlignmentDirectional(0, 0), child: Text( '登录页.欢迎使用太和e护'.tr, style: FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: 'Inter', fontSize: 48.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc3, ), ), ), ), ), ), Align( alignment: AlignmentDirectional(-1, 0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 15.rpx, 0, 0), child: Container( width: double.infinity, decoration: BoxDecoration(), child: Align( alignment: AlignmentDirectional(0, 0), child: Text( '登录页.科技睡眠 洞悉万千'.tr, style: FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: 'Inter', fontSize: 30.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc3, ), ), ), ), ), ), Align( alignment: AlignmentDirectional(-1, 0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 95.rpx, 0, 0), child: Container( width: double.infinity, height: bodysize.maxHeight * 0.056, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular( AppConstants() .button_container_radius), border: Border.all( color: themeController.currentColor.sc3, width: 1.rpx, ), ), constraints: BoxConstraints( minHeight: 90.rpx, ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 35.rpx, 0, 35.rpx, 0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Container( child: Align( alignment: AlignmentDirectional(-1, 0), child: TextFormField( onChanged: (value) { loginController .model.phone = value; }, autofocus: false, obscureText: false, decoration: InputDecoration( isDense: true, labelStyle: FlutterFlowTheme .of(context) .labelMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, ), hintText: '其他手机登录页.输入内容'.tr, hintStyle: FlutterFlowTheme .of(context) .labelMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc4, ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: Color(0x00000000), width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: Color(0x00000000), width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), filled: false, fillColor: FlutterFlowTheme .of(context) .secondaryBackground, ), style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc3, ), cursorColor: FlutterFlowTheme.of( context) .primaryText, // validator: _model // .textControllerValidator // .asValidator(context), ), ), ), ), ], ), ), ), ), ), Align( alignment: AlignmentDirectional(-1, 0), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 19.rpx, 0, 0), child: Container( height: bodysize.maxHeight * 0.056, width: double.infinity, decoration: BoxDecoration( color: Colors.transparent, borderRadius: BorderRadius.circular( AppConstants() .button_container_radius), border: Border.all( color: themeController.currentColor.sc3, width: 1.rpx, ), ), constraints: BoxConstraints( minHeight: 90.rpx, ), child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 35.rpx, 0, 35.rpx, 0), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( child: Container( child: Align( alignment: AlignmentDirectional(-1, 0), child: TextFormField( onChanged: (value) { loginController.model.code = value; }, autofocus: false, obscureText: false, decoration: InputDecoration( isDense: true, labelStyle: FlutterFlowTheme .of(context) .labelMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, ), hintText: '其他手机登录页.输入验证码'.tr, hintStyle: FlutterFlowTheme .of(context) .labelMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc4, ), enabledBorder: OutlineInputBorder( borderSide: BorderSide( color: Color(0x00000000), width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), focusedBorder: OutlineInputBorder( borderSide: BorderSide( color: Color(0x00000000), width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), errorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), focusedErrorBorder: OutlineInputBorder( borderSide: BorderSide( color: FlutterFlowTheme.of( context) .error, width: 1.rpx, ), borderRadius: BorderRadius.circular( 8.rpx), ), filled: true, fillColor: Colors.transparent, ), style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, color: themeController .currentColor.sc3, ), cursorColor: FlutterFlowTheme.of( context) .primaryText, // validator: _model // .textControllerValidator // .asValidator(context), ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 26.rpx, 0, 0, 0), child: Row( mainAxisSize: MainAxisSize.max, children: [ SizedBox( height: 50.rpx, child: VerticalDivider( thickness: 2.rpx, color: themeController .currentColor.sc7, ), ), Obx(() { final CountdownController countdownController = Get.find< CountdownController>(); return InkWell( onTap: () async { try { await DailyLogUtils .writeLog( "点击获取验证码"); if (countdownController .countdown .value != 0) { return; } ApiResponse apiResponse = await loginController .getCode( context); if (apiResponse.code != HttpStatusCodes.ok) { TopSlideNotification .show( context, text: apiResponse .msg!, textColor: themeController .currentColor .sc9, ); await DailyLogUtils .writeLog( "获取验证码成功,${apiResponse}"); return; } else { TopSlideNotification .show( context, text: apiResponse .msg!, textColor: themeController .currentColor .sc2, ); await DailyLogUtils .writeLog( "获取验证码失败,${apiResponse}"); } countdownController .countdown .value == 0 ? countdownController .startCountdown( AppConstants .code_time) : null; } catch (e) { await DailyLogUtils .writeLog( "获取验证码异常,${e}"); edm.EasyDartModule .logger .info( "获取验证码异常:${e}"); } }, child: Container( alignment: Alignment.center, constraints: BoxConstraints( minWidth: 150.rpx, ), child: Text( countdownController .countdown .value == 0 ? '其他手机登录页.获取验证码'.tr : '${countdownController.countdown.value}' + "其他手机登录页.秒".tr, style: TextStyle( fontFamily: 'Readex Pro', color: themeController .currentColor.sc2, fontSize: AppConstants() .title_text_fontSize, letterSpacing: 0, ), ), ), ); }), ].divide(SizedBox(width: 26.rpx)), ), ), ], ), ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 35.rpx, 0, 0), child: CustomCard( borderRadius: AppConstants() .button_container_radius, // 圆角半径 onTap: () async { try { await DailyLogUtils.writeLog("点击登录"); bool agree = loginController.model.register_agree!; if (!agree) { TopSlideNotification.show( context, text: "登录页.未同意协议".tr, textColor: themeController.currentColor.sc9, ); } else { ApiResponse apiResponse = await loginController .login(context); if (apiResponse.code != HttpStatusCodes.ok) { TopSlideNotification.show( context, text: apiResponse.msg!, textColor: themeController .currentColor.sc9, ); } else { // 登录成功,跳转到主页面 TopSlideNotification.show( context, text: "其他手机登录页.登录成功".tr, textColor: themeController .currentColor.sc2, ); Get.offAllNamed('/homePage'); } } } catch (e) { await DailyLogUtils.writeLog("登录失败,${e}"); edm.EasyDartModule.logger .info("登录失败:${e}"); } }, colors: [ themeController.currentColor.sc1, themeController.currentColor.sc2, ], child: Container( width: bodysize.maxWidth, height: MediaQuery.sizeOf(context).height * 0.055, constraints: BoxConstraints( minWidth: 500.rpx, minHeight: 90.rpx, ), child: Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( '其他手机登录页.登录'.tr, style: FlutterFlowTheme.of(context) .bodyMedium .override( color: themeController .currentColor.sc3, fontFamily: 'Inter', fontSize: AppConstants() .normal_text_fontSize, letterSpacing: 0.0, ), ), ].divide(SizedBox( width: 17.rpx, )), ), ), ), ), Padding( padding: EdgeInsetsDirectional.fromSTEB( 25.rpx, 83.rpx, 25.rpx, 50.rpx), child: Container( width: double.infinity, decoration: BoxDecoration(), child: Row( mainAxisSize: MainAxisSize.max, crossAxisAlignment: CrossAxisAlignment.start, children: [ Theme( data: ThemeData( checkboxTheme: CheckboxThemeData( visualDensity: VisualDensity.compact, materialTapTargetSize: MaterialTapTargetSize .shrinkWrap, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(64), ), ), unselectedWidgetColor: Color(0xFFD3D3D3), ), child: Obx( () => Checkbox( value: loginController .model.register_agree ?? false, onChanged: (newValue) async { loginController.model .register_agree = newValue; loginController.updateAll(); // 获取设备信息,需要用户点击确认隐私协议与用户协议选择框时才能获取 // if (newValue == true) { // Deviceconfig // .initPlatformState(); // } }, side: BorderSide( width: 1.5, color: FlutterFlowTheme.of(context) .secondaryText, ), activeColor: stringToColor("#FF9F66"), //固定 checkColor: FlutterFlowTheme.of(context) .info, ), )), Expanded( child: Padding( padding: EdgeInsetsDirectional.fromSTEB( 0.rpx, 10.rpx, 0.rpx, 0.rpx), child: Container( width: bodysize.maxWidth, constraints: BoxConstraints( minWidth: 500.rpx, minHeight: 90.rpx, ), child: RichText( text: TextSpan( children: [ TextSpan( text: '登录页.协议1'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: themeController .currentColor.sc3, ), ), TextSpan( text: '登录页.协议2'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: stringToColor( "#FF9F66"), ), ), TextSpan( text: '登录页.协议3'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: themeController .currentColor.sc3, ), ), TextSpan( text: '登录页.协议4'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: stringToColor( "#FF9F66"), ), ), TextSpan( text: '登录页.协议5'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: themeController .currentColor.sc3, ), ), TextSpan( text: '登录页.协议6'.tr, style: FlutterFlowTheme.of( context) .bodyMedium .override( fontFamily: 'Inter', letterSpacing: 0.0, fontSize: 26.rpx, color: stringToColor( "#FF9F66"), ), ), ], ), ), ), ), ), ].divide(SizedBox(width: 18.rpx)), ), ), ), ], ), ), ), Container( width: double.infinity, height: MediaQuery.sizeOf(context).height * 0.136, constraints: BoxConstraints( minHeight: 220.rpx, ), decoration: BoxDecoration(), child: Column( mainAxisSize: MainAxisSize.max, children: [ Padding( padding: EdgeInsetsDirectional.fromSTEB( 0, 0, 0, 36.rpx), child: Text( '登录页.其他登录方式'.tr, style: FlutterFlowTheme.of(context) .bodyMedium .override( fontFamily: 'Inter', fontSize: 26.rpx, letterSpacing: 0.0, color: themeController.currentColor.sc3, ), ), ), Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 91.rpx, height: 91.rpx, clipBehavior: Clip.antiAlias, decoration: BoxDecoration( shape: BoxShape.circle, ), child: Image.asset( "assets/img/wechat.png", width: 30.rpx, height: 30.rpx, ), ), Container( width: 91.rpx, height: 91.rpx, clipBehavior: Clip.antiAlias, decoration: BoxDecoration( shape: BoxShape.circle, ), child: Image.asset( "assets/img/tel.png", width: 30.rpx, height: 30.rpx, ), ), Container( width: 91.rpx, height: 91.rpx, clipBehavior: Clip.antiAlias, decoration: BoxDecoration( shape: BoxShape.circle, ), child: Image.asset( "assets/img/google.png", width: 30.rpx, height: 30.rpx, ), ), ].divide(SizedBox(width: 35.rpx)), ), ], ), ), ], ), ), ), ), )), ); } }