Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
e84d07d707
1540
star_lock/assets/countries.json
Normal file
1540
star_lock/assets/countries.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -191,6 +191,9 @@
|
|||||||
"lanChinese":"Chinese",
|
"lanChinese":"Chinese",
|
||||||
"multilingual":"Multilingual",
|
"multilingual":"Multilingual",
|
||||||
"addLock":"Add Lock",
|
"addLock":"Add Lock",
|
||||||
|
"selectLockType":"Select lock type",
|
||||||
|
"videoIntercomDoorLock":"Video intercom door lock",
|
||||||
|
"NFCPassiveLock":"NFC Passive Lock",
|
||||||
"addDevice":"Add device",
|
"addDevice":"Add device",
|
||||||
"gateway":"Gateway",
|
"gateway":"Gateway",
|
||||||
"message":"Message",
|
"message":"Message",
|
||||||
|
|||||||
@ -191,6 +191,9 @@
|
|||||||
"lanChinese":"lanChinese",
|
"lanChinese":"lanChinese",
|
||||||
"multilingual":"multilingual",
|
"multilingual":"multilingual",
|
||||||
"addLock":"addLock",
|
"addLock":"addLock",
|
||||||
|
"selectLockType":"selectLockType",
|
||||||
|
"videoIntercomDoorLock":"videoIntercomDoorLock",
|
||||||
|
"NFCPassiveLock":"NFCPassiveLock",
|
||||||
"addDevice":"addDevice",
|
"addDevice":"addDevice",
|
||||||
"gateway":"gateway",
|
"gateway":"gateway",
|
||||||
"message":"message",
|
"message":"message",
|
||||||
|
|||||||
@ -191,6 +191,9 @@
|
|||||||
"lanChinese":"中文",
|
"lanChinese":"中文",
|
||||||
"multilingual":"多语言",
|
"multilingual":"多语言",
|
||||||
"addLock":"添加锁",
|
"addLock":"添加锁",
|
||||||
|
"selectLockType":"选择锁类型",
|
||||||
|
"videoIntercomDoorLock":"可视对讲门锁",
|
||||||
|
"NFCPassiveLock":"NFC无源锁",
|
||||||
"addDevice":"添加设备",
|
"addDevice":"添加设备",
|
||||||
"gateway":"网关",
|
"gateway":"网关",
|
||||||
"message":"消息",
|
"message":"消息",
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'starLock_forgetPassword_logic.dart';
|
||||||
|
|
||||||
|
class StarLockForgetPasswordBinding extends Bindings {
|
||||||
|
@override
|
||||||
|
void dependencies() {
|
||||||
|
Get.lazyPut(() => StarLockForgetPasswordLogic());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,88 @@
|
|||||||
|
import 'dart:async';
|
||||||
|
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_state.dart';
|
||||||
|
|
||||||
|
import '../../network/api_repository.dart';
|
||||||
|
import '../../tools/baseGetXController.dart';
|
||||||
|
import '../../tools/toast.dart';
|
||||||
|
|
||||||
|
class StarLockForgetPasswordLogic extends BaseGetXController {
|
||||||
|
final StarLockForgetPasswordState state = StarLockForgetPasswordState();
|
||||||
|
|
||||||
|
late Timer _timer;
|
||||||
|
void _startTimer() {
|
||||||
|
_timer = Timer.periodic(1.seconds, (timer) {
|
||||||
|
if (state.currentSecond > 1) {
|
||||||
|
state.currentSecond--;
|
||||||
|
} else {
|
||||||
|
_cancelTimer();
|
||||||
|
state.currentSecond = state.totalSeconds;
|
||||||
|
}
|
||||||
|
state.resetResend();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void _cancelTimer() {
|
||||||
|
_timer.cancel();
|
||||||
|
// _timer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
void resetPassword() async {
|
||||||
|
var entity = await ApiRepository.to.resetPassword(
|
||||||
|
state.countryCode.value,
|
||||||
|
state.phoneStr.value,
|
||||||
|
state.date.value,
|
||||||
|
state.pwd.value,
|
||||||
|
"B748F838-94EE-4BDB-A0E6-7B2D16849792",
|
||||||
|
state.verificationCode.value);
|
||||||
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
|
Toast.show(msg: '重置成功');
|
||||||
|
Get.back();
|
||||||
|
} else {
|
||||||
|
print('Error');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendValidationCode() async {
|
||||||
|
var entity = await ApiRepository.to.sendValidationCode(
|
||||||
|
// state.countryCode.value,
|
||||||
|
"+86",
|
||||||
|
state.phoneStr.value,
|
||||||
|
// state.isIphoneType.value ? "1" : "2",
|
||||||
|
'1',
|
||||||
|
state.codeType.value,
|
||||||
|
"B748F838-94EE-4BDB-A0E6-7B2D16849792",
|
||||||
|
state.xWidth.value.toString());
|
||||||
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
|
_startTimer();
|
||||||
|
} else {}
|
||||||
|
}
|
||||||
|
|
||||||
|
void checkNext(TextEditingController controller) {
|
||||||
|
changeInput(controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
void changeInput(TextEditingController controller) {
|
||||||
|
if (controller == state.phoneController) {
|
||||||
|
state.phoneStr.value = controller.text;
|
||||||
|
state.phoneStrIsOK.value = state.phoneStr.value.isNotEmpty;
|
||||||
|
}
|
||||||
|
if (controller == state.pwdController) {
|
||||||
|
state.pwd.value = controller.text;
|
||||||
|
}
|
||||||
|
if (controller == state.sureController) {
|
||||||
|
state.surePwd.value = controller.text;
|
||||||
|
}
|
||||||
|
if (controller == state.codeController) {
|
||||||
|
state.verificationCode.value = controller.text;
|
||||||
|
}
|
||||||
|
_resetCanSub();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _resetCanSub() {
|
||||||
|
state.canSub.value = state.pwdIsOK && state.codeIsOK;
|
||||||
|
print("22222:${state.canSub.value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:star_lock/login/forgetPassword/starLock_forgetPassword_logic.dart';
|
||||||
|
|
||||||
import '../../appRouters.dart';
|
import '../../appRouters.dart';
|
||||||
import '../../app_settings/app_colors.dart';
|
import '../../app_settings/app_colors.dart';
|
||||||
@ -22,13 +23,8 @@ class StarLockForgetPasswordPage extends StatefulWidget {
|
|||||||
|
|
||||||
class _StarLockForgetPasswordPageState
|
class _StarLockForgetPasswordPageState
|
||||||
extends State<StarLockForgetPasswordPage> {
|
extends State<StarLockForgetPasswordPage> {
|
||||||
final TextEditingController _phoneController = TextEditingController();
|
final logic = Get.put(StarLockForgetPasswordLogic());
|
||||||
final TextEditingController _pwdController = TextEditingController();
|
final state = Get.find<StarLockForgetPasswordLogic>().state;
|
||||||
final TextEditingController _codeController = TextEditingController();
|
|
||||||
|
|
||||||
late Timer _timer;
|
|
||||||
|
|
||||||
int _seconds = 60;
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -44,7 +40,11 @@ class _StarLockForgetPasswordPageState
|
|||||||
padding: EdgeInsets.only(top: 40.h, left: 40.w, right: 40.w),
|
padding: EdgeInsets.only(top: 40.h, left: 40.w, right: 40.w),
|
||||||
children: [
|
children: [
|
||||||
LoginInput(
|
LoginInput(
|
||||||
controller: _phoneController,
|
controller: state.phoneController,
|
||||||
|
onchangeAction: (v) {
|
||||||
|
print("3333333:${v}");
|
||||||
|
logic.checkNext(state.phoneController);
|
||||||
|
},
|
||||||
leftWidget: Padding(
|
leftWidget: Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
top: 30.w, bottom: 20.w, right: 20.w, left: 5.w),
|
top: 30.w, bottom: 20.w, right: 20.w, left: 5.w),
|
||||||
@ -63,7 +63,10 @@ class _StarLockForgetPasswordPageState
|
|||||||
]),
|
]),
|
||||||
SizedBox(height: 10.h),
|
SizedBox(height: 10.h),
|
||||||
LoginInput(
|
LoginInput(
|
||||||
controller: _pwdController,
|
controller: state.pwdController,
|
||||||
|
onchangeAction: (v) {
|
||||||
|
logic.checkNext(state.pwdController);
|
||||||
|
},
|
||||||
isPwd: true,
|
isPwd: true,
|
||||||
leftWidget: Padding(
|
leftWidget: Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
@ -87,7 +90,10 @@ class _StarLockForgetPasswordPageState
|
|||||||
),
|
),
|
||||||
SizedBox(height: 10.w),
|
SizedBox(height: 10.w),
|
||||||
LoginInput(
|
LoginInput(
|
||||||
controller: _pwdController,
|
controller: state.sureController,
|
||||||
|
onchangeAction: (v) {
|
||||||
|
logic.checkNext(state.sureController);
|
||||||
|
},
|
||||||
isPwd: true,
|
isPwd: true,
|
||||||
leftWidget: Padding(
|
leftWidget: Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(
|
||||||
@ -108,21 +114,17 @@ class _StarLockForgetPasswordPageState
|
|||||||
children: [
|
children: [
|
||||||
Expanded(
|
Expanded(
|
||||||
child: LoginInput(
|
child: LoginInput(
|
||||||
controller: _codeController,
|
controller: state.codeController,
|
||||||
isPwd: true,
|
onchangeAction: (v) {
|
||||||
|
logic.checkNext(state.codeController);
|
||||||
|
},
|
||||||
leftWidget: Padding(
|
leftWidget: Padding(
|
||||||
padding: EdgeInsets.only(
|
padding: EdgeInsets.only(right: 10.w, left: 5.w),
|
||||||
top: 30.w, bottom: 20.w, right: 20.w, left: 5.w),
|
child: SizedBox(
|
||||||
child: SizedBox(
|
width: 30.w,
|
||||||
width: 36.w,
|
height: 30.w,
|
||||||
height: 36.w,
|
),
|
||||||
)
|
),
|
||||||
// Image.asset(
|
|
||||||
// 'images/main/icon_main_search.png',
|
|
||||||
// width: 40.w,
|
|
||||||
// height: 40.w,
|
|
||||||
// ),
|
|
||||||
),
|
|
||||||
hintText:
|
hintText:
|
||||||
"${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}",
|
"${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}",
|
||||||
inputFormatters: [
|
inputFormatters: [
|
||||||
@ -130,48 +132,62 @@ class _StarLockForgetPasswordPageState
|
|||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 20.w,
|
width: 10.w,
|
||||||
),
|
),
|
||||||
GestureDetector(
|
Obx(() => GestureDetector(
|
||||||
child: Container(
|
onTap: state.phoneStrIsOK.value
|
||||||
width: 160.w,
|
? () async {
|
||||||
height: 60.h,
|
// Navigator.pushNamed(context, Routers.safetyVerificationPage, arguments: {"countryCode":"+86", "account":state.phoneOrEmailStr.value});
|
||||||
padding: EdgeInsets.all(5.h),
|
var result = await Navigator.pushNamed(
|
||||||
decoration: BoxDecoration(
|
context, Routers.safetyVerificationPage,
|
||||||
color: AppColors.mainColor,
|
arguments: {
|
||||||
borderRadius: BorderRadius.circular(5)),
|
"countryCode": "+86",
|
||||||
child: Center(
|
"account": state.phoneStr.value
|
||||||
child: Text(
|
});
|
||||||
_seconds == 60
|
logic.state.xWidth.value =
|
||||||
? '${TranslationLoader.lanKeys!.getTip!.tr}${TranslationLoader.lanKeys!.verificationCode!.tr}'
|
(result as Map<String, dynamic>)['xWidth'];
|
||||||
: (_seconds < 10)
|
logic.sendValidationCode();
|
||||||
? '0$_seconds s'
|
}
|
||||||
: '$_seconds s',
|
: null,
|
||||||
textAlign: TextAlign.center,
|
child: Container(
|
||||||
style: TextStyle(
|
width: 180.w,
|
||||||
color: Colors.white,
|
height: 60.h,
|
||||||
fontSize: 26.sp,
|
padding: EdgeInsets.all(5.h),
|
||||||
)),
|
decoration: BoxDecoration(
|
||||||
),
|
color: state.phoneStrIsOK.value
|
||||||
),
|
? AppColors.mainColor
|
||||||
onTap: () {
|
: AppColors.btnDisableColor,
|
||||||
if (_seconds == 60) {
|
borderRadius: BorderRadius.circular(5)),
|
||||||
// _setVerify();
|
child: Center(
|
||||||
} else {
|
child: Text(state.btnText.value,
|
||||||
// Toast.show(msg: '正在获取验证码');
|
textAlign: TextAlign.center,
|
||||||
}
|
style: TextStyle(
|
||||||
},
|
color: Colors.white,
|
||||||
)
|
fontSize: 24.sp,
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
))
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
// ],
|
||||||
|
// ),
|
||||||
SizedBox(height: 50.w),
|
SizedBox(height: 50.w),
|
||||||
SubmitBtn(
|
Obx(() {
|
||||||
btnName:
|
return SubmitBtn(
|
||||||
"${TranslationLoader.lanKeys!.reset!.tr}${TranslationLoader.lanKeys!.password!.tr}",
|
btnName:
|
||||||
fontSize: 30.sp,
|
"${TranslationLoader.lanKeys!.reset!.tr}${TranslationLoader.lanKeys!.password!.tr}",
|
||||||
borderRadius: 20.w,
|
// backgroundColorList: state.canSub.value ? [AppColors.mainColor] :[Colors.grey],
|
||||||
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
|
fontSize: 30.sp,
|
||||||
onClick: () {}),
|
borderRadius: 20.w,
|
||||||
|
padding: EdgeInsets.only(top: 25.w, bottom: 25.w),
|
||||||
|
isDisabled: state.canSub.value,
|
||||||
|
onClick: state.canSub.value
|
||||||
|
? () {
|
||||||
|
logic.resetPassword();
|
||||||
|
}
|
||||||
|
: null);
|
||||||
|
}),
|
||||||
],
|
],
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,55 @@
|
|||||||
|
import 'package:flustars/flustars.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
|
import '../../translations/trans_lib.dart';
|
||||||
|
|
||||||
|
class StarLockForgetPasswordState {
|
||||||
|
final TextEditingController phoneController = TextEditingController();
|
||||||
|
final TextEditingController pwdController = TextEditingController();
|
||||||
|
final TextEditingController sureController = TextEditingController();
|
||||||
|
final TextEditingController codeController = TextEditingController();
|
||||||
|
|
||||||
|
static int currentTimeMillis() {
|
||||||
|
return DateTime.now().millisecondsSinceEpoch;
|
||||||
|
}
|
||||||
|
|
||||||
|
var countryCode = '+86'.obs;
|
||||||
|
var countryId = '9'.obs;
|
||||||
|
var codeType = '2'.obs;
|
||||||
|
var pwd = ''.obs;
|
||||||
|
var surePwd = ''.obs;
|
||||||
|
var verificationCode = ''.obs;
|
||||||
|
var xWidth = ''.obs; // 滑动验证码滑动位置
|
||||||
|
var canSub = false.obs;
|
||||||
|
var phoneStr = ''.obs;
|
||||||
|
var phoneStrIsOK = false.obs;
|
||||||
|
var date = currentTimeMillis().toString().obs;
|
||||||
|
|
||||||
|
bool get isIphone => RegexUtil.isMobileSimple(phoneStr.value);
|
||||||
|
bool get pwdIsOK => pwd.value.isNotEmpty && (pwd.value == surePwd.value);
|
||||||
|
bool get codeIsOK => verificationCode.value.isNotEmpty;
|
||||||
|
|
||||||
|
var canResend = false.obs;
|
||||||
|
var btnText = ''.obs;
|
||||||
|
var totalSeconds = 120;
|
||||||
|
var currentSecond = 120;
|
||||||
|
|
||||||
|
StarLockForgetPasswordState() {
|
||||||
|
resetResend();
|
||||||
|
}
|
||||||
|
|
||||||
|
void resetResend() {
|
||||||
|
canResend.value = totalSeconds == currentSecond;
|
||||||
|
btnText.value = !canResend.value
|
||||||
|
? '$currentSecond s'
|
||||||
|
: btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void onClose() {
|
||||||
|
phoneController.dispose();
|
||||||
|
pwdController.dispose();
|
||||||
|
sureController.dispose();
|
||||||
|
codeController.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
@ -9,15 +8,15 @@ import '../../tools/baseGetXController.dart';
|
|||||||
import '../../tools/toast.dart';
|
import '../../tools/toast.dart';
|
||||||
import 'starLock_register_state.dart';
|
import 'starLock_register_state.dart';
|
||||||
|
|
||||||
class StarLockRegisterLogic extends BaseGetXController{
|
class StarLockRegisterLogic extends BaseGetXController {
|
||||||
final StarLockRegisterState state = StarLockRegisterState();
|
final StarLockRegisterState state = StarLockRegisterState();
|
||||||
|
|
||||||
late Timer _timer;
|
late Timer _timer;
|
||||||
void _startTimer() {
|
void _startTimer() {
|
||||||
_timer = Timer.periodic(1.seconds, (timer) {
|
_timer = Timer.periodic(1.seconds, (timer) {
|
||||||
if(state.currentSecond > 1){
|
if (state.currentSecond > 1) {
|
||||||
state.currentSecond--;
|
state.currentSecond--;
|
||||||
}else {
|
} else {
|
||||||
_cancelTimer();
|
_cancelTimer();
|
||||||
state.currentSecond = state.totalSeconds;
|
state.currentSecond = state.totalSeconds;
|
||||||
}
|
}
|
||||||
@ -30,38 +29,33 @@ class StarLockRegisterLogic extends BaseGetXController{
|
|||||||
// _timer = null;
|
// _timer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
void register() async{
|
void register() async {
|
||||||
var entity = await ApiRepository.to.register(
|
var entity = await ApiRepository.to.register(
|
||||||
state.countryCode.value,
|
state.countryCode.value,
|
||||||
state.countryId.value,
|
state.countryId.value,
|
||||||
state.phoneOrEmailStr.value,
|
state.phoneOrEmailStr.value,
|
||||||
state.pwd.value,
|
state.pwd.value,
|
||||||
"477E6814-289D-402A-9F49-F89A8BD05D63",
|
"477E6814-289D-402A-9F49-F89A8BD05D63",
|
||||||
state.verificationCode.value
|
state.verificationCode.value);
|
||||||
);
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
if(entity.errorCode!.codeIsSuccessful){
|
|
||||||
// await loginSuccess(loginEntity: entity);
|
// await loginSuccess(loginEntity: entity);
|
||||||
Toast.show(msg: "注册成功");
|
Toast.show(msg: "注册成功");
|
||||||
Get.back();
|
Get.back();
|
||||||
} else {
|
} else {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sendValidationCode() async{
|
void sendValidationCode() async {
|
||||||
var entity = await ApiRepository.to.sendValidationCode(
|
var entity = await ApiRepository.to.sendValidationCode(
|
||||||
// state.countryCode.value,
|
// state.countryCode.value,
|
||||||
"+86",
|
"+86",
|
||||||
state.phoneOrEmailStr.value,
|
state.phoneOrEmailStr.value,
|
||||||
state.isIphoneType.value?"1":"2",
|
state.isIphoneType.value ? "1" : "2",
|
||||||
|
'1',
|
||||||
"B748F838-94EE-4BDB-A0E6-7B2D16849792",
|
"B748F838-94EE-4BDB-A0E6-7B2D16849792",
|
||||||
state.xWidth.value.toString()
|
state.xWidth.value.toString());
|
||||||
);
|
if (entity.errorCode!.codeIsSuccessful) {
|
||||||
if(entity.errorCode!.codeIsSuccessful){
|
|
||||||
_startTimer();
|
_startTimer();
|
||||||
} else {
|
} else {}
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void checkNext(TextEditingController controller) {
|
void checkNext(TextEditingController controller) {
|
||||||
@ -69,25 +63,26 @@ class StarLockRegisterLogic extends BaseGetXController{
|
|||||||
}
|
}
|
||||||
|
|
||||||
void changeInput(TextEditingController controller) {
|
void changeInput(TextEditingController controller) {
|
||||||
if(controller == state.phoneOrEmailController){
|
if (controller == state.phoneOrEmailController) {
|
||||||
state.phoneOrEmailStr.value = controller.text;
|
state.phoneOrEmailStr.value = controller.text;
|
||||||
state.phoneOrEmailStrIsOK.value = state.phoneOrEmailStr.value.isNotEmpty;
|
state.phoneOrEmailStrIsOK.value = state.phoneOrEmailStr.value.isNotEmpty;
|
||||||
}
|
}
|
||||||
if(controller == state.pwdController) {
|
if (controller == state.pwdController) {
|
||||||
state.pwd.value = controller.text;
|
state.pwd.value = controller.text;
|
||||||
}
|
}
|
||||||
if(controller == state.sureController) {
|
if (controller == state.sureController) {
|
||||||
state.surePwd.value = controller.text;
|
state.surePwd.value = controller.text;
|
||||||
}
|
}
|
||||||
if(controller == state.codeController) {
|
if (controller == state.codeController) {
|
||||||
state.verificationCode.value = controller.text;
|
state.verificationCode.value = controller.text;
|
||||||
}
|
}
|
||||||
_resetCanSub();
|
_resetCanSub();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _resetCanSub(){
|
void _resetCanSub() {
|
||||||
state.canSub.value = state.pwdIsOK && state.codeIsOK && (state.isIphoneType.value ? state.isIphone : state.isEmail);
|
state.canSub.value = state.pwdIsOK &&
|
||||||
|
state.codeIsOK &&
|
||||||
|
(state.isIphoneType.value ? state.isIphone : state.isEmail);
|
||||||
print("22222:${state.canSub.value}");
|
print("22222:${state.canSub.value}");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|||||||
@ -1,25 +1,23 @@
|
|||||||
|
|
||||||
import 'package:flustars/flustars.dart';
|
import 'package:flustars/flustars.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../../translations/trans_lib.dart';
|
import '../../translations/trans_lib.dart';
|
||||||
|
|
||||||
class StarLockRegisterState{
|
class StarLockRegisterState {
|
||||||
|
|
||||||
final TextEditingController phoneOrEmailController = TextEditingController();
|
final TextEditingController phoneOrEmailController = TextEditingController();
|
||||||
final TextEditingController pwdController = TextEditingController();
|
final TextEditingController pwdController = TextEditingController();
|
||||||
final TextEditingController sureController = TextEditingController();
|
final TextEditingController sureController = TextEditingController();
|
||||||
final TextEditingController codeController = TextEditingController();
|
final TextEditingController codeController = TextEditingController();
|
||||||
|
|
||||||
var countryCode = ''.obs;
|
var countryCode = '+86'.obs;
|
||||||
var countryId = ''.obs;
|
var countryId = '9'.obs;
|
||||||
var phoneOrEmailStr = ''.obs;
|
var phoneOrEmailStr = ''.obs;
|
||||||
var phoneOrEmailStrIsOK = false.obs;
|
var phoneOrEmailStrIsOK = false.obs;
|
||||||
var pwd = ''.obs;
|
var pwd = ''.obs;
|
||||||
var surePwd = ''.obs;
|
var surePwd = ''.obs;
|
||||||
var verificationCode = ''.obs;
|
var verificationCode = ''.obs;
|
||||||
var xWidth = ''.obs;// 滑动验证码滑动位置
|
var xWidth = ''.obs; // 滑动验证码滑动位置
|
||||||
var isIphoneType = true.obs;
|
var isIphoneType = true.obs;
|
||||||
var canSub = false.obs;
|
var canSub = false.obs;
|
||||||
|
|
||||||
@ -33,13 +31,15 @@ class StarLockRegisterState{
|
|||||||
var totalSeconds = 120;
|
var totalSeconds = 120;
|
||||||
var currentSecond = 120;
|
var currentSecond = 120;
|
||||||
|
|
||||||
StarLockRegisterState(){
|
StarLockRegisterState() {
|
||||||
resetResend();
|
resetResend();
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetResend() {
|
void resetResend() {
|
||||||
canResend.value = totalSeconds == currentSecond;
|
canResend.value = totalSeconds == currentSecond;
|
||||||
btnText.value = !canResend.value ? '$currentSecond s' : btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr;
|
btnText.value = !canResend.value
|
||||||
|
? '$currentSecond s'
|
||||||
|
: btnText.value = TranslationLoader.lanKeys!.getVerificationCode!.tr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void onClose() {
|
void onClose() {
|
||||||
@ -48,4 +48,4 @@ class StarLockRegisterState{
|
|||||||
sureController.dispose();
|
sureController.dispose();
|
||||||
codeController.dispose();
|
codeController.dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,54 @@
|
|||||||
|
import 'package:azlistview/azlistview.dart';
|
||||||
|
|
||||||
|
import 'index.dart';
|
||||||
|
|
||||||
|
class CountriesModel extends ISuspensionBean {
|
||||||
|
String? short;
|
||||||
|
late String name;
|
||||||
|
String? en;
|
||||||
|
late String tel;
|
||||||
|
String? pinyin;
|
||||||
|
String? tagIndex;
|
||||||
|
|
||||||
|
CountriesModel(
|
||||||
|
{this.short,
|
||||||
|
required this.name,
|
||||||
|
this.en,
|
||||||
|
required this.tel,
|
||||||
|
this.pinyin,
|
||||||
|
this.tagIndex});
|
||||||
|
|
||||||
|
CountriesModel.fromJson(Map<String, dynamic> json) {
|
||||||
|
if (json["short"] is String) {
|
||||||
|
short = json["short"];
|
||||||
|
}
|
||||||
|
if (json["name"] is String) {
|
||||||
|
name = json["name"];
|
||||||
|
}
|
||||||
|
if (json["en"] is String) {
|
||||||
|
en = json["en"];
|
||||||
|
}
|
||||||
|
if (json["tel"] is String) {
|
||||||
|
tel = json["tel"];
|
||||||
|
}
|
||||||
|
if (json["pinyin"] is String) {
|
||||||
|
pinyin = json["pinyin"];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() {
|
||||||
|
final Map<String, dynamic> data = <String, dynamic>{};
|
||||||
|
data["short"] = short;
|
||||||
|
data["name"] = name;
|
||||||
|
data["en"] = en;
|
||||||
|
data["tel"] = tel;
|
||||||
|
data["pinyin"] = pinyin;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getSuspensionTag() => tagIndex!;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => json.encode(this);
|
||||||
|
}
|
||||||
8
star_lock/lib/login/seletCountryRegion/common/index.dart
Normal file
8
star_lock/lib/login/seletCountryRegion/common/index.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export 'utils.dart';
|
||||||
|
export 'res.dart';
|
||||||
|
|
||||||
|
export 'dart:convert';
|
||||||
|
|
||||||
|
export 'package:common_utils/common_utils.dart';
|
||||||
|
|
||||||
|
export 'package:lpinyin/lpinyin.dart';
|
||||||
108
star_lock/lib/login/seletCountryRegion/common/models.dart
Normal file
108
star_lock/lib/login/seletCountryRegion/common/models.dart
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:azlistview/azlistview.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class CityModel extends ISuspensionBean {
|
||||||
|
String name;
|
||||||
|
String? tagIndex;
|
||||||
|
String? namePinyin;
|
||||||
|
|
||||||
|
CityModel({
|
||||||
|
required this.name,
|
||||||
|
this.tagIndex,
|
||||||
|
this.namePinyin,
|
||||||
|
});
|
||||||
|
|
||||||
|
CityModel.fromJson(Map<String, dynamic> json) : name = json['name'];
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
'name': name,
|
||||||
|
// 'tagIndex': tagIndex,
|
||||||
|
// 'namePinyin': namePinyin,
|
||||||
|
// 'isShowSuspension': isShowSuspension
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getSuspensionTag() => tagIndex!;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => json.encode(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ContactInfo extends ISuspensionBean {
|
||||||
|
String name;
|
||||||
|
String? tagIndex;
|
||||||
|
String? namePinyin;
|
||||||
|
|
||||||
|
Color? bgColor;
|
||||||
|
IconData? iconData;
|
||||||
|
|
||||||
|
String? img;
|
||||||
|
String? id;
|
||||||
|
String? firstletter;
|
||||||
|
|
||||||
|
ContactInfo({
|
||||||
|
required this.name,
|
||||||
|
this.tagIndex,
|
||||||
|
this.namePinyin,
|
||||||
|
this.bgColor,
|
||||||
|
this.iconData,
|
||||||
|
this.img,
|
||||||
|
this.id,
|
||||||
|
this.firstletter,
|
||||||
|
});
|
||||||
|
|
||||||
|
ContactInfo.fromJson(Map<String, dynamic> json)
|
||||||
|
: name = json['name'],
|
||||||
|
img = json['img'],
|
||||||
|
id = json['id']?.toString(),
|
||||||
|
firstletter = json['firstletter'];
|
||||||
|
|
||||||
|
Map<String, dynamic> toJson() => {
|
||||||
|
// 'id': id,
|
||||||
|
'name': name,
|
||||||
|
'img': img,
|
||||||
|
// 'firstletter': firstletter,
|
||||||
|
// 'tagIndex': tagIndex,
|
||||||
|
// 'namePinyin': namePinyin,
|
||||||
|
// 'isShowSuspension': isShowSuspension
|
||||||
|
};
|
||||||
|
|
||||||
|
@override
|
||||||
|
String getSuspensionTag() => tagIndex!;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() => json.encode(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// class Languages extends GithubLanguage with ISuspensionBean {
|
||||||
|
// String? tagIndex;
|
||||||
|
// String? pinyin;
|
||||||
|
// String? shortPinyin;
|
||||||
|
|
||||||
|
// Languages.fromJson(Map<String, dynamic> json) : super.fromJson(json);
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// Map<String, dynamic> toJson() {
|
||||||
|
// final Map<String, dynamic> map = super.toJson();
|
||||||
|
// void addIfNonNull(String fieldName, dynamic value) {
|
||||||
|
// if (value != null) {
|
||||||
|
// map[fieldName] = value;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // addIfNonNull('tagIndex', tagIndex);
|
||||||
|
// return map;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// String getSuspensionTag() {
|
||||||
|
// return tagIndex!;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @override
|
||||||
|
// String toString() {
|
||||||
|
// return json.encode(this);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
170
star_lock/lib/login/seletCountryRegion/common/utils.dart
Normal file
170
star_lock/lib/login/seletCountryRegion/common/utils.dart
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:star_lock/app_settings/app_colors.dart';
|
||||||
|
import 'package:star_lock/login/seletCountryRegion/common/countries_model.dart';
|
||||||
|
import 'package:star_lock/login/seletCountryRegion/common/models.dart';
|
||||||
|
|
||||||
|
import 'index.dart';
|
||||||
|
|
||||||
|
class Utils {
|
||||||
|
static String getImgPath(String name, {String format: 'png'}) {
|
||||||
|
return 'assets/images/$name.$format';
|
||||||
|
}
|
||||||
|
|
||||||
|
static void showSnackBar(BuildContext context, String msg) {
|
||||||
|
ScaffoldMessenger.of(context).showSnackBar(
|
||||||
|
SnackBar(
|
||||||
|
content: Text(msg),
|
||||||
|
duration: Duration(seconds: 2),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget getSusItem(BuildContext context, String tag,
|
||||||
|
{double susHeight = 40}) {
|
||||||
|
if (tag == '★') {
|
||||||
|
tag = '★ 热门城市';
|
||||||
|
}
|
||||||
|
return Container(
|
||||||
|
height: susHeight,
|
||||||
|
width: MediaQuery.of(context).size.width,
|
||||||
|
padding: const EdgeInsets.only(left: 16.0),
|
||||||
|
color: const Color(0xFFF3F4F5),
|
||||||
|
alignment: Alignment.centerLeft,
|
||||||
|
child: Text(
|
||||||
|
tag,
|
||||||
|
softWrap: false,
|
||||||
|
style: const TextStyle(
|
||||||
|
fontSize: 14.0,
|
||||||
|
color: Color(0xFF666666),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget getListItem(BuildContext context, CountriesModel model,
|
||||||
|
{double susHeight = 40}) {
|
||||||
|
return GestureDetector(
|
||||||
|
child: SizedBox(
|
||||||
|
height: 80.h,
|
||||||
|
child: Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
width: 20.w,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
model.name,
|
||||||
|
style: TextStyle(
|
||||||
|
color: AppColors.darkGrayTextColor, fontSize: 24.sp),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 30.w,
|
||||||
|
)),
|
||||||
|
Text(
|
||||||
|
'+${model.tel}',
|
||||||
|
style: TextStyle(color: AppColors.blackColor, fontSize: 22.sp),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 60.w,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
// Divider(
|
||||||
|
// height: 1,
|
||||||
|
// color: AppColors.greyLineColor,
|
||||||
|
// endIndent: 0,
|
||||||
|
// indent: 20.w,
|
||||||
|
// )
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
LogUtil.e("onItemClick : $model");
|
||||||
|
Utils.showSnackBar(context, 'onItemClick : ${model.name}');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
// return ListTile(
|
||||||
|
// title: Text('${model.name} +${model.tel}'),
|
||||||
|
// onTap: () {
|
||||||
|
// LogUtil.e("onItemClick : $model");
|
||||||
|
// Utils.showSnackBar(context, 'onItemClick : ${model.name}');
|
||||||
|
// },
|
||||||
|
// );
|
||||||
|
// return Column(
|
||||||
|
// mainAxisSize: MainAxisSize.min,
|
||||||
|
// children: <Widget>[
|
||||||
|
// Offstage(
|
||||||
|
// offstage: !(model.isShowSuspension == true),
|
||||||
|
// child: getSusItem(context, model.getSuspensionTag(),
|
||||||
|
// susHeight: susHeight),
|
||||||
|
// ),
|
||||||
|
// ListTile(
|
||||||
|
// title: Text(model.name),
|
||||||
|
// onTap: () {
|
||||||
|
// LogUtil.e("onItemClick : $model");
|
||||||
|
// Utils.showSnackBar(context, 'onItemClick : ${model.name}');
|
||||||
|
// },
|
||||||
|
// )
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget getWeChatListItem(
|
||||||
|
BuildContext context,
|
||||||
|
ContactInfo model, {
|
||||||
|
double susHeight = 40,
|
||||||
|
Color? defHeaderBgColor,
|
||||||
|
}) {
|
||||||
|
return getWeChatItem(context, model, defHeaderBgColor: defHeaderBgColor);
|
||||||
|
// return Column(
|
||||||
|
// mainAxisSize: MainAxisSize.min,
|
||||||
|
// children: <Widget>[
|
||||||
|
// Offstage(
|
||||||
|
// offstage: !(model.isShowSuspension == true),
|
||||||
|
// child: getSusItem(context, model.getSuspensionTag(),
|
||||||
|
// susHeight: susHeight),
|
||||||
|
// ),
|
||||||
|
// getWeChatItem(context, model, defHeaderBgColor: defHeaderBgColor),
|
||||||
|
// ],
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
static Widget getWeChatItem(
|
||||||
|
BuildContext context,
|
||||||
|
ContactInfo model, {
|
||||||
|
Color? defHeaderBgColor,
|
||||||
|
}) {
|
||||||
|
DecorationImage? image;
|
||||||
|
// if (model.img != null && model.img.isNotEmpty) {
|
||||||
|
// image = DecorationImage(
|
||||||
|
// image: CachedNetworkImageProvider(model.img),
|
||||||
|
// fit: BoxFit.contain,
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
return ListTile(
|
||||||
|
leading: Container(
|
||||||
|
width: 36,
|
||||||
|
height: 36,
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
shape: BoxShape.rectangle,
|
||||||
|
borderRadius: BorderRadius.circular(4.0),
|
||||||
|
color: model.bgColor ?? defHeaderBgColor,
|
||||||
|
image: image,
|
||||||
|
),
|
||||||
|
child: model.iconData == null
|
||||||
|
? null
|
||||||
|
: Icon(
|
||||||
|
model.iconData,
|
||||||
|
color: Colors.white,
|
||||||
|
size: 20,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
title: Text(model.name),
|
||||||
|
onTap: () {
|
||||||
|
LogUtil.e("onItemClick : $model");
|
||||||
|
Utils.showSnackBar(context, 'onItemClick : ${model.name}');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,10 +1,13 @@
|
|||||||
|
import 'package:azlistview/azlistview.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
|
||||||
import '../../app_settings/app_colors.dart';
|
import '../../app_settings/app_colors.dart';
|
||||||
import '../../tools/titleAppBar.dart';
|
import '../../tools/titleAppBar.dart';
|
||||||
import '../../translations/trans_lib.dart';
|
import '../../translations/trans_lib.dart';
|
||||||
|
import 'common/countries_model.dart';
|
||||||
|
import 'common/index.dart';
|
||||||
|
|
||||||
class SeletCountryRegionPage extends StatefulWidget {
|
class SeletCountryRegionPage extends StatefulWidget {
|
||||||
const SeletCountryRegionPage({Key? key}) : super(key: key);
|
const SeletCountryRegionPage({Key? key}) : super(key: key);
|
||||||
@ -14,14 +17,67 @@ class SeletCountryRegionPage extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _SeletCountryRegionPageState extends State<SeletCountryRegionPage> {
|
class _SeletCountryRegionPageState extends State<SeletCountryRegionPage> {
|
||||||
|
List<CountriesModel> countriesList = [];
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
super.initState();
|
||||||
|
|
||||||
|
SuspensionUtil.setShowSuspensionStatus(
|
||||||
|
countriesList.cast<ISuspensionBean>());
|
||||||
|
Future.delayed(const Duration(milliseconds: 500), () {
|
||||||
|
loadData();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<String> loadJsonFromAssets(String assetsPath) async {
|
||||||
|
return await rootBundle.loadString(assetsPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loadData() async {
|
||||||
|
//加载国家列表
|
||||||
|
String jsonData = await loadJsonFromAssets('assets/countries.json');
|
||||||
|
countriesList.clear();
|
||||||
|
List list = json.decode(jsonData);
|
||||||
|
for (var v in list) {
|
||||||
|
countriesList.add(CountriesModel.fromJson(v));
|
||||||
|
}
|
||||||
|
|
||||||
|
_handleList(countriesList);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleList(List<CountriesModel> list) {
|
||||||
|
if (list.isEmpty) return;
|
||||||
|
for (int i = 0, length = list.length; i < length; i++) {
|
||||||
|
CountriesModel countryModel = list[i];
|
||||||
|
// String pinyin = PinyinHelper.getPinyinE(list[i].name);
|
||||||
|
String tag = countryModel.pinyin!.substring(0, 1).toUpperCase();
|
||||||
|
// list[i].pinyin = pinyin;
|
||||||
|
if (RegExp('[A-Z]').hasMatch(tag)) {
|
||||||
|
list[i].tagIndex = tag;
|
||||||
|
} else {
|
||||||
|
list[i].tagIndex = '#';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// A-Z sort.
|
||||||
|
SuspensionUtil.sortListBySuspensionTag(list);
|
||||||
|
// show sus tag.
|
||||||
|
SuspensionUtil.setShowSuspensionStatus(countriesList);
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
resizeToAvoidBottomInset: false,
|
resizeToAvoidBottomInset: false,
|
||||||
backgroundColor: const Color(0xFFFFFFFF),
|
backgroundColor: const Color(0xFFFFFFFF),
|
||||||
appBar: TitleAppBar(barTitle: "${TranslationLoader.lanKeys!.selet!.tr} ${TranslationLoader.lanKeys!.countryAndRegion!.tr}", haveBack:true, backgroundColor: AppColors.mainColor, actionsList: [
|
appBar: TitleAppBar(
|
||||||
|
barTitle:
|
||||||
|
"${TranslationLoader.lanKeys!.selet!.tr} ${TranslationLoader.lanKeys!.countryAndRegion!.tr}",
|
||||||
|
haveBack: true,
|
||||||
|
backgroundColor: AppColors.mainColor,
|
||||||
|
actionsList: [
|
||||||
TextButton(
|
TextButton(
|
||||||
child: Text(
|
child: Text(
|
||||||
TranslationLoader.lanKeys!.reset!.tr,
|
TranslationLoader.lanKeys!.reset!.tr,
|
||||||
@ -31,18 +87,23 @@ class _SeletCountryRegionPageState extends State<SeletCountryRegionPage> {
|
|||||||
Navigator.pop(context, {'code': "+86", "countryId": "9"});
|
Navigator.pop(context, {'code': "+86", "countryId": "9"});
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
],),
|
],
|
||||||
body:ListView(
|
),
|
||||||
padding: EdgeInsets.only(top: 40.h, left: 40.w, right: 40.w),
|
body: AzListView(
|
||||||
children: [
|
data: countriesList,
|
||||||
|
itemCount: countriesList.length,
|
||||||
],
|
itemBuilder: (BuildContext context, int index) {
|
||||||
)
|
CountriesModel model = countriesList[index];
|
||||||
|
return Utils.getListItem(context, model);
|
||||||
|
},
|
||||||
|
padding: EdgeInsets.zero,
|
||||||
|
susItemBuilder: (BuildContext context, int index) {
|
||||||
|
CountriesModel model = countriesList[index];
|
||||||
|
String tag = model.getSuspensionTag();
|
||||||
|
return Utils.getSusItem(context, tag);
|
||||||
|
},
|
||||||
|
indexBarData: ['★', ...kIndexBarData],
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
_backBtnAction(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -124,8 +124,8 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
// margin: EdgeInsets.only(left: 20.w),
|
// margin: EdgeInsets.only(left: 20.w),
|
||||||
child: Image(
|
child: Image(
|
||||||
width: 40.w,
|
width: 30.w,
|
||||||
height: 40.w,
|
height: 30.w,
|
||||||
image: const AssetImage("images/icon_left_black.png"),
|
image: const AssetImage("images/icon_left_black.png"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -135,7 +135,7 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
),
|
),
|
||||||
Text("$_year-$_month",
|
Text("$_year-$_month",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 34.sp,
|
fontSize: 28.sp,
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
fontWeight: FontWeight.w500)),
|
fontWeight: FontWeight.w500)),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
@ -148,8 +148,8 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
child: Container(
|
child: Container(
|
||||||
// margin: EdgeInsets.only(right: 20.sp),
|
// margin: EdgeInsets.only(right: 20.sp),
|
||||||
child: Image(
|
child: Image(
|
||||||
width: 40.w,
|
width: 30.w,
|
||||||
height: 40.h,
|
height: 30.w,
|
||||||
image: const AssetImage("images/icon_right_black.png"),
|
image: const AssetImage("images/icon_right_black.png"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -195,7 +195,7 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
color: index == 5 || index == 6
|
color: index == 5 || index == 6
|
||||||
? const Color(0xFFC4C8D0)
|
? const Color(0xFFC4C8D0)
|
||||||
: const Color(0xFF3C3E43),
|
: const Color(0xFF3C3E43),
|
||||||
fontSize: 30.sp),
|
fontSize: 26.sp),
|
||||||
));
|
));
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@ -267,13 +267,13 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
//设置选中字体颜色,以及周末和工作日颜色
|
//设置选中字体颜色,以及周末和工作日颜色
|
||||||
style: _datas[index].isSelect!
|
style: _datas[index].isSelect!
|
||||||
? TextStyle(
|
? TextStyle(
|
||||||
fontSize: 32.sp, color: const Color(0xFFFFFFFF))
|
fontSize: 24.sp, color: const Color(0xFFFFFFFF))
|
||||||
: (index % 7 == 5 || index % 7 == 6
|
: (index % 7 == 5 || index % 7 == 6
|
||||||
? TextStyle(
|
? TextStyle(
|
||||||
fontSize: 32.sp,
|
fontSize: 24.sp,
|
||||||
color: const Color(0xFFC4C8D0))
|
color: const Color(0xFFC4C8D0))
|
||||||
: TextStyle(
|
: TextStyle(
|
||||||
fontSize: 32.sp,
|
fontSize: 24.sp,
|
||||||
color: const Color(0xFF3C3E43))),
|
color: const Color(0xFF3C3E43))),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -316,7 +316,7 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
"月统计",
|
"月统计",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 32.sp,
|
fontSize: 26.sp,
|
||||||
fontWeight: FontWeight.w500),
|
fontWeight: FontWeight.w500),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -344,22 +344,22 @@ class _CheckingInDetailPageState extends State<CheckingInDetailPage> {
|
|||||||
children: [
|
children: [
|
||||||
SizedBox(width: 20.w),
|
SizedBox(width: 20.w),
|
||||||
Container(
|
Container(
|
||||||
width: 35.w,
|
width: 30.w,
|
||||||
height: 35.w,
|
height: 30.w,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: color,
|
color: color,
|
||||||
borderRadius: BorderRadius.all(Radius.circular(35.h))),
|
borderRadius: BorderRadius.all(Radius.circular(30.h))),
|
||||||
),
|
),
|
||||||
SizedBox(width: 20.w),
|
SizedBox(width: 20.w),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(leftTitel,
|
child: Text(leftTitel,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 28.sp, fontWeight: FontWeight.w500))),
|
fontSize: 24.sp, fontWeight: FontWeight.w500))),
|
||||||
SizedBox(width: 20.w),
|
SizedBox(width: 20.w),
|
||||||
Text(rightTitle,
|
Text(rightTitle,
|
||||||
textAlign: TextAlign.end,
|
textAlign: TextAlign.end,
|
||||||
style:
|
style:
|
||||||
TextStyle(fontSize: 28.sp, fontWeight: FontWeight.w500)),
|
TextStyle(fontSize: 24.sp, fontWeight: FontWeight.w500)),
|
||||||
SizedBox(width: 10.w),
|
SizedBox(width: 10.w),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
@ -121,11 +121,17 @@ class _LockSetPageState extends State<LockSetPage> {
|
|||||||
CommonItem(
|
CommonItem(
|
||||||
leftTitel: TranslationLoader.lanKeys!.unlockQRCode!.tr,
|
leftTitel: TranslationLoader.lanKeys!.unlockQRCode!.tr,
|
||||||
rightTitle: "",
|
rightTitle: "",
|
||||||
isHaveLine: false,
|
isHaveLine: true,
|
||||||
isHaveDirection: true,
|
isHaveDirection: true,
|
||||||
action: () {
|
action: () {
|
||||||
Navigator.pushNamed(context, Routers.unlockQRCodePage);
|
Navigator.pushNamed(context, Routers.unlockQRCodePage);
|
||||||
}),
|
}),
|
||||||
|
CommonItem(
|
||||||
|
leftTitel: 'WiFi配网',
|
||||||
|
rightTitle: "",
|
||||||
|
isHaveLine: false,
|
||||||
|
isHaveDirection: true,
|
||||||
|
action: () {}),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
height: 10.h,
|
height: 10.h,
|
||||||
),
|
),
|
||||||
|
|||||||
@ -149,6 +149,15 @@ class _LockDetailPageState extends State<LockDetailPage> {
|
|||||||
Navigator.pushNamed(context, Routers.otherTypeKeyListPage,
|
Navigator.pushNamed(context, Routers.otherTypeKeyListPage,
|
||||||
arguments: 2);
|
arguments: 2);
|
||||||
}),
|
}),
|
||||||
|
//可视对讲门锁新增->人脸、监控
|
||||||
|
bottomItem('images/main/icon_main_fingerprint.png', '人脸', () {
|
||||||
|
// Navigator.pushNamed(context, Routers.otherTypeKeyListPage,
|
||||||
|
// arguments: 1);
|
||||||
|
}),
|
||||||
|
bottomItem('images/main/icon_main_fingerprint.png', '监控', () {
|
||||||
|
// Navigator.pushNamed(context, Routers.otherTypeKeyListPage,
|
||||||
|
// arguments: 1);
|
||||||
|
}),
|
||||||
bottomItem('images/main/icon_main_authorizedAdmin.png',
|
bottomItem('images/main/icon_main_authorizedAdmin.png',
|
||||||
TranslationLoader.lanKeys!.authorizedAdmin!.tr, () {
|
TranslationLoader.lanKeys!.authorizedAdmin!.tr, () {
|
||||||
Navigator.pushNamed(context, Routers.authorizedAdminListPage);
|
Navigator.pushNamed(context, Routers.authorizedAdminListPage);
|
||||||
|
|||||||
@ -83,7 +83,13 @@ class _OtherTypeKeyDetailPageState extends State<OtherTypeKeyDetailPage> {
|
|||||||
action: () {
|
action: () {
|
||||||
Navigator.pushNamed(context, Routers.keyOperationRecordPage);
|
Navigator.pushNamed(context, Routers.keyOperationRecordPage);
|
||||||
}),
|
}),
|
||||||
Container(height: 40.h),
|
SizedBox(
|
||||||
|
height: 40.h,
|
||||||
|
),
|
||||||
|
addControlsBtn(type),
|
||||||
|
SizedBox(
|
||||||
|
height: 30.h,
|
||||||
|
),
|
||||||
SubmitBtn(
|
SubmitBtn(
|
||||||
btnName: TranslationLoader.lanKeys!.delete!.tr,
|
btnName: TranslationLoader.lanKeys!.delete!.tr,
|
||||||
isDelete: true,
|
isDelete: true,
|
||||||
@ -97,6 +103,96 @@ class _OtherTypeKeyDetailPageState extends State<OtherTypeKeyDetailPage> {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Widget addControlsBtn(int type) {
|
||||||
|
List<Widget> widgetList = [];
|
||||||
|
List<Map<String, dynamic>> routerList = [];
|
||||||
|
//卡详情
|
||||||
|
if (type == 0) {
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置密码',
|
||||||
|
'routerName': Routers.passwordKeyDetailPage,
|
||||||
|
'type': 9
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置指纹',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 1
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置遥控',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 2
|
||||||
|
});
|
||||||
|
} else if (type == 1) {
|
||||||
|
//指纹详情
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置密码',
|
||||||
|
'routerName': Routers.passwordKeyDetailPage,
|
||||||
|
'type': 9
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置卡',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 0
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置遥控',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 2
|
||||||
|
});
|
||||||
|
} else if (type == 2) {
|
||||||
|
//遥控详情
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置密码',
|
||||||
|
'routerName': Routers.passwordKeyDetailPage,
|
||||||
|
'type': 9
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置卡',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 0
|
||||||
|
});
|
||||||
|
routerList.add({
|
||||||
|
'btnTitle': '设置指纹',
|
||||||
|
'routerName': Routers.otherTypeKeyManagePage,
|
||||||
|
'type': 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < routerList.length; i++) {
|
||||||
|
widgetList.add(SizedBox(
|
||||||
|
width: ScreenUtil().screenWidth - 40.w,
|
||||||
|
height: 60.h,
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
// backgroundColor: Colors.white,
|
||||||
|
side: BorderSide(width: 1, color: AppColors.mainColor)),
|
||||||
|
onPressed: () {
|
||||||
|
if (routerList[i]['type'] == 9) {
|
||||||
|
Navigator.pushNamed(context, Routers.passwordKeyManagePage);
|
||||||
|
} else {
|
||||||
|
Navigator.pushNamed(context, Routers.otherTypeKeyManagePage,
|
||||||
|
arguments: routerList[i]['type']);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
routerList[i]['btnTitle'],
|
||||||
|
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||||
|
)),
|
||||||
|
));
|
||||||
|
|
||||||
|
widgetList.add(
|
||||||
|
SizedBox(
|
||||||
|
height: 10.h,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Column(
|
||||||
|
children: widgetList,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
String getAppBarTitle(int type) {
|
String getAppBarTitle(int type) {
|
||||||
String title = "";
|
String title = "";
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
|
import 'package:star_lock/tools/shareModule/sharePopup.dart';
|
||||||
|
|
||||||
import '../../../../appRouters.dart';
|
import '../../../../appRouters.dart';
|
||||||
import '../../../../app_settings/app_colors.dart';
|
import '../../../../app_settings/app_colors.dart';
|
||||||
@ -90,6 +91,63 @@ class _PasswordKeyDetailPageState extends State<PasswordKeyDetailPage> {
|
|||||||
Navigator.pushNamed(context, Routers.keyOperationRecordPage);
|
Navigator.pushNamed(context, Routers.keyOperationRecordPage);
|
||||||
}),
|
}),
|
||||||
Container(height: 40.h),
|
Container(height: 40.h),
|
||||||
|
SizedBox(
|
||||||
|
width: ScreenUtil().screenWidth - 40.w,
|
||||||
|
height: 60.h,
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
// backgroundColor: Colors.white,
|
||||||
|
side: BorderSide(width: 1, color: AppColors.mainColor)),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pushNamed(context, Routers.otherTypeKeyManagePage,
|
||||||
|
arguments: 0);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
'设置卡',
|
||||||
|
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10.h,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: ScreenUtil().screenWidth - 40.w,
|
||||||
|
height: 60.h,
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
// backgroundColor: Colors.white,
|
||||||
|
side: BorderSide(width: 1, color: AppColors.mainColor)),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pushNamed(context, Routers.otherTypeKeyManagePage,
|
||||||
|
arguments: 1);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
'设置指纹',
|
||||||
|
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 10.h,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: ScreenUtil().screenWidth - 40.w,
|
||||||
|
height: 60.h,
|
||||||
|
child: OutlinedButton(
|
||||||
|
style: OutlinedButton.styleFrom(
|
||||||
|
// backgroundColor: Colors.white,
|
||||||
|
side: BorderSide(width: 1, color: AppColors.mainColor)),
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.pushNamed(context, Routers.otherTypeKeyManagePage,
|
||||||
|
arguments: 2);
|
||||||
|
},
|
||||||
|
child: Text(
|
||||||
|
'设置遥控',
|
||||||
|
style: TextStyle(color: AppColors.mainColor, fontSize: 24.sp),
|
||||||
|
)),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
height: 30.h,
|
||||||
|
),
|
||||||
SubmitBtn(
|
SubmitBtn(
|
||||||
btnName: TranslationLoader.lanKeys!.delete!.tr,
|
btnName: TranslationLoader.lanKeys!.delete!.tr,
|
||||||
isDelete: true,
|
isDelete: true,
|
||||||
|
|||||||
@ -22,7 +22,7 @@ class _SeletLockTypePageState extends State<SeletLockTypePage> with BaseWidget {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
backgroundColor: AppColors.mainBackgroundColor,
|
backgroundColor: AppColors.mainBackgroundColor,
|
||||||
appBar: TitleAppBar(
|
appBar: TitleAppBar(
|
||||||
barTitle: TranslationLoader.lanKeys!.addLock!.tr,
|
barTitle: TranslationLoader.lanKeys!.selectLockType!.tr,
|
||||||
haveBack: true,
|
haveBack: true,
|
||||||
backgroundColor: AppColors.mainColor),
|
backgroundColor: AppColors.mainColor),
|
||||||
body: Column(
|
body: Column(
|
||||||
@ -41,6 +41,10 @@ class _SeletLockTypePageState extends State<SeletLockTypePage> with BaseWidget {
|
|||||||
TranslationLoader.lanKeys!.doorLock!.tr, () {
|
TranslationLoader.lanKeys!.doorLock!.tr, () {
|
||||||
Navigator.pushNamed(context, Routers.addLockPage);
|
Navigator.pushNamed(context, Routers.addLockPage);
|
||||||
}),
|
}),
|
||||||
|
lockTypeItem('images/lockType/lockType_doorLock.png',
|
||||||
|
TranslationLoader.lanKeys!.NFCPassiveLock!.tr, () {
|
||||||
|
Navigator.pushNamed(context, Routers.addLockPage);
|
||||||
|
}),
|
||||||
lockTypeItem('images/lockType/lockType_padlock.png',
|
lockTypeItem('images/lockType/lockType_padlock.png',
|
||||||
TranslationLoader.lanKeys!.padlock!.tr, () {
|
TranslationLoader.lanKeys!.padlock!.tr, () {
|
||||||
Navigator.pushNamed(context, Routers.addLockPage);
|
Navigator.pushNamed(context, Routers.addLockPage);
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
|
|||||||
import 'package:get/get_utils/get_utils.dart';
|
import 'package:get/get_utils/get_utils.dart';
|
||||||
import 'package:star_lock/appRouters.dart';
|
import 'package:star_lock/appRouters.dart';
|
||||||
import 'package:star_lock/app_settings/app_colors.dart';
|
import 'package:star_lock/app_settings/app_colors.dart';
|
||||||
|
import 'package:star_lock/tools/ExpandedListView.dart';
|
||||||
import 'package:star_lock/tools/submitBtn.dart';
|
import 'package:star_lock/tools/submitBtn.dart';
|
||||||
import 'package:star_lock/translations/trans_lib.dart';
|
import 'package:star_lock/translations/trans_lib.dart';
|
||||||
|
|
||||||
@ -97,20 +98,14 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
child: ListView.separated(
|
child: ListView.separated(
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
return _buildNameWidget(
|
return _buildNameExpandedList(context, index, "张三");
|
||||||
context, index, 'images/icon_password.png', '密码1');
|
|
||||||
} else if (index == 1) {
|
} else if (index == 1) {
|
||||||
return _buildNameWidget(
|
return _buildNameExpandedList(context, index, "李四");
|
||||||
context, index, 'images/icon_card.png', '卡1');
|
|
||||||
} else if (index == 2) {
|
} else if (index == 2) {
|
||||||
return _buildNameWidget(
|
return _buildNameExpandedList(context, index, "王二");
|
||||||
context, index, 'images/icon_fingerprint.png', '指纹1');
|
} else {
|
||||||
} else if (index == 3) {
|
return _buildNameExpandedList(context, index, "麻子");
|
||||||
return _buildNameWidget(
|
|
||||||
context, index, 'images/icon_card.png', '遥控1');
|
|
||||||
}
|
}
|
||||||
return null;
|
|
||||||
// return _buildNameWidget(context, index);
|
|
||||||
},
|
},
|
||||||
separatorBuilder: (context, index) {
|
separatorBuilder: (context, index) {
|
||||||
return const Divider(
|
return const Divider(
|
||||||
@ -141,17 +136,13 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
child: ListView.separated(
|
child: ListView.separated(
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
return _buildDeviceWidget(
|
return _buildDeviceExpandedList(context, index, "大门锁");
|
||||||
context, index, 'images/icon_lock.png', "大门锁");
|
|
||||||
} else if (index == 1) {
|
} else if (index == 1) {
|
||||||
return _buildDeviceWidget(
|
return _buildDeviceExpandedList(context, index, "办公室锁");
|
||||||
context, index, 'images/icon_lock.png', "办公室锁");
|
|
||||||
} else if (index == 2) {
|
} else if (index == 2) {
|
||||||
return _buildDeviceWidget(
|
return _buildDeviceExpandedList(context, index, "会议室锁");
|
||||||
context, index, 'images/icon_lock.png', "会议室锁");
|
|
||||||
} else {
|
} else {
|
||||||
return _buildDeviceWidget(
|
return _buildDeviceExpandedList(context, index, "宴会厅锁");
|
||||||
context, index, 'images/icon_lock.png', "宴会厅锁");
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
separatorBuilder: (context, index) {
|
separatorBuilder: (context, index) {
|
||||||
@ -172,10 +163,85 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//设备多层级列表
|
||||||
|
Widget _buildDeviceExpandedList(context, index, deviceName) {
|
||||||
|
return ExpandedListTile(
|
||||||
|
onTap: () => print("onTap."),
|
||||||
|
title: deviceName,
|
||||||
|
imgName: 'images/icon_lock.png',
|
||||||
|
typeImgList: const [],
|
||||||
|
child: ListView.separated(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: 10,
|
||||||
|
itemBuilder: (_, index) {
|
||||||
|
if (index == 0) {
|
||||||
|
return _buildNameWidget(
|
||||||
|
context, index, 'images/icon_password.png', '张三');
|
||||||
|
} else if (index == 1) {
|
||||||
|
return _buildNameWidget(
|
||||||
|
context, index, 'images/icon_card.png', '李四');
|
||||||
|
} else if (index == 2) {
|
||||||
|
return _buildNameWidget(
|
||||||
|
context, index, 'images/icon_fingerprint.png', '王二');
|
||||||
|
} else if (index == 3) {
|
||||||
|
return _buildNameWidget(
|
||||||
|
context, index, 'images/icon_card.png', '麻子');
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
separatorBuilder: (BuildContext context, int index) {
|
||||||
|
return const Divider(
|
||||||
|
height: 1,
|
||||||
|
color: AppColors.greyLineColor,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//姓名多层级列表
|
||||||
|
Widget _buildNameExpandedList(context, index, deviceName) {
|
||||||
|
return ExpandedListTile(
|
||||||
|
onTap: () => print("onTap."),
|
||||||
|
title: deviceName,
|
||||||
|
imgName: 'images/controls_user.png',
|
||||||
|
typeImgList: const ['images/icon_password.png', 'images/icon_card.png'],
|
||||||
|
child: ListView.separated(
|
||||||
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
|
shrinkWrap: true,
|
||||||
|
itemCount: 5,
|
||||||
|
itemBuilder: (_, index) {
|
||||||
|
if (index == 0) {
|
||||||
|
return _buildDeviceWidget(
|
||||||
|
context, index, 'images/icon_lock.png', "大门锁");
|
||||||
|
} else if (index == 1) {
|
||||||
|
return _buildDeviceWidget(
|
||||||
|
context, index, 'images/icon_lock.png', "办公室锁");
|
||||||
|
} else if (index == 2) {
|
||||||
|
return _buildDeviceWidget(
|
||||||
|
context, index, 'images/icon_lock.png', "会议室锁");
|
||||||
|
} else {
|
||||||
|
return _buildDeviceWidget(
|
||||||
|
context, index, 'images/icon_lock.png', "宴会厅锁");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
separatorBuilder: (BuildContext context, int index) {
|
||||||
|
return const Divider(
|
||||||
|
height: 1,
|
||||||
|
color: AppColors.greyLineColor,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
//单个姓名行
|
||||||
Widget _buildNameWidget(context, index, imageName, getName) {
|
Widget _buildNameWidget(context, index, imageName, getName) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 90.h,
|
height: 60.h,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
width: ScreenUtil().screenWidth,
|
width: ScreenUtil().screenWidth,
|
||||||
child: Row(
|
child: Row(
|
||||||
@ -184,7 +250,7 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
width: 30.w,
|
width: 30.w,
|
||||||
),
|
),
|
||||||
Image.asset(
|
Image.asset(
|
||||||
imageName,
|
'images/controls_user.png',
|
||||||
width: 36.w,
|
width: 36.w,
|
||||||
height: 36.w,
|
height: 36.w,
|
||||||
),
|
),
|
||||||
@ -193,18 +259,8 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
getName,
|
getName,
|
||||||
style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor),
|
style: TextStyle(
|
||||||
),
|
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
|
||||||
Expanded(
|
|
||||||
child: SizedBox(
|
|
||||||
width: 20.w,
|
|
||||||
)),
|
|
||||||
Image.asset(
|
|
||||||
isNameSelect == false
|
|
||||||
? 'images/icon_round_unSelet.png'
|
|
||||||
: 'images/icon_round_selet.png',
|
|
||||||
width: 30.sp,
|
|
||||||
height: 30.sp,
|
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 30.w,
|
width: 30.w,
|
||||||
@ -223,10 +279,11 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//单个设备行
|
||||||
Widget _buildDeviceWidget(context, index, imageName, deviceName) {
|
Widget _buildDeviceWidget(context, index, imageName, deviceName) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 90.h,
|
height: 60.h,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
width: ScreenUtil().screenWidth,
|
width: ScreenUtil().screenWidth,
|
||||||
child: Row(
|
child: Row(
|
||||||
@ -244,18 +301,8 @@ class _AuthorityManagementPageState extends State<AuthorityManagementPage>
|
|||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
deviceName,
|
deviceName,
|
||||||
style: TextStyle(fontSize: 22.sp, color: AppColors.blackColor),
|
style: TextStyle(
|
||||||
),
|
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
|
||||||
Expanded(
|
|
||||||
child: SizedBox(
|
|
||||||
width: 20.w,
|
|
||||||
)),
|
|
||||||
Image.asset(
|
|
||||||
isDeviceSelect == false
|
|
||||||
? 'images/icon_round_unSelet.png'
|
|
||||||
: 'images/icon_round_selet.png',
|
|
||||||
width: 30.sp,
|
|
||||||
height: 30.sp,
|
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
width: 30.w,
|
width: 30.w,
|
||||||
|
|||||||
@ -54,16 +54,16 @@ class _GetNameListPageState extends State<GetNameListPage> {
|
|||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (index == 0) {
|
if (index == 0) {
|
||||||
return _buildNameWidget(
|
return _buildNameWidget(
|
||||||
context, index, 'images/icon_password.png', '密码1');
|
context, index, 'images/controls_user.png', '张三');
|
||||||
} else if (index == 1) {
|
} else if (index == 1) {
|
||||||
return _buildNameWidget(
|
return _buildNameWidget(
|
||||||
context, index, 'images/icon_card.png', '卡1');
|
context, index, 'images/controls_user.png', '李四');
|
||||||
} else if (index == 2) {
|
} else if (index == 2) {
|
||||||
return _buildNameWidget(
|
return _buildNameWidget(
|
||||||
context, index, 'images/icon_fingerprint.png', '指纹1');
|
context, index, 'images/controls_user.png', '王二');
|
||||||
} else if (index == 3) {
|
} else if (index == 3) {
|
||||||
return _buildNameWidget(
|
return _buildNameWidget(
|
||||||
context, index, 'images/icon_card.png', '遥控1');
|
context, index, 'images/controls_user.png', '麻子');
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,8 +1,6 @@
|
|||||||
|
|
||||||
abstract class Api {
|
abstract class Api {
|
||||||
|
|
||||||
// final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工
|
// final String baseUrl = "http://test.lock.star-lock.cn/api"; // 葛工
|
||||||
final String baseUrl = "https://lock.star-lock.cn/api";// 测试环境
|
final String baseUrl = "https://lock.star-lock.cn/api"; // 测试环境
|
||||||
|
|
||||||
// 登录注册
|
// 登录注册
|
||||||
final String getVerificationCodeUrl = '/user/sendValidationCode';
|
final String getVerificationCodeUrl = '/user/sendValidationCode';
|
||||||
@ -10,5 +8,5 @@ abstract class Api {
|
|||||||
final String getSliderVerifyImgUrl = '/user/getSliderVerifyImg';
|
final String getSliderVerifyImgUrl = '/user/getSliderVerifyImg';
|
||||||
final String checkImgUrl = '/user/isSliderValid';
|
final String checkImgUrl = '/user/isSliderValid';
|
||||||
final String loginUrl = '/user/login';
|
final String loginUrl = '/user/login';
|
||||||
|
final String resetPasswordURL = '/user/resetPassword'; //重置密码
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,70 +1,96 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'api_provider_base.dart';
|
import 'api_provider_base.dart';
|
||||||
|
|
||||||
class ApiProvider extends BaseProvider {
|
class ApiProvider extends BaseProvider {
|
||||||
|
Future<Response> getVerificationCode(String countryCode, String account,
|
||||||
|
String channel, String codeType, String uniqueid, String xWidth) =>
|
||||||
|
post(
|
||||||
|
getVerificationCodeUrl.toUrl,
|
||||||
|
jsonEncode({
|
||||||
|
'countryCode': countryCode,
|
||||||
|
'account': account,
|
||||||
|
"channel": channel,
|
||||||
|
'codeType': codeType,
|
||||||
|
"uniqueid": uniqueid,
|
||||||
|
'xWidth': xWidth,
|
||||||
|
}));
|
||||||
|
|
||||||
Future<Response> getVerificationCode(
|
Future<Response> register(String countryCode, String countryId, String mobile,
|
||||||
String countryCode,
|
String password, String uniqueid, String verificationCode) =>
|
||||||
String account,
|
post(registerUrl.toUrl, null, query: {
|
||||||
String channel,
|
'countryCode': countryCode,
|
||||||
String uniqueid,
|
'countryId': countryId,
|
||||||
String xWidth) => post(getVerificationCodeUrl.toUrl, null, query: {
|
"mobile": mobile,
|
||||||
'countryCode':countryCode,
|
'password': password,
|
||||||
'account':account,
|
'platId': "2",
|
||||||
"channel":channel,
|
"uniqueid": uniqueid,
|
||||||
'codeType':"1",
|
'verificationCode': verificationCode,
|
||||||
"uniqueid":uniqueid,
|
});
|
||||||
'xWidth':xWidth,
|
|
||||||
});
|
|
||||||
|
|
||||||
Future<Response> register(
|
// post(
|
||||||
String countryCode,
|
// registerUrl.toUrl,
|
||||||
String countryId,
|
// jsonEncode({
|
||||||
String mobile,
|
// 'countryCode': countryCode,
|
||||||
String password,
|
// 'countryId': countryId,
|
||||||
String uniqueid,
|
// "mobile": mobile,
|
||||||
String verificationCode) => post(registerUrl.toUrl, null,query: {
|
// 'password': password,
|
||||||
'countryCode':countryCode,
|
// 'platId': "2",
|
||||||
'countryId':countryId,
|
// "uniqueid": uniqueid,
|
||||||
"mobile":mobile,
|
// 'verificationCode': verificationCode,
|
||||||
'password':password,
|
// }));
|
||||||
'platId':"2",
|
|
||||||
"uniqueid":uniqueid,
|
|
||||||
'verificationCode':verificationCode,
|
|
||||||
});
|
|
||||||
|
|
||||||
Future<Response> getSliderVerifyImg(
|
Future<Response> getSliderVerifyImg(String countryCode, String account) =>
|
||||||
String countryCode,
|
post(
|
||||||
String account) => post(getSliderVerifyImgUrl.toUrl, null,query: {
|
getSliderVerifyImgUrl.toUrl,
|
||||||
'countryCode':countryCode,
|
jsonEncode({
|
||||||
'account':account,
|
'countryCode': countryCode,
|
||||||
});
|
'account': account,
|
||||||
|
}));
|
||||||
|
|
||||||
Future<Response> checkSliderVerifyImg(
|
Future<Response> checkSliderVerifyImg(
|
||||||
String countryCode,
|
String countryCode, String account, String xWidth) =>
|
||||||
String account,
|
post(
|
||||||
String xWidth) => post(checkImgUrl.toUrl, null,query: {
|
checkImgUrl.toUrl,
|
||||||
'countryCode':countryCode,
|
jsonEncode({
|
||||||
'account':account,
|
'countryCode': countryCode,
|
||||||
'xWidth':xWidth,
|
'account': account,
|
||||||
});
|
'xWidth': xWidth,
|
||||||
|
}));
|
||||||
|
|
||||||
Future<Response> login(
|
Future<Response> login(String loginType, String password, String countryCode,
|
||||||
String loginType,
|
String username) =>
|
||||||
String password,
|
post(
|
||||||
String countryCode,
|
loginUrl.toUrl,
|
||||||
String username) => post(loginUrl.toUrl, null,query: {
|
jsonEncode({
|
||||||
'loginType':loginType,
|
'loginType': loginType,
|
||||||
'password':password,
|
'password': password,
|
||||||
"platId":"2",
|
"platId": "2",
|
||||||
'uniqueid':"477E6814-289D-402A-9F49-F89A8BD05D63",
|
'uniqueid': "477E6814-289D-402A-9F49-F89A8BD05D63",
|
||||||
'countryCode':countryCode,
|
'countryCode': countryCode,
|
||||||
"username":username
|
"username": username
|
||||||
});
|
}));
|
||||||
|
|
||||||
|
Future<Response> resetPassword(
|
||||||
|
String countryCode,
|
||||||
|
String account,
|
||||||
|
String date,
|
||||||
|
String newPassword,
|
||||||
|
String uniqueid,
|
||||||
|
String verificationCode) =>
|
||||||
|
post(
|
||||||
|
resetPasswordURL.toUrl,
|
||||||
|
jsonEncode({
|
||||||
|
'countryCode': countryCode,
|
||||||
|
'account': account,
|
||||||
|
"date": date,
|
||||||
|
'newPassword': newPassword,
|
||||||
|
"uniqueid": uniqueid,
|
||||||
|
'verificationCode': verificationCode,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ExtensionString on String {
|
extension ExtensionString on String {
|
||||||
String get toUrl => '$this';
|
String get toUrl => '$this';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
@ -20,11 +21,23 @@ class BaseProvider extends GetConnect with Api {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<Response<T>> post<T>(String? url, body, {String? contentType, Map<String, String>? headers, Map<String, dynamic>? query, Decoder<T>? decoder, Progress? uploadProgress}) async {
|
Future<Response<T>> post<T>(String? url, body,
|
||||||
|
{String? contentType,
|
||||||
|
Map<String, String>? headers,
|
||||||
|
Map<String, dynamic>? query,
|
||||||
|
Decoder<T>? decoder,
|
||||||
|
Progress? uploadProgress}) async {
|
||||||
// print("post: url:${url} body:${body} contentType:${contentType} headers:${headers} query:${query}");
|
// print("post: url:${url} body:${body} contentType:${contentType} headers:${headers} query:${query}");
|
||||||
var res = await super.post(url, body, contentType: contentType, headers:headers, query: query, decoder:decoder, uploadProgress: uploadProgress);
|
|
||||||
if(res.body == null){
|
print('哈喽请求body体为:${body}');
|
||||||
if(EasyLoading.isShow)EasyLoading.dismiss(animation: true);
|
var res = await super.post(url, body,
|
||||||
|
contentType: contentType,
|
||||||
|
headers: headers,
|
||||||
|
query: query,
|
||||||
|
decoder: decoder,
|
||||||
|
uploadProgress: uploadProgress);
|
||||||
|
if (res.body == null) {
|
||||||
|
if (EasyLoading.isShow) EasyLoading.dismiss(animation: true);
|
||||||
var rs = {
|
var rs = {
|
||||||
"errorMsg": "Network Error!",
|
"errorMsg": "Network Error!",
|
||||||
"errorCode": -1,
|
"errorCode": -1,
|
||||||
@ -42,5 +55,4 @@ class BaseProvider extends GetConnect with Api {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
|
|||||||
@ -1,5 +1,3 @@
|
|||||||
|
|
||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart';
|
import '../common/safetyVerification/entity/CheckSafetyVerificationEntity.dart';
|
||||||
import '../common/safetyVerification/entity/SafetyVerificationEntity.dart';
|
import '../common/safetyVerification/entity/SafetyVerificationEntity.dart';
|
||||||
@ -13,15 +11,16 @@ class ApiRepository {
|
|||||||
static ApiRepository get to => Get.find<ApiRepository>();
|
static ApiRepository get to => Get.find<ApiRepository>();
|
||||||
ApiRepository(this.apiProvider);
|
ApiRepository(this.apiProvider);
|
||||||
|
|
||||||
// 发送验证码
|
// 发送验证码 1注册,2找回密码,3绑定手机号,4解绑(换绑),5删除账号
|
||||||
Future<SendValidationCodeEntity> sendValidationCode(
|
Future<SendValidationCodeEntity> sendValidationCode(
|
||||||
String countryCode,
|
String countryCode,
|
||||||
String account,
|
String account,
|
||||||
String channel,
|
String channel,
|
||||||
|
String codeType,
|
||||||
String uniqueid,
|
String uniqueid,
|
||||||
String xWidth
|
String xWidth) async {
|
||||||
) async {
|
final res = await apiProvider.getVerificationCode(
|
||||||
final res = await apiProvider.getVerificationCode(countryCode, account, channel, uniqueid, xWidth);
|
countryCode, account, channel, codeType, uniqueid, xWidth);
|
||||||
return SendValidationCodeEntity.fromJson(res.body);
|
return SendValidationCodeEntity.fromJson(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -32,38 +31,44 @@ class ApiRepository {
|
|||||||
String mobile,
|
String mobile,
|
||||||
String password,
|
String password,
|
||||||
String uniqueid,
|
String uniqueid,
|
||||||
String verificationCode
|
String verificationCode) async {
|
||||||
) async {
|
final res = await apiProvider.register(
|
||||||
final res = await apiProvider.register(countryCode, countryId, mobile, password, uniqueid, verificationCode);
|
countryCode, countryId, mobile, password, uniqueid, verificationCode);
|
||||||
return LoginEntity.fromJson(res.body);
|
return LoginEntity.fromJson(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取图片验证码
|
// 获取图片验证码
|
||||||
Future<SafetyVerificationEntity> getSliderVerifyImg(
|
Future<SafetyVerificationEntity> getSliderVerifyImg(
|
||||||
String countryCode,
|
String countryCode, String account) async {
|
||||||
String account
|
|
||||||
) async {
|
|
||||||
final res = await apiProvider.getSliderVerifyImg(countryCode, account);
|
final res = await apiProvider.getSliderVerifyImg(countryCode, account);
|
||||||
return SafetyVerificationEntity.fromJson(res.body);
|
return SafetyVerificationEntity.fromJson(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检验图片验证码
|
// 检验图片验证码
|
||||||
Future<CheckSafetyVerificationEntity> checkSliderVerifyImg(
|
Future<CheckSafetyVerificationEntity> checkSliderVerifyImg(
|
||||||
String countryCode,
|
String countryCode, String account, String xWidth) async {
|
||||||
String account,
|
final res =
|
||||||
String xWidth) async {
|
await apiProvider.checkSliderVerifyImg(countryCode, account, xWidth);
|
||||||
final res = await apiProvider.checkSliderVerifyImg(countryCode, account, xWidth);
|
|
||||||
return CheckSafetyVerificationEntity.fromJson(res.body);
|
return CheckSafetyVerificationEntity.fromJson(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<LoginEntity> login(
|
Future<LoginEntity> login(String loginType, String password,
|
||||||
String loginType,
|
String countryCode, String username) async {
|
||||||
String password,
|
final res =
|
||||||
String countryCode,
|
await apiProvider.login(loginType, password, countryCode, username);
|
||||||
String username) async {
|
|
||||||
final res = await apiProvider.login(loginType, password, countryCode, username);
|
|
||||||
return LoginEntity.fromJson(res.body);
|
return LoginEntity.fromJson(res.body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//重置密码
|
||||||
|
Future<LoginEntity> resetPassword(
|
||||||
|
String countryCode,
|
||||||
|
String account,
|
||||||
|
String date,
|
||||||
|
String newPassword,
|
||||||
|
String uniqueid,
|
||||||
|
String verificationCode) async {
|
||||||
|
final res = await apiProvider.resetPassword(
|
||||||
|
countryCode, account, date, newPassword, uniqueid, verificationCode);
|
||||||
|
return LoginEntity.fromJson(res.body);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,13 +1,12 @@
|
|||||||
|
|
||||||
|
|
||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:get/get_connect/http/src/request/request.dart';
|
import 'package:get/get_connect/http/src/request/request.dart';
|
||||||
|
|
||||||
FutureOr<Request> requestLogInterceptor(Request request) async {
|
FutureOr<Request> requestLogInterceptor(Request request) async {
|
||||||
Get.log('GET HTTP REQUEST \n${request.url} \n${request.headers} ${request.toString()} ');
|
Get.log(
|
||||||
|
'GET HTTP REQUEST \n${request.url} \n${request.headers} ${request.toString()} ');
|
||||||
Get.log(request.headers.toString());
|
Get.log(request.headers.toString());
|
||||||
EasyLoading.show();
|
EasyLoading.show();
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
|||||||
127
star_lock/lib/tools/ExpandedListView.dart
Normal file
127
star_lock/lib/tools/ExpandedListView.dart
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||||
|
import 'package:star_lock/app_settings/app_colors.dart';
|
||||||
|
|
||||||
|
class ExpandedListTile extends StatefulWidget {
|
||||||
|
const ExpandedListTile(
|
||||||
|
{Key? key,
|
||||||
|
required this.title,
|
||||||
|
this.child,
|
||||||
|
this.onTap,
|
||||||
|
required this.typeImgList,
|
||||||
|
required this.imgName})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
|
final String title;
|
||||||
|
final String imgName;
|
||||||
|
final Widget? child;
|
||||||
|
final List typeImgList;
|
||||||
|
final Function()? onTap;
|
||||||
|
|
||||||
|
@override
|
||||||
|
_ExpandedListTileState createState() => _ExpandedListTileState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ExpandedListTileState extends State<ExpandedListTile> {
|
||||||
|
bool _isExpanded = false;
|
||||||
|
final Duration _animationDuration = const Duration(milliseconds: 200);
|
||||||
|
bool _isCheck = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return Column(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
color: Colors.white,
|
||||||
|
height: 80.h,
|
||||||
|
child: Row(
|
||||||
|
children: _buildExpandRowList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
ClipRect(
|
||||||
|
child: AnimatedAlign(
|
||||||
|
heightFactor: _isExpanded ? 1.0 : 0.0,
|
||||||
|
alignment: Alignment.center,
|
||||||
|
duration: _animationDuration,
|
||||||
|
child: widget.child),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Widget> _buildExpandRowList() {
|
||||||
|
List<Widget> widgetList = [];
|
||||||
|
widgetList.add(GestureDetector(
|
||||||
|
child: Container(
|
||||||
|
color: Colors.white,
|
||||||
|
width: 80.w,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
SizedBox(
|
||||||
|
width: 30.w,
|
||||||
|
),
|
||||||
|
Image.asset(
|
||||||
|
_isCheck
|
||||||
|
? "images/icon_round_selet.png"
|
||||||
|
: "images/icon_round_unSelet.png",
|
||||||
|
width: 30.w,
|
||||||
|
height: 30.w,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 20.w,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
//点击左侧是否勾选按钮
|
||||||
|
setState(() {
|
||||||
|
_isCheck = !_isCheck;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
));
|
||||||
|
widgetList.add(GestureDetector(
|
||||||
|
child: Container(
|
||||||
|
width: ScreenUtil().screenWidth - 80.w,
|
||||||
|
color: Colors.white,
|
||||||
|
child: Row(
|
||||||
|
children: [
|
||||||
|
Image.asset(
|
||||||
|
widget.imgName,
|
||||||
|
width: 36.w,
|
||||||
|
height: 36.w,
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 10.w,
|
||||||
|
),
|
||||||
|
Text(
|
||||||
|
widget.title,
|
||||||
|
style: TextStyle(color: AppColors.blackColor, fontSize: 22.sp),
|
||||||
|
),
|
||||||
|
Expanded(
|
||||||
|
child: SizedBox(
|
||||||
|
width: 10.w,
|
||||||
|
)),
|
||||||
|
AnimatedRotation(
|
||||||
|
turns: _isExpanded ? 0 : -0.5,
|
||||||
|
duration: _animationDuration,
|
||||||
|
child: const Icon(Icons.keyboard_arrow_down),
|
||||||
|
),
|
||||||
|
SizedBox(
|
||||||
|
width: 30.w,
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
onTap: () {
|
||||||
|
//点击右侧上拉下拉按钮
|
||||||
|
setState(() {
|
||||||
|
_isExpanded = !_isExpanded;
|
||||||
|
});
|
||||||
|
widget.onTap?.call();
|
||||||
|
},
|
||||||
|
));
|
||||||
|
return widgetList;
|
||||||
|
}
|
||||||
|
}
|
||||||
105
star_lock/lib/tools/shareModule/sharePopup.dart
Normal file
105
star_lock/lib/tools/shareModule/sharePopup.dart
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class SharePopup extends StatelessWidget {
|
||||||
|
List<String> nameItems = <String>[
|
||||||
|
'微信',
|
||||||
|
'朋友圈',
|
||||||
|
'QQ',
|
||||||
|
'QQ空间',
|
||||||
|
'微博',
|
||||||
|
'FaceBook',
|
||||||
|
'邮件',
|
||||||
|
'链接'
|
||||||
|
];
|
||||||
|
List<String> urlItems = <String>[
|
||||||
|
'icon_wechat.png',
|
||||||
|
'icon_wechat_moments.png',
|
||||||
|
'icon_qq.png',
|
||||||
|
'icon_qzone.png',
|
||||||
|
'icon_sina.png',
|
||||||
|
'icon_facebook.png',
|
||||||
|
'icon_email.png',
|
||||||
|
'icon_copylink.png'
|
||||||
|
];
|
||||||
|
|
||||||
|
SharePopup({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return _shareWidget(context);
|
||||||
|
// Scaffold(
|
||||||
|
// appBar: AppBar(
|
||||||
|
// title: const Text("分享页面"),
|
||||||
|
// ),
|
||||||
|
// body: _shareWidget(context)
|
||||||
|
/*
|
||||||
|
Center(
|
||||||
|
child: Builder(builder: (BuildContext context) {
|
||||||
|
return ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
showModalBottomSheet(
|
||||||
|
context: context,
|
||||||
|
builder: (BuildContext context) {
|
||||||
|
return _shareWidget(context);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
child: const Text("我要分享"),
|
||||||
|
// color: Colors.blue
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
*/
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _shareWidget(BuildContext context) {
|
||||||
|
return SizedBox(
|
||||||
|
height: 250.0,
|
||||||
|
child: Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.fromLTRB(0.0, 10.0, 0.0, 0.0),
|
||||||
|
child: SizedBox(
|
||||||
|
height: 190.0,
|
||||||
|
child: GridView.builder(
|
||||||
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
|
crossAxisCount: 4,
|
||||||
|
mainAxisSpacing: 5.0,
|
||||||
|
childAspectRatio: 1.0),
|
||||||
|
itemBuilder: (BuildContext context, int index) {
|
||||||
|
return Column(
|
||||||
|
children: <Widget>[
|
||||||
|
Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.fromLTRB(0.0, 6.0, 0.0, 6.0),
|
||||||
|
child: Image.asset(
|
||||||
|
'images/${urlItems[index]}',
|
||||||
|
width: 50.0,
|
||||||
|
height: 50.0,
|
||||||
|
fit: BoxFit.fill,
|
||||||
|
)),
|
||||||
|
Text(nameItems[index])
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
itemCount: nameItems.length,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Container(
|
||||||
|
height: 0.5,
|
||||||
|
color: Colors.blueGrey,
|
||||||
|
),
|
||||||
|
const Center(
|
||||||
|
child: Padding(
|
||||||
|
padding: EdgeInsets.fromLTRB(0.0, 8.0, 0.0, 8.0),
|
||||||
|
child: Text(
|
||||||
|
'取 消',
|
||||||
|
style: TextStyle(fontSize: 18.0, color: Colors.blueGrey),
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -54,7 +54,7 @@ class SubmitBtn extends StatelessWidget {
|
|||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
style: ElevatedButton.styleFrom(
|
style: ElevatedButton.styleFrom(
|
||||||
backgroundColor: isDisabled == false
|
backgroundColor: isDisabled == false
|
||||||
? Colors.grey
|
? AppColors.btnDisableColor
|
||||||
: (isDelete == true ? Colors.red : AppColors.mainColor),
|
: (isDelete == true ? Colors.red : AppColors.mainColor),
|
||||||
),
|
),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
|
|||||||
@ -188,6 +188,9 @@ class LanKeyEntity {
|
|||||||
this.lanChinese,
|
this.lanChinese,
|
||||||
this.multilingual,
|
this.multilingual,
|
||||||
this.addLock,
|
this.addLock,
|
||||||
|
this.selectLockType,
|
||||||
|
this.videoIntercomDoorLock,
|
||||||
|
this.NFCPassiveLock,
|
||||||
this.addDevice,
|
this.addDevice,
|
||||||
this.gateway,
|
this.gateway,
|
||||||
this.message,
|
this.message,
|
||||||
@ -570,6 +573,9 @@ class LanKeyEntity {
|
|||||||
lanChinese = json['lanChinese'];
|
lanChinese = json['lanChinese'];
|
||||||
multilingual = json['multilingual'];
|
multilingual = json['multilingual'];
|
||||||
addLock = json['addLock'];
|
addLock = json['addLock'];
|
||||||
|
selectLockType = json['selectLockType'];
|
||||||
|
videoIntercomDoorLock = json['videoIntercomDoorLock'];
|
||||||
|
NFCPassiveLock = json['NFCPassiveLock'];
|
||||||
addDevice = json['addDevice'];
|
addDevice = json['addDevice'];
|
||||||
gateway = json['gateway'];
|
gateway = json['gateway'];
|
||||||
message = json['message'];
|
message = json['message'];
|
||||||
@ -969,6 +975,9 @@ class LanKeyEntity {
|
|||||||
String? lanChinese;
|
String? lanChinese;
|
||||||
String? multilingual;
|
String? multilingual;
|
||||||
String? addLock;
|
String? addLock;
|
||||||
|
String? selectLockType;
|
||||||
|
String? videoIntercomDoorLock;
|
||||||
|
String? NFCPassiveLock;
|
||||||
String? addDevice;
|
String? addDevice;
|
||||||
String? gateway;
|
String? gateway;
|
||||||
String? message;
|
String? message;
|
||||||
@ -1365,6 +1374,9 @@ class LanKeyEntity {
|
|||||||
map['lanChinese'] = lanChinese;
|
map['lanChinese'] = lanChinese;
|
||||||
map['multilingual'] = multilingual;
|
map['multilingual'] = multilingual;
|
||||||
map['addLock'] = addLock;
|
map['addLock'] = addLock;
|
||||||
|
map['selectLockType'] = selectLockType;
|
||||||
|
map['videoIntercomDoorLock'] = videoIntercomDoorLock;
|
||||||
|
map['NFCPassiveLock'] = NFCPassiveLock;
|
||||||
map['addDevice'] = addDevice;
|
map['addDevice'] = addDevice;
|
||||||
map['gateway'] = gateway;
|
map['gateway'] = gateway;
|
||||||
map['message'] = message;
|
map['message'] = message;
|
||||||
|
|||||||
@ -80,6 +80,10 @@ dependencies:
|
|||||||
flutter_easyloading: ^3.0.5
|
flutter_easyloading: ^3.0.5
|
||||||
#图形验证码
|
#图形验证码
|
||||||
aj_captcha_flutter: ^0.0.1
|
aj_captcha_flutter: ^0.0.1
|
||||||
|
#国家选择
|
||||||
|
azlistview: ^2.0.0
|
||||||
|
common_utils: ^2.0.0
|
||||||
|
lpinyin: ^2.0.3
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
@ -111,6 +115,7 @@ flutter:
|
|||||||
- images/lan/
|
- images/lan/
|
||||||
- images/mine/
|
- images/mine/
|
||||||
- images/lockType/
|
- images/lockType/
|
||||||
|
- assets/
|
||||||
# An image asset can refer to one or more resolution-specific "variants", see
|
# An image asset can refer to one or more resolution-specific "variants", see
|
||||||
# https://flutter.dev/assets-and-images/#resolution-aware
|
# https://flutter.dev/assets-and-images/#resolution-aware
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user