together_mobile/lib/screens/signin_signup/components/username_signin.dart

169 lines
4.6 KiB
Dart
Raw Normal View History

2023-06-21 17:44:28 +08:00
import 'package:flutter/material.dart';
import 'package:cherry_toast/cherry_toast.dart';
import 'package:go_router/go_router.dart';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
2023-09-10 11:30:20 +08:00
import 'package:together_mobile/database/hive_database.dart';
import 'package:together_mobile/models/token_model.dart';
import '../../../components/common_widgets.dart';
2023-06-21 17:44:28 +08:00
import 'package:together_mobile/common/constants.dart';
2023-07-04 11:51:11 +08:00
import 'package:together_mobile/request/signup_signin.dart';
import 'package:together_mobile/models/init_get_it.dart';
import 'package:together_mobile/models/user_model.dart';
2023-06-21 17:44:28 +08:00
class UsernameSigninBody extends StatefulWidget {
const UsernameSigninBody({super.key});
@override
State<UsernameSigninBody> createState() => _UsernameSigninBodyState();
}
class _UsernameSigninBodyState extends State<UsernameSigninBody> {
2023-07-04 11:51:11 +08:00
bool _isProgressShow = false;
bool _isHttpSend = false;
2023-06-21 17:44:28 +08:00
final TextEditingController usernameController = TextEditingController();
final TextEditingController passwordController = TextEditingController();
final Map<String, bool> _isError = {
'username': false,
'password': false,
};
2023-08-27 19:14:37 +08:00
@override
void dispose() {
usernameController.dispose();
passwordController.dispose();
super.dispose();
}
2023-06-21 17:44:28 +08:00
void _isInputError(String type, bool error) {
setState(() {
_isError[type] = error;
});
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
// Stack(
// alignment: Alignment.center,
// children: [
// const SizedBox(
// width: double.infinity,
// height: 100,
// ),
// if (_isProgressShow)
// const CircularProgressIndicator(
// color: kPrimaryColor,
// strokeWidth: 6.0,
// ),
// ],
// ),
const SizedBox(
width: double.infinity,
height: 100,
2023-06-21 17:44:28 +08:00
),
SizedBox(
width: 250,
child: SignTextField(
labelText: '用户名',
type: 'username',
2023-07-04 11:51:11 +08:00
isSignup: false,
2023-06-21 17:44:28 +08:00
controller: usernameController,
isError: _isInputError,
),
),
const SizedBox(
width: double.infinity,
height: kDefaultPadding,
),
SizedBox(
width: 250,
child: SignTextField(
obscureText: true,
labelText: '密码',
2023-07-04 11:51:11 +08:00
isSignup: false,
2023-06-21 17:44:28 +08:00
type: 'password',
controller: passwordController,
isError: _isInputError,
),
),
const SizedBox(
height: kDefaultPadding,
width: double.infinity,
),
CommonElevatedButton(
2023-06-21 17:44:28 +08:00
onPressed: () {
2023-07-04 11:51:11 +08:00
_signin(context);
2023-06-21 17:44:28 +08:00
},
2023-07-04 11:51:11 +08:00
text: '登录',
2023-06-21 17:44:28 +08:00
),
],
);
}
2023-07-04 11:51:11 +08:00
void _signin(BuildContext context) async {
if (_isError['username']! || _isError['password']!) {
CherryToast.error(
title: const Text('账号或密码不符合规范'),
toastDuration: const Duration(seconds: 2),
animationDuration: const Duration(seconds: 1),
).show(context);
return;
}
setState(() {
if (!_isProgressShow) _isProgressShow = true;
});
EasyLoading.showInfo('正在登录中......');
late Map<String, dynamic> result;
2023-07-04 11:51:11 +08:00
if (_isProgressShow && !_isHttpSend) {
_isHttpSend = true;
try {
result = await signinByUsername(
usernameController.text,
passwordController.text,
);
} catch (e) {
EasyLoading.showError('连接服务器失败,请稍后重试...');
return;
} finally {
setState(() {
_isHttpSend = false;
_isProgressShow = false;
});
}
2023-07-04 11:51:11 +08:00
}
2023-07-04 11:51:11 +08:00
if (result['code'] == 10200) {
2023-07-27 18:17:52 +08:00
getIt<UserAccount>().init(result['data']);
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidDeviceInfo = await deviceInfo.androidInfo;
Map<String, dynamic> res =
await createToken(getIt.get<UserAccount>().id, androidDeviceInfo.id);
2023-07-27 18:17:52 +08:00
getIt.get<Token>().init();
getIt.get<Token>().updateToken(res['token']);
2023-09-10 11:30:20 +08:00
await HiveDatabase.init();
EasyLoading.dismiss();
2023-07-04 11:51:11 +08:00
// ignore: use_build_context_synchronously
context.go('/chat');
} else {
// ignore: use_build_context_synchronously
CherryToast.error(title: const Text('用户名或密码错误')).show(context);
}
2023-06-21 17:44:28 +08:00
}
}