Browse Source

form login

master
daivph 5 years ago
parent
commit
bb4667a2c2
5 changed files with 167 additions and 48 deletions
  1. +113
    -33
      lib/presentation/screens/login/view/login_form.dart
  2. +18
    -15
      lib/presentation/screens/login/view/login_page.dart
  3. +28
    -0
      lib/presentation/screens/login/view/widget_top_welcome.dart
  4. +7
    -0
      pubspec.lock
  5. +1
    -0
      pubspec.yaml

+ 113
- 33
lib/presentation/screens/login/view/login_form.dart View File

import 'package:farm_tpf/data/repository/authentication_repository.dart'; import 'package:farm_tpf/data/repository/authentication_repository.dart';
import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart'; import 'package:farm_tpf/presentation/custom_widgets/widget_loading.dart';
import 'package:farm_tpf/presentation/screens/login/bloc/login_bloc.dart'; import 'package:farm_tpf/presentation/screens/login/bloc/login_bloc.dart';
import 'package:farm_tpf/utils/const_color.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:formz/formz.dart'; import 'package:formz/formz.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
} }
}, },
child: Align( child: Align(
alignment: const Alignment(0, -1 / 3),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
_UsernameInput(), _UsernameInput(),
const Padding(padding: EdgeInsets.all(12)), const Padding(padding: EdgeInsets.all(12)),
_PasswordInput(), _PasswordInput(),
const Padding(padding: EdgeInsets.all(12)),
const Padding(padding: EdgeInsets.all(16)),
_LoginButton(), _LoginButton(),
const Padding(padding: EdgeInsets.all(6)),
_forgotPasswordButton(),
_registerButton()
], ],
), ),
), ),
} }
} }


Widget _forgotPasswordButton() {
return Align(
alignment: Alignment.centerRight,
child: FlatButton(
child: Text(
'Quên mật khẩu ?',
),
onPressed: () {}));
}

Widget _registerButton() {
return Align(
alignment: Alignment.bottomCenter,
child: FlatButton(
child: RichText(
text: new TextSpan(
style: new TextStyle(
fontSize: 14.0,
color: Colors.black,
),
children: <TextSpan>[
new TextSpan(text: 'Không có tài khoản? '),
new TextSpan(
text: 'Tạo mới.',
style: new TextStyle(
fontWeight: FontWeight.bold,
color: COLOR_CONST.DEFAULT)),
],
),
),
onPressed: () {}));
}

