login_page.dart 11.6 KB
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:wow_english/common/extension/string_extension.dart';
import 'package:wow_english/login/blocs/login_bloc.dart';

class LoginPage extends StatelessWidget {
  const LoginPage({super.key});

  @override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (context) => LoginBloc(),
      child: _buildLoginViewWidget(),
    );
  }

  Widget _buildLoginViewWidget() => BlocBuilder<LoginBloc,LoginState> (
    builder: (context, state) {
      final bloc = BlocProvider.of<LoginBloc>(context);
      return Scaffold(
        body: SafeArea(
          child: ListView(
            children: [
              Container(
                padding: EdgeInsets.only(top: 25.h),
                child: Stack(
                  children: [
                    Positioned(
                        right: 29.w,
                        child: GestureDetector(
                          onTap: () => bloc.add(ChangeLoginTypeEvent()),
                          child: Container(
                            decoration: BoxDecoration(
                              image: DecorationImage(
                                  image: AssetImage(
                                      'login_logo'.assetPng
                                  ),
                                  fit: BoxFit.fill
                              ),
                            ),
                            padding: const EdgeInsets.symmetric(horizontal: 18.0),
                            child:  Text(
                                bloc.loginType == LoginType.sms?'密码登陆':'验证码密码'
                            ),
                          ),
                        )
                    ),
                    Center(
                      child: Column(
                        children: [
                          Image.asset(
                            'wow_logo'.assetPng,
                            height: 81.h,
                            width: 139.w,),
                          Offstage(
                            offstage: bloc.loginType == LoginType.pwd,
                            child: _buildSmsViewWidget(),
                          ),
                          Offstage(
                            offstage: bloc.loginType == LoginType.sms,
                            child: _buildPwdViewWidget(),
                          ),
                          20.verticalSpace,
                          Row(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: [
                              GestureDetector(
                                onTap: () => bloc.add(AgreementChangeEvent()),
                                child: Icon(
                                    bloc.agreement ? Icons.check_circle_outlined:Icons.circle_outlined,
                                    color:bloc.agreement ? Colors.green:Colors.black),
                              ),
                              6.horizontalSpace,
                              const Text('我已阅读并同意《用户隐私协议》,《儿童隐私策略》')
                            ],
                          ),
                          14.5.verticalSpace,
                          GestureDetector(
                            onTap: () => bloc.add(ChangeLoginTypeEvent()),
                            child: Container(
                              decoration: BoxDecoration(
                                image: DecorationImage(
                                    image: AssetImage(
                                        bloc.canLogin?'login_enter'.assetPng:'login_enter_dis'.assetPng
                                    ),
                                    fit: BoxFit.fill
                                ),
                              ),
                              padding: const EdgeInsets.symmetric(
                                  horizontal: 28.0,
                                  vertical: 14.0
                              ),
                              child:  const Text(
                                  '登录'
                              ),
                            ),
                          )
                        ],
                      ),
                    )
                  ],
                ),
              )
            ],
          ),
        ),
      );
    },
  );

  Widget _buildSmsViewWidget()=> BlocBuilder<LoginBloc,LoginState>(
      builder: (context,state){
        final bloc = BlocProvider.of<LoginBloc>(context);
        return Padding(
          padding: const EdgeInsets.symmetric(horizontal: 340),
          child: Column(
            children: [
              15.verticalSpace,
              Container(
                  height: 55,
                  width: double.infinity,
                  alignment: Alignment.center,
                  decoration: BoxDecoration(
                    image: DecorationImage(
                        image: AssetImage(
                            'Input_layer_up'.assetPng
                        ),
                      fit: BoxFit.fitHeight
                    ),
                    color: Colors.red
                  ),
                  child: TextField(
                    controller: bloc.phoneNumController,
                    textAlign: TextAlign.center,
                    textInputAction: TextInputAction.done,
                    keyboardType: TextInputType.phone,
                    decoration: const InputDecoration(
                      hintText: '请输入手机号',
                      border: InputBorder.none,
                    ),
                    onChanged: (String value) {
                      bloc.add(PhoneNumChangeEvent());
                    },
                  )
              ),
              6.5.verticalSpace,
              const Text('未注册用户登录默认注册'),
              4.5.verticalSpace,
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceBetween,
                children: [
                  Container(
                      width: 257,
                      height: 50,
                      alignment: Alignment.center,
                      decoration: BoxDecoration(
                          image: DecorationImage(
                              image: AssetImage(
                                  'Input_layer_down'.assetPng
                              )
                          )
                      ),
                      child: TextField(
                        controller: bloc.checkNumController,
                        textAlign: TextAlign.center,
                        textInputAction: TextInputAction.done,
                        keyboardType: TextInputType.number,
                        decoration: const InputDecoration(
                          hintText: '请输入验证码',
                          border: InputBorder.none,
                        ),
                        onChanged: (String value) {
                          bloc.add(CheckFieldChangeEvent());
                        },
                      )
                  ),
                  GestureDetector(
                    onTap: () {
                      if (bloc.canSendSms) {
                        bloc.add(ChangeLoginTypeEvent());
                      }
                    },
                    child: Container(
                      decoration: BoxDecoration(
                        image: DecorationImage(
                            image: AssetImage(
                                bloc.canSendSms?'securitycode'.assetPng:'securitycode_dis'.assetPng
                            ),
                            fit: BoxFit.fill
                        ),
                      ),
                      padding: const EdgeInsets.symmetric(horizontal:12.0,vertical: 15.0),
                      child:  const Text(
                          '获取验证码'
                      ),
                    ),
                  )
                ],
              )
            ],
          ),
        );
      });

  Widget _buildPwdViewWidget()=> BlocBuilder<LoginBloc,LoginState>(
      builder: (context,state){
        final bloc = BlocProvider.of<LoginBloc>(context);
        return Column(
          children: [
            15.verticalSpace,
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Image.asset(
                  'phone'.assetPng,
                  height: 45,
                  width: 35,
                ),
                10.5.horizontalSpace,
                Container(
                    height: 55,
                    width: double.infinity,
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                        image: DecorationImage(
                          image: AssetImage(
                              'Input_layer_up'.assetPng
                          ),
                          fit: BoxFit.fill,
                        )
                    ),
                    child: TextField(
                      controller: bloc.phoneNumController,
                      textAlign: TextAlign.center,
                      textInputAction: TextInputAction.done,
                      decoration: const InputDecoration(
                        hintText: '请输入手机号',
                        border: InputBorder.none,
                      ),
                      keyboardType: TextInputType.phone,
                      onChanged: (String value) {
                        bloc.add(PhoneNumChangeEvent());
                      },
                    )
                ),
                5.horizontalSpace,
                const SizedBox(
                  width: 100,
                  height: 55.0,
                )
              ],
            ),
            12.verticalSpace,
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Image.asset(
                  'lock'.assetPng,
                  height: 34,
                  width: 31,
                ),
                10.5.horizontalSpace,
                Container(
                    width: 397.5,
                    height: 55,
                    alignment: Alignment.center,
                    decoration: BoxDecoration(
                        image: DecorationImage(
                          image: AssetImage(
                              'Input_layer_down'.assetPng
                          ),
                          fit: BoxFit.fill,
                        )
                    ),
                    child: TextField(
                      controller: bloc.checkNumController,
                      textAlign: TextAlign.center,
                      textInputAction: TextInputAction.done,
                      decoration: const InputDecoration(
                        hintText: '请输入密码',
                        border: InputBorder.none,
                      ),
                      onChanged: (String value) {
                        bloc.add(CheckFieldChangeEvent());
                      },
                    )
                ),
                5.horizontalSpace,
                GestureDetector(
                  onTap: () => bloc.add(ForgetPasswordEvent()),
                  child: Container(
                    width: 100,
                    height: 55.0,
                    alignment: Alignment.centerLeft,
                    child: const Text(
                        '忘记密码 ?'
                    ),
                  ),
                )
              ],
            )
          ],
        );
      });

}