parent
baf8af8c43
commit
f69decf4ae
@ -0,0 +1,10 @@
|
|||||||
|
part of 'sars_api.dart';
|
||||||
|
|
||||||
|
class _ProfileApi {
|
||||||
|
_MyHouse house = _MyHouse();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _MyHouse {
|
||||||
|
///查询所有我的房屋
|
||||||
|
String get userHouse => '/app/user/myEstate/findAllMyEstate';
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
|
part 'my_house_model.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
|
class MyHouseModel {
|
||||||
|
final int id;
|
||||||
|
final String addressName;
|
||||||
|
final String communityName;
|
||||||
|
final String buildingName;
|
||||||
|
final String estateName;
|
||||||
|
final String unitName;
|
||||||
|
final String manageEstateTypeName;
|
||||||
|
final int identity;
|
||||||
|
final String name;
|
||||||
|
final String tel;
|
||||||
|
final String isDefault;
|
||||||
|
factory MyHouseModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$MyHouseModelFromJson(json);
|
||||||
|
|
||||||
|
const MyHouseModel({
|
||||||
|
required this.id,
|
||||||
|
required this.addressName,
|
||||||
|
required this.communityName,
|
||||||
|
required this.buildingName,
|
||||||
|
required this.estateName,
|
||||||
|
required this.unitName,
|
||||||
|
required this.manageEstateTypeName,
|
||||||
|
required this.identity,
|
||||||
|
required this.name,
|
||||||
|
required this.tel,
|
||||||
|
required this.isDefault,
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'my_house_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
MyHouseModel _$MyHouseModelFromJson(Map<String, dynamic> json) => MyHouseModel(
|
||||||
|
id: json['id'] as int,
|
||||||
|
addressName: json['addressName'] as String,
|
||||||
|
communityName: json['communityName'] as String,
|
||||||
|
buildingName: json['buildingName'] as String,
|
||||||
|
estateName: json['estateName'] as String,
|
||||||
|
unitName: json['unitName'] as String,
|
||||||
|
manageEstateTypeName: json['manageEstateTypeName'] as String,
|
||||||
|
identity: json['identity'] as int,
|
||||||
|
name: json['name'] as String,
|
||||||
|
tel: json['tel'] as String,
|
||||||
|
isDefault: json['isDefault'] as String,
|
||||||
|
);
|
@ -1,47 +1,48 @@
|
|||||||
import 'package:aku_new_community/model/common/img_model.dart';
|
import 'package:aku_new_community/model/common/img_model.dart';
|
||||||
import 'package:flustars/flustars.dart';
|
|
||||||
import 'package:json_annotation/json_annotation.dart';
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
part 'user_info_model.g.dart';
|
part 'user_info_model.g.dart';
|
||||||
|
|
||||||
@JsonSerializable()
|
@JsonSerializable()
|
||||||
class UserInfoModel {
|
class UserInfoModel {
|
||||||
int id;
|
final int id;
|
||||||
List<ImgModel> imgUrls;
|
final int communityId;
|
||||||
String? name;
|
final String? name;
|
||||||
String nickName;
|
final String tel;
|
||||||
String tel;
|
final List<ImgModel> imgUrls;
|
||||||
|
|
||||||
/// 性别 1.男 2.女
|
/// 性别 1.男 2.女 3.保密
|
||||||
int? sex;
|
final int? sex;
|
||||||
String? birthday;
|
final String? nickName;
|
||||||
|
final bool isExistPassword;
|
||||||
|
|
||||||
String get sexValue {
|
String get sexValue {
|
||||||
if (sex == null) return '未设置';
|
|
||||||
if (sex == 1) return '男';
|
if (sex == 1) return '男';
|
||||||
if (sex == 2) return '女';
|
if (sex == 2) return '女';
|
||||||
|
if (sex == 3) return '保密';
|
||||||
return '未设置';
|
return '未设置';
|
||||||
}
|
}
|
||||||
|
|
||||||
DateTime? get birthdayDate => DateUtil.getDateTime(birthday ?? '');
|
// DateTime? get birthdayDate => DateUtil.getDateTime(birthday ?? '');
|
||||||
|
|
||||||
String get birthdayValue {
|
// String get birthdayValue {
|
||||||
if (TextUtil.isEmpty(birthday))
|
// if (TextUtil.isEmpty(birthday))
|
||||||
return '未设置';
|
// return '未设置';
|
||||||
else
|
// else
|
||||||
return DateUtil.formatDate(birthdayDate, format: 'yyyy-MM-dd');
|
// return DateUtil.formatDate(birthdayDate, format: 'yyyy-MM-dd');
|
||||||
}
|
// }
|
||||||
|
|
||||||
factory UserInfoModel.fromJson(Map<String, dynamic> json) =>
|
factory UserInfoModel.fromJson(Map<String, dynamic> json) =>
|
||||||
_$UserInfoModelFromJson(json);
|
_$UserInfoModelFromJson(json);
|
||||||
|
|
||||||
UserInfoModel({
|
const UserInfoModel({
|
||||||
required this.id,
|
required this.id,
|
||||||
required this.imgUrls,
|
required this.communityId,
|
||||||
this.name,
|
this.name,
|
||||||
required this.nickName,
|
|
||||||
required this.tel,
|
required this.tel,
|
||||||
|
required this.imgUrls,
|
||||||
this.sex,
|
this.sex,
|
||||||
this.birthday,
|
this.nickName,
|
||||||
|
required this.isExistPassword,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,137 @@
|
|||||||
|
import 'package:aku_new_community/pages/sign/sign_func.dart';
|
||||||
|
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:sms_autofill/sms_autofill.dart';
|
||||||
|
import 'package:velocity_x/velocity_x.dart';
|
||||||
|
|
||||||
|
class CodeMessagePage extends StatefulWidget {
|
||||||
|
final String tel;
|
||||||
|
|
||||||
|
const CodeMessagePage({Key? key, required this.tel}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_CodeMessagePageState createState() => _CodeMessagePageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _CodeMessagePageState extends State<CodeMessagePage> {
|
||||||
|
String? _errorMessage;
|
||||||
|
TextEditingController _controller = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
Future.delayed(Duration(milliseconds: 0), () async {
|
||||||
|
await SmsAutoFill().listenForCode();
|
||||||
|
});
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '',
|
||||||
|
body: SafeArea(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 48.w, vertical: 24.w),
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
46.w.heightBox,
|
||||||
|
'请输入验证码'
|
||||||
|
.text
|
||||||
|
.size(36.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.65))
|
||||||
|
.bold
|
||||||
|
.make(),
|
||||||
|
16.w.heightBox,
|
||||||
|
_errorMessage == null
|
||||||
|
? '${_errorMessage}'.text.color(Colors.red).size(28.sp).make()
|
||||||
|
: '验证码已发送至'
|
||||||
|
.richText
|
||||||
|
.withTextSpanChildren([
|
||||||
|
'${widget.tel}'
|
||||||
|
.textSpan
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Color(0xFFCF1322).withOpacity(0.8))
|
||||||
|
.make(),
|
||||||
|
])
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.45))
|
||||||
|
.make(),
|
||||||
|
80.w.heightBox,
|
||||||
|
PinFieldAutoFill(
|
||||||
|
inputFormatters: [FilteringTextInputFormatter.digitsOnly],
|
||||||
|
codeLength: 6,
|
||||||
|
onCodeChanged: (code) async {
|
||||||
|
if (code!.length >= 6) {
|
||||||
|
var re = await SignFunc.loginBySms(
|
||||||
|
widget.tel,
|
||||||
|
code,
|
||||||
|
UserTool.appProveider.pickedCityAndCommunity!
|
||||||
|
.communityModel!.id);
|
||||||
|
if (re.data['success']) {
|
||||||
|
UserTool.userProvider.setLogin(re.data['data']);
|
||||||
|
var success =
|
||||||
|
await UserTool.userProvider.updateUserInfo();
|
||||||
|
if (!success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_errorMessage = re.data['message'];
|
||||||
|
BotToast.showText(text: re.data['message']);
|
||||||
|
_controller.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
decoration: UnderlineDecoration(
|
||||||
|
colorBuilder: FixedColorListBuilder([
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
Colors.black.withOpacity(0.3),
|
||||||
|
])),
|
||||||
|
),
|
||||||
|
24.w.heightBox,
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Spacer(),
|
||||||
|
TextButton(
|
||||||
|
onPressed: () async {
|
||||||
|
var base = await SignFunc.sendMessageCode(
|
||||||
|
widget.tel,
|
||||||
|
UserTool.appProveider.pickedCityAndCommunity!
|
||||||
|
.communityModel!.id);
|
||||||
|
if (base.success) {
|
||||||
|
_errorMessage = null;
|
||||||
|
UserTool.appProveider.startTimer();
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: base.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: (UserTool.appProveider.second >= 60
|
||||||
|
? '重新发送验证码'
|
||||||
|
: '${UserTool.appProveider.second}秒后可重新发送')
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Color(0xFF5096F1))
|
||||||
|
.make()),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,196 @@
|
|||||||
|
import 'package:aku_new_community/pages/sign/login/code_message_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/login/login_page.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/sign_func.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/widget/login_button_widget.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/widget/psd_text_field.dart';
|
||||||
|
import 'package:aku_new_community/pages/sign/widget/tel_text_field.dart';
|
||||||
|
import 'package:aku_new_community/provider/app_provider.dart';
|
||||||
|
import 'package:aku_new_community/widget/bee_scaffold.dart';
|
||||||
|
import 'package:aku_new_community/widget/others/user_tool.dart';
|
||||||
|
import 'package:bot_toast/bot_toast.dart';
|
||||||
|
import 'package:flustars/flustars.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:provider/provider.dart';
|
||||||
|
import 'package:velocity_x/velocity_x.dart';
|
||||||
|
|
||||||
|
class OtherLoginPage extends StatefulWidget {
|
||||||
|
const OtherLoginPage({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_OtherLoginPageState createState() => _OtherLoginPageState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _OtherLoginPageState extends State<OtherLoginPage> {
|
||||||
|
PageController _controller = PageController();
|
||||||
|
List<String> _tabs = ['账号登录', '验证码登录'];
|
||||||
|
int _currentIndex = 0;
|
||||||
|
TextEditingController _tel = TextEditingController();
|
||||||
|
TextEditingController _psd = TextEditingController();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
_controller.dispose();
|
||||||
|
_tel.dispose();
|
||||||
|
_psd.dispose();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return BeeScaffold(
|
||||||
|
title: '',
|
||||||
|
bodyColor: Colors.white,
|
||||||
|
body: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
24.w.widthBox,
|
||||||
|
..._tabs
|
||||||
|
.mapIndexed((e, index) => _tab(e, index, onTap: (value) {
|
||||||
|
_currentIndex = value;
|
||||||
|
_controller.jumpToPage(_currentIndex);
|
||||||
|
setState(() {});
|
||||||
|
}))
|
||||||
|
.toList(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
Flexible(
|
||||||
|
child: PageView(
|
||||||
|
controller: _controller,
|
||||||
|
children: [_accountView(), _verificationView()],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
BottomTip(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _accountView() {
|
||||||
|
return ListView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
children: [
|
||||||
|
140.w.heightBox,
|
||||||
|
CommunityWidget(
|
||||||
|
align: MainAxisAlignment.start,
|
||||||
|
),
|
||||||
|
40.w.heightBox,
|
||||||
|
TelTextField(
|
||||||
|
controller: _tel,
|
||||||
|
),
|
||||||
|
40.w.heightBox,
|
||||||
|
PsdTextField(
|
||||||
|
controller: _psd,
|
||||||
|
),
|
||||||
|
100.w.heightBox,
|
||||||
|
LoginButtonWidget(
|
||||||
|
onTap: () async {
|
||||||
|
var check = checkInput();
|
||||||
|
if (!check) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var cancel = BotToast.showLoading();
|
||||||
|
var response = await SignFunc.login(
|
||||||
|
_tel.text,
|
||||||
|
_psd.text,
|
||||||
|
UserTool
|
||||||
|
.appProveider.pickedCityAndCommunity!.communityModel!.id);
|
||||||
|
if (response.data['success']) {
|
||||||
|
UserTool.userProvider.setLogin(response.data['data']);
|
||||||
|
var success = await UserTool.userProvider.updateUserInfo();
|
||||||
|
if (!success) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: response.data['message']);
|
||||||
|
}
|
||||||
|
cancel();
|
||||||
|
},
|
||||||
|
text: '登录'),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool checkInput() {
|
||||||
|
if (!RegexUtil.isTel(_tel.text)) {
|
||||||
|
BotToast.showText(text: '请输入正确的手机号!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (UserTool.appProveider.pickedCityAndCommunity == null) {
|
||||||
|
BotToast.showText(text: '请先选择小区!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _verificationView() {
|
||||||
|
AppProvider appProvider = Provider.of<AppProvider>(context);
|
||||||
|
return ListView(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 32.w),
|
||||||
|
children: [
|
||||||
|
140.w.heightBox,
|
||||||
|
CommunityWidget(
|
||||||
|
align: MainAxisAlignment.start,
|
||||||
|
),
|
||||||
|
40.w.heightBox,
|
||||||
|
TelTextField(controller: _tel),
|
||||||
|
100.w.heightBox,
|
||||||
|
LoginButtonWidget(
|
||||||
|
onTap: () async {
|
||||||
|
var check = checkInput();
|
||||||
|
if (!check) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var base = await SignFunc.sendMessageCode(
|
||||||
|
_tel.text,
|
||||||
|
UserTool
|
||||||
|
.appProveider.pickedCityAndCommunity!.communityModel!.id);
|
||||||
|
if (base.success) {
|
||||||
|
Get.to(() => CodeMessagePage(tel: _tel.text));
|
||||||
|
appProvider.startTimer();
|
||||||
|
} else {
|
||||||
|
BotToast.showText(text: base.message);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
text: appProvider.timerStart
|
||||||
|
? '${appProvider.second}秒后重新获取'
|
||||||
|
: '获取验证码'),
|
||||||
|
24.w.heightBox,
|
||||||
|
Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
'未注册的手机验证后会自动创建账号'
|
||||||
|
.text
|
||||||
|
.size(28.sp)
|
||||||
|
.color(Colors.black.withOpacity(0.25))
|
||||||
|
.make(),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _tab(String text, int index, {required Function(int) onTap}) {
|
||||||
|
return GestureDetector(
|
||||||
|
behavior: HitTestBehavior.opaque,
|
||||||
|
onTap: () => onTap(index),
|
||||||
|
child: Container(
|
||||||
|
padding: EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.w),
|
||||||
|
alignment: Alignment.center,
|
||||||
|
child: text.text
|
||||||
|
.size(_currentIndex == index ? 36.sp : 32.sp)
|
||||||
|
.lineHeight(_currentIndex == index ? 1.2 : 1.2)
|
||||||
|
.color(
|
||||||
|
Colors.black.withOpacity(_currentIndex == index ? 0.65 : 0.45))
|
||||||
|
.make(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
import 'package:flustars/flustars.dart';
|
||||||
|
|
||||||
|
enum PSDVERIFY { shorLength, Insufficient, different, correct, empty }
|
||||||
|
|
||||||
|
class PsdVerify {
|
||||||
|
//检测含有字母、数字、符号中两种的正则表达式
|
||||||
|
static String reg = r'^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).*';
|
||||||
|
static PSDVERIFY check(String psd, String confirmPsd) {
|
||||||
|
if (psd.isEmpty || confirmPsd.isEmpty) {
|
||||||
|
return PSDVERIFY.empty;
|
||||||
|
} else if (psd != confirmPsd) {
|
||||||
|
return PSDVERIFY.different;
|
||||||
|
} else if (psd.length < 6) {
|
||||||
|
return PSDVERIFY.shorLength;
|
||||||
|
} else if (!RegexUtil.matches(reg, psd)) {
|
||||||
|
return PSDVERIFY.Insufficient;
|
||||||
|
} else {
|
||||||
|
return PSDVERIFY.correct;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static String checkString(PSDVERIFY enu) {
|
||||||
|
switch (enu) {
|
||||||
|
case PSDVERIFY.shorLength:
|
||||||
|
return '密码不能小于6位';
|
||||||
|
case PSDVERIFY.Insufficient:
|
||||||
|
return '密码至少由两种类型组成';
|
||||||
|
case PSDVERIFY.different:
|
||||||
|
return '您输入的确认密码和新密码不一致,请检查后重新输入';
|
||||||
|
case PSDVERIFY.correct:
|
||||||
|
return '';
|
||||||
|
case PSDVERIFY.empty:
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
import 'package:aku_new_community/base/base_style.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
class LoginButtonWidget extends StatelessWidget {
|
||||||
|
final VoidCallback? onTap;
|
||||||
|
final String text;
|
||||||
|
const LoginButtonWidget({Key? key, required this.onTap, required this.text})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return MaterialButton(
|
||||||
|
minWidth: 686.w,
|
||||||
|
height: 97.w,
|
||||||
|
onPressed: onTap,
|
||||||
|
elevation: 0,
|
||||||
|
child: Text(
|
||||||
|
text,
|
||||||
|
style: TextStyle(
|
||||||
|
fontSize: 32.sp,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
disabledTextColor: Colors.black.withOpacity(0.45),
|
||||||
|
disabledColor: Colors.black.withOpacity(0.06),
|
||||||
|
color: kPrimaryColor,
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(60.w)),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,66 @@
|
|||||||
|
import 'package:flutter/cupertino.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
|
||||||
|
class PsdTextField extends StatefulWidget {
|
||||||
|
final TextEditingController controller;
|
||||||
|
final String? hintText;
|
||||||
|
|
||||||
|
const PsdTextField({
|
||||||
|
Key? key,
|
||||||
|
required this.controller,
|
||||||
|
this.hintText,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
_PsdTextFieldState createState() => _PsdTextFieldState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _PsdTextFieldState extends State<PsdTextField> {
|
||||||
|
bool visible = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Container(
|
||||||
|
width: 686.w,
|
||||||
|
height: 94.w,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.circular(60.w),
|
||||||
|
color: Colors.black.withOpacity(0.06),
|
||||||
|
),
|
||||||
|
child: TextField(
|
||||||
|
maxLength: 20,
|
||||||
|
onChanged: (text) {
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
controller: widget.controller,
|
||||||
|
obscureText: !visible,
|
||||||
|
obscuringCharacter: '*',
|
||||||
|
decoration: InputDecoration(
|
||||||
|
isDense: false,
|
||||||
|
contentPadding:
|
||||||
|
EdgeInsets.symmetric(horizontal: 24.w, vertical: 24.w),
|
||||||
|
border: InputBorder.none,
|
||||||
|
hintText: widget.hintText ?? '请输入密码',
|
||||||
|
counterText: '',
|
||||||
|
suffixIconConstraints:
|
||||||
|
BoxConstraints(minHeight: 50.w, maxHeight: 50.w),
|
||||||
|
suffixIcon: GestureDetector(
|
||||||
|
onTap: () {
|
||||||
|
visible = !visible;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.only(right: 20.w),
|
||||||
|
child: Icon(
|
||||||
|
visible ? CupertinoIcons.eye : CupertinoIcons.eye_slash,
|
||||||
|
color: Colors.black.withOpacity(0.4),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
hintStyle: TextStyle(
|
||||||
|
color: Colors.black.withOpacity(0.25), fontSize: 28.sp)),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,21 +1,25 @@
|
|||||||
|
import 'package:json_annotation/json_annotation.dart';
|
||||||
|
|
||||||
|
part 'base_model.g.dart';
|
||||||
|
|
||||||
|
@JsonSerializable()
|
||||||
class BaseModel {
|
class BaseModel {
|
||||||
int? code;
|
int code;
|
||||||
String? message;
|
String message;
|
||||||
bool? status;
|
bool success;
|
||||||
dynamic data;
|
dynamic data;
|
||||||
|
factory BaseModel.fromJson(Map<String, dynamic> json) =>
|
||||||
|
_$BaseModelFromJson(json);
|
||||||
|
BaseModel.err(
|
||||||
|
{this.message = '未知错误',
|
||||||
|
this.success = false,
|
||||||
|
this.data = null,
|
||||||
|
this.code = 0});
|
||||||
|
|
||||||
BaseModel({
|
BaseModel({
|
||||||
this.code,
|
required this.code,
|
||||||
this.message,
|
required this.message,
|
||||||
this.data,
|
required this.success,
|
||||||
this.status,
|
required this.data,
|
||||||
});
|
});
|
||||||
|
|
||||||
BaseModel.err({this.message = '未知错误', this.status = false});
|
|
||||||
|
|
||||||
BaseModel.fromJson(Map<String, dynamic> json) {
|
|
||||||
message = json['message'] ?? '';
|
|
||||||
data = json['data'] ?? null;
|
|
||||||
status = json['status'] ?? false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||||
|
|
||||||
|
part of 'base_model.dart';
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
// JsonSerializableGenerator
|
||||||
|
// **************************************************************************
|
||||||
|
|
||||||
|
BaseModel _$BaseModelFromJson(Map<String, dynamic> json) => BaseModel(
|
||||||
|
code: json['code'] as int,
|
||||||
|
message: json['message'] as String,
|
||||||
|
success: json['success'] as bool,
|
||||||
|
data: json['data'],
|
||||||
|
);
|
Loading…
Reference in new issue