class _UsernameInput extends StatelessWidget { class _UsernameInput extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocBuilder<LoginBloc, LoginState>( return BlocBuilder<LoginBloc, LoginState>(
buildWhen: (previous, current) => previous.username != current.username, buildWhen: (previous, current) => previous.username != current.username,
builder: (context, state) { builder: (context, state) {
return TextField(
key: const Key('loginForm_usernameInput_textField'),
onChanged: (username) =>
context.bloc<LoginBloc>().add(LoginUsernameChanged(username)),
decoration: InputDecoration(
labelText: 'Tên đăng nhập',
errorText:
state.username.invalid ? 'Vui lòng nhập tên đăng nhập' : null,
),
);
return Container(
height: 50,
padding: EdgeInsets.symmetric(horizontal: 17),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10),
color: COLOR_CONST.GRAY7),
child: Center(
child: TextFormField(
onChanged: (username) => context
.bloc<LoginBloc>()
.add(LoginUsernameChanged(username)),
autovalidate: true,
validator: (_) {
return state.username.invalid
? 'Vui lòng nhập tên đăng nhập'
: null;
},
maxLines: 1,
keyboardType: TextInputType.text,
obscureText: false,
textAlign: TextAlign.left,
decoration: InputDecoration.collapsed(
hintText: 'Tên đăng nhập',
),
),
));
}, },
); );
} }
return BlocBuilder<LoginBloc, LoginState>( return BlocBuilder<LoginBloc, LoginState>(
buildWhen: (previous, current) => previous.password != current.password, buildWhen: (previous, current) => previous.password != current.password,
builder: (context, state) { builder: (context, state) {
return TextField(
key: const Key('loginForm_passwordInput_textField'),
onChanged: (password) =>
context.bloc<LoginBloc>().add(LoginPasswordChanged(password)),
obscureText: true,
decoration: InputDecoration(
labelText: 'Mật khẩu',
errorText: state.password.invalid ? 'Vui lòng nhập mật khẩu' : null,
),
);
return Container(
height: 50,
padding: EdgeInsets.symmetric(horizontal: 17),
decoration: BoxDecoration(
shape: BoxShape.rectangle,
borderRadius: BorderRadius.circular(10),
color: COLOR_CONST.GRAY7),
child: Center(
child: TextFormField(
onChanged: (password) => context
.bloc<LoginBloc>()
.add(LoginPasswordChanged(password)),
autovalidate: true,
validator: (_) {
return state.password.invalid
? 'Vui lòng nhập mật khẩu'
: null;
},
maxLines: 1,
keyboardType: TextInputType.text,
obscureText: false,
textAlign: TextAlign.left,
decoration: InputDecoration.collapsed(
hintText: 'Mật khẩu',
),
),
));
}, },
); );
} }
return BlocBuilder<LoginBloc, LoginState>( return BlocBuilder<LoginBloc, LoginState>(
buildWhen: (previous, current) => previous.status != current.status, buildWhen: (previous, current) => previous.status != current.status,
builder: (context, state) { builder: (context, state) {
return state.status.isSubmissionInProgress
? const CircularProgressIndicator()
: RaisedButton(
key: const Key('loginForm_continue_raisedButton'),
child: const Text('Đăng nhập'),
onPressed: state.status.isValidated
? () {
context.bloc<LoginBloc>().add(const LoginSubmitted());
}
: null,
);
return SizedBox(
width: double.infinity,
height: 55,
child: FlatButton(
onPressed: () {
if (state.status.isValidated) {
context.bloc<LoginBloc>().add(const LoginSubmitted());
}
},
color: state.status.isValidated
? COLOR_CONST.DEFAULT
: COLOR_CONST.GRAY1_50,
shape: RoundedRectangleBorder(
borderRadius: new BorderRadius.circular(7.0),
),
child: Text(
'Đăng nhập'.toUpperCase(),
),
),
);
}, },
); );
} }

+ 18
- 15
lib/presentation/screens/login/view/login_page.dart View File

import 'package:farm_tpf/presentation/screens/login/bloc/login_bloc.dart'; import 'package:farm_tpf/presentation/screens/login/bloc/login_bloc.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:keyboard_dismisser/keyboard_dismisser.dart';


import 'login_form.dart'; import 'login_form.dart';
import 'widget_top_welcome.dart';


class LoginPage extends StatelessWidget { class LoginPage extends StatelessWidget {
static Route route() { static Route route() {
} }


@override @override
Widget build(BuildContext context) {
return Scaffold(
body: Padding(
padding: const EdgeInsets.all(12),
child: BlocProvider(
create: (context) {
return LoginBloc(
authenticationRepository:
RepositoryProvider.of<AuthenticationRepository>(context),
);
},
child: LoginForm(),
Widget build(BuildContext context) => KeyboardDismisser(
child: Scaffold(
body: Padding(
padding: const EdgeInsets.all(12),
child: BlocProvider(
create: (context) {
return LoginBloc(
authenticationRepository:
RepositoryProvider.of<AuthenticationRepository>(context),
);
},
child: ListView(
children: <Widget>[WidgetTopWelcome(), LoginForm()],
),
),
), ),
),
);
}
));
} }

+ 28
- 0
lib/presentation/screens/login/view/widget_top_welcome.dart View File

import 'package:flutter/material.dart';

class WidgetTopWelcome extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
SizedBox(
height: 41,
),
SizedBox(
width: 172,
child: FlutterLogo(
size: 170,
),
),
SizedBox(
height: 40,
),
Text("Ứng dụng"),
Text("Mô tả chi tiết ứng dụng"),
SizedBox(
height: 30,
)
],
);
}
}

+ 7
- 0
pubspec.lock View File

url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.3.0" version: "3.3.0"
keyboard_dismisser:
dependency: "direct main"
description:
name: keyboard_dismisser
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
logging: logging:
dependency: transitive dependency: transitive
description: description:

+ 1
- 0
pubspec.yaml View File

equatable: ^1.2.0 equatable: ^1.2.0
dio: 3.0.9 dio: 3.0.9
formz: ^0.3.0 formz: ^0.3.0
keyboard_dismisser: ^1.0.2


dev_dependencies: dev_dependencies:
flutter_test: flutter_test:

Loading…
Cancel
Save