Merge branch 'master' of gitee.com:starlock-cn/app-starlock

This commit is contained in:
Daisy 2024-04-18 18:14:28 +08:00
commit 996267d4ea
27 changed files with 554 additions and 877 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -25,6 +25,26 @@ if (flutterVersionName == null) {
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.android.application'
apply plugin: 'android-junk-code'
androidJunkCode {
variantConfig {
release {
//release是变体名称productFlavors就是buildType名称productFlavors就是flavor+buildTypefreeReleaseproRelease
packageBase = "cn.hx.plugin.ui" //java类根包名
packageCount = 30 //
activityCountPerPackage = 3 //Activity类数量
excludeActivityJavaFile = false
//Activity的Java文件,false(layout和写入AndroidManifest.xml还会执行)
otherCountPerPackage = 50 //
methodCountPerClass = 20 //
resPrefix = "junk_" //layoutdrawablestring等资源名前缀
drawableCount = 300 //drawable资源数量
stringCount = 300 //string数量
}
}
}
android {
signingConfigs {
@ -100,7 +120,7 @@ android {
dimension "flavor-type"
applicationId "com.xhjcn.lock"
signingConfig signingConfigs.xhj
resValue "string", "app_name", "锁"
resValue "string", "app_name", "星星锁"
manifestPlaceholders.JPUSH_PKGNAME = "com.xhjcn.lock"
}
}

View File

@ -17,6 +17,8 @@ buildscript {
classpath 'com.google.gms:google-services:4.3.8'
// hms
classpath 'com.huawei.agconnect:agcp:1.6.0.300'
//
classpath "com.github.qq549631030:android-junk-code:1.3.3"
}
}

View File

@ -39,7 +39,7 @@
# flutter run --flavor dev -t lib/main_dev.dart
# flutter run --flavor pre -t lib/main_pre.dart
# flutter run --flavor sky -t lib/main_sky_full.dart
# flutter run --flavor xhj -t lib/main_xhj.dart
# flutter run --flavor xhj -t lib/main_xhj_full.dart
# 下面是安卓发布编译命令
# flutter build apk --split-per-abi --release --flavor sky -t lib/main_sky_full.dart

View File

@ -724,5 +724,7 @@
"商城":"mall",
"我的":"my",
"微信公众号推送":"Wechat public account",
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings"
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"To open wechat to receive alarm messages, you need to pay attention to Skye Smart Lock wechat public account first, please save the QR code and use wechat to scan the Settings",
"蓝牙":"Bluetooth",
"需要访问蓝牙权限才能使用添加钥匙功能的位置信息":"Access to Bluetooth permissions is required to use the location information of the add key function"
}

View File

@ -723,5 +723,9 @@
"商城":"mall",
"我的":"my",
"微信公众号推送":"微信公众号推送",
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置"
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置",
"蓝牙":"蓝牙",
"需要访问蓝牙权限才能使用添加钥匙功能的位置信息":"需要访问蓝牙权限才能使用添加钥匙功能的位置信息"
}

View File

@ -725,5 +725,8 @@
"商城":"商城",
"我的":"我的",
"微信公众号推送":"微信公众号推送",
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置"
"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置":"开启微信接收报警消息需要先关注斯凯智能锁微信公众号,请保存二维码并使用微信扫一扫设置",
"蓝牙":"蓝牙",
"需要访问蓝牙权限才能使用添加钥匙功能的位置信息":"需要访问蓝牙权限才能使用添加钥匙功能的位置信息"
}

View File

@ -1,6 +1,6 @@
#include "Generated.xcconfig"
FLUTTER_TARGET=lib/main_xhj.dart
FLUTTER_TARGET=lib/main_xhj_full.dart
ASSET_PREFIX=xhj
BUNDLE_NAME=
BUNDLE_DISPLAY_NAME=
BUNDLE_NAME=星星
BUNDLE_DISPLAY_NAME=星星

View File

@ -1,6 +1,6 @@
#include "Generated.xcconfig"
FLUTTER_TARGET=lib/main_xhj.dart
FLUTTER_TARGET=lib/main_xhj_full.dart
ASSET_PREFIX=xhj
BUNDLE_NAME=
BUNDLE_DISPLAY_NAME=
BUNDLE_NAME=星星
BUNDLE_DISPLAY_NAME=星星

View File

@ -1,6 +1,6 @@
#include "Generated.xcconfig"
FLUTTER_TARGET=lib/main_xhj.dart
FLUTTER_TARGET=lib/main_xhj_lite.dart
ASSET_PREFIX=xhj
BUNDLE_NAME=
BUNDLE_DISPLAY_NAME=
BUNDLE_NAME=星星
BUNDLE_DISPLAY_NAME=星星

View File

@ -116,20 +116,7 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
04BFC44A2BCFE48600688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; };
04BFC44B2BD0B50A00688FCA /* RunnerProfile-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerProfile-xhj.entitlements"; sourceTree = "<group>"; };
04BFC44C2BD0B51500688FCA /* RunnerDebug-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerDebug-xhj.entitlements"; sourceTree = "<group>"; };
04BFC44D2BD0B51D00688FCA /* RunnerRelease-sky.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-sky.entitlements"; sourceTree = "<group>"; };
04BFC44E2BD0B52300688FCA /* RunnerProfile-sky.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerProfile-sky.entitlements"; sourceTree = "<group>"; };
04BFC44F2BD0B52C00688FCA /* RunnerDebug-sky.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerDebug-sky.entitlements"; sourceTree = "<group>"; };
04BFC4502BD0B53400688FCA /* RunnerRelease-pre.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-pre.entitlements"; sourceTree = "<group>"; };
04BFC4512BD0B53B00688FCA /* RunnerProfile-pre.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerProfile-pre.entitlements"; sourceTree = "<group>"; };
04BFC4522BD0B54200688FCA /* RunnerDebug-pre.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerDebug-pre.entitlements"; sourceTree = "<group>"; };
04BFC4532BD0B54900688FCA /* RunnerRelease-dev.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-dev.entitlements"; sourceTree = "<group>"; };
04BFC4542BD0B55000688FCA /* RunnerProfile-dev.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerProfile-dev.entitlements"; sourceTree = "<group>"; };
04BFC4552BD0B55600688FCA /* RunnerDebug-dev.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerDebug-dev.entitlements"; sourceTree = "<group>"; };
04BFC4562BD0B55F00688FCA /* RunnerProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerProfile.entitlements; sourceTree = "<group>"; };
04BFC4572BD0B56600688FCA /* RunnerRelease.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RunnerRelease.entitlements; sourceTree = "<group>"; };
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "RunnerRelease-xhj.entitlements"; sourceTree = "<group>"; };
0BEB3ADCCEC961E2916B9004 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
0D02C18E16914A687A4A1AC2 /* devDebug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = devDebug.xcconfig; path = Flutter/devDebug.xcconfig; sourceTree = "<group>"; };
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
@ -406,20 +393,7 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
04BFC4572BD0B56600688FCA /* RunnerRelease.entitlements */,
04BFC4562BD0B55F00688FCA /* RunnerProfile.entitlements */,
04BFC4552BD0B55600688FCA /* RunnerDebug-dev.entitlements */,
04BFC4542BD0B55000688FCA /* RunnerProfile-dev.entitlements */,
04BFC4532BD0B54900688FCA /* RunnerRelease-dev.entitlements */,
04BFC4522BD0B54200688FCA /* RunnerDebug-pre.entitlements */,
04BFC4512BD0B53B00688FCA /* RunnerProfile-pre.entitlements */,
04BFC4502BD0B53400688FCA /* RunnerRelease-pre.entitlements */,
04BFC44F2BD0B52C00688FCA /* RunnerDebug-sky.entitlements */,
04BFC44E2BD0B52300688FCA /* RunnerProfile-sky.entitlements */,
04BFC44D2BD0B51D00688FCA /* RunnerRelease-sky.entitlements */,
04BFC44C2BD0B51500688FCA /* RunnerDebug-xhj.entitlements */,
04BFC44B2BD0B50A00688FCA /* RunnerProfile-xhj.entitlements */,
04BFC44A2BCFE48600688FCA /* RunnerRelease-xhj.entitlements */,
04BFC4482BCFE05100688FCA /* RunnerRelease-xhj.entitlements */,
3364C3F32B0C902100AA5ABC /* lcokStarMain.png */,
82C026552AEB6C050011FE6A /* img */,
82C026532AE8AC6D0011FE6A /* AliyunEmasServices-Info.plist */,
@ -852,8 +826,8 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 22D858E988707FF26E068457 /* Pods-Runner.debug-xhj.xcconfig */;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerDebug-xhj.entitlements";
DEVELOPMENT_TEAM = 7D53BZAN75;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
DEVELOPMENT_TEAM = P8997RW3V8;
PRODUCT_NAME = Runner;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
@ -866,8 +840,8 @@
isa = XCBuildConfiguration;
baseConfigurationReference = D62237D2D011BDC27FB2BC28 /* Pods-Runner.profile-xhj.xcconfig */;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerProfile-xhj.entitlements";
DEVELOPMENT_TEAM = 7D53BZAN75;
CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements;
DEVELOPMENT_TEAM = P8997RW3V8;
PRODUCT_NAME = Runner;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
@ -881,7 +855,7 @@
baseConfigurationReference = CDC2B8ED804B514A774F187D /* Pods-Runner.release-xhj.xcconfig */;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "Runner/RunnerRelease-xhj.entitlements";
DEVELOPMENT_TEAM = 7D53BZAN75;
DEVELOPMENT_TEAM = P8997RW3V8;
PRODUCT_NAME = Runner;
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;

View File

@ -116,23 +116,6 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
}
}
void openBlueScan() {
if (Platform.isIOS) {
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
getMicrophonePermission().then((value) {
if (value) {
//
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
//
openAppSettings(); //app系统设置
}
});
}
}
Future<bool> getLoginStatus() async {
final data = await Storage.getString(saveUserLoginData);
@ -141,21 +124,3 @@ Future<bool> getLoginStatus() async {
}
return false;
}
///
Future<bool> getMicrophonePermission() async {
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
Permission.location,
].request();
//granted denied permanentlyDenied
if (statuses[Permission.bluetoothScan]!.isGranted &&
statuses[Permission.bluetoothConnect]!.isGranted &&
statuses[Permission.location]!.isGranted) {
return true;
}
return false;
}

View File

@ -109,8 +109,8 @@ class F {
case Flavor.sky:
return 'https://lock.skychip.top';
case Flavor.xhj:
// return 'https://lock.xhjcn.ltd';
return 'https://pre.lock.star-lock.cn';
return 'https://lock.xhjcn.ltd';
// return 'https://pre.lock.star-lock.cn';
default:
throw Exception('flavor[$name] apiPrefix not found');
}

View File

@ -62,7 +62,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
child: Image.asset('images/icon_main_1024.png',
width: 110.w, height: 110.w))),
SizedBox(height: 50.w),
CommonItem(
Obx(() => CommonItem(
leftTitel: "${"你所在的".tr}${TranslationLoader.lanKeys!.countryAndRegion!.tr}",
rightTitle: "",
isHaveLine: true,
@ -83,7 +83,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
state.countryName.value = result['countryName'];
}
},
),
)),
LoginInput(
controller: state.emailOrPhoneController,
onchangeAction: (v) {

View File

@ -320,13 +320,6 @@ class LockDetailLogic extends BaseGetXController {
state.lockUserNo = reply.data[47];
_updateLockUserNo();
// if (state.isOpenLockNeedOnline.value == 0) {
// openDoorAction(1);
// } else {
// getLockNetToken();
// }
// eventBus.fire(RefreshLockDetailInfoDataEvent());
// clickPushBtnAction();
break;
case 0x06:
//
@ -438,19 +431,6 @@ class LockDetailLogic extends BaseGetXController {
var token = await Storage.getStringList(saveBlueToken);
List<int> getTokenList = changeStringListToIntList(token!);
// print("调用了开锁事件 openDoorTokenPubToken:$getTokenList getPrivateKeyList:$getPrivateKeyList");
// List<int>listData = await IoSenderManage.senderOpenLock(
// keyID: BlueManage().connectDeviceName,
// userID: await Storage.getUid(),
// openMode: openMode,
// openTime: DateTime.now().millisecondsSinceEpoch ~/ 1000,
// onlineToken: state.lockNetToken,
// token: getTokenList,
// needAuthor: 1,
// signKey: signKeyDataList,
// privateKey: getPrivateKeyList,
// );
Get.log("openMode:${state.openDoorModel}");
BlueManage().bludSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!, (BluetoothConnectionState deviceConnectionState) async {
if (deviceConnectionState == BluetoothConnectionState.connected) {
@ -478,91 +458,6 @@ class LockDetailLogic extends BaseGetXController {
});
}
//
// Future<void> editLockUserAction() async {
// BlueManage().bludSendData(BlueManage().connectDeviceMacAddress, BlueManage().connectDeviceName, (DeviceConnectionState state) async {
// if (state == DeviceConnectionState.connected){
// var publicKey = await Storage.getStringList(saveBluePublicKey);
// List<int> publicKeyDataList = changeStringListToIntList(publicKey!);
//
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
//
// var token = await Storage.getStringList(saveBlueToken);
// List<int> getTokenList = changeStringListToIntList(token!);
// print("openDoorTokenPubToken:$getTokenList");
//
// print("publicKey:$publicKey publicKeyDataList:$publicKeyDataList privateKey:$privateKey getPrivateKeyList:$getPrivateKeyList token:$token getTokenList:$getTokenList");
// IoSenderManage.senderEditUser(
// lockID:BlueManage().connectDeviceName,
// authUserID:await Storage.getUid(),
// keyID:"1",
// userID:await Storage.getUid(),
// openMode:1,
// keyType:1,
// startDate:0x11223344,
// expireDate:0x11223344,
// role:255,
// password:"123456",
// needAuthor:1,
// publicKey:publicKeyDataList,
// privateKey:getPrivateKeyList,
// token: getTokenList
// );
// }
// });
// }
//
// Future<void> _connectBlue(String bluetoothDeviceName) async {
// //
// BlueManage().connect(bluetoothDeviceName, (DeviceConnectionState state) async {
// if(EasyLoading.isShow){
// EasyLoading.dismiss();
// }
// if (state == DeviceConnectionState.connected){
// // var privateKey = await Storage.getStringList(saveBluePrivateKey);
// // List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
// // // IoSenderManage.senderGetLockStatu(
// // // lockID:BlueManage().connectDeviceName,
// // // userID:await Storage.getUid(),
// // // privateKey:getPrivateKeyList,
// // // );
// // IoSenderManage.senderGetStarLockStatuInfo(
// // lockID:BlueManage().connectDeviceName,
// // userID:await Storage.getUid(),
// // privateKey:getPrivateKeyList,
// // );
// }
// }, isShowLoading: false);
// }
//
// Future<void> getStarLockStatus() async {
// showEasyLoading();
// showBlueConnetctToastTimer(action: () {
// dismissEasyLoading();
// });
// BlueManage().bludSendData(BlueManage().connectDeviceName,
// (DeviceConnectionState deviceConnectionState) async {
// if (deviceConnectionState == DeviceConnectionState.connected) {
// dismissEasyLoading();
// var privateKey = await Storage.getStringList(saveBluePrivateKey);
// List<int> getPrivateKeyList = changeStringListToIntList(privateKey!);
// IoSenderManage.senderGetStarLockStatuInfo(
// lockID: BlueManage().connectDeviceName,
// userID: await Storage.getUid(),
// privateKey: getPrivateKeyList,
// );
// } else if (deviceConnectionState == DeviceConnectionState.disconnected) {
// dismissEasyLoading();
// cancelBlueConnetctToastTimer();
// if (state.ifCurrentScreen.value == true) {
// showBlueConnetctToast();
// }
// }
// });
// }
// ()
Future<void> senderReferEventRecordTime(int time) async {
@ -593,45 +488,6 @@ class LockDetailLogic extends BaseGetXController {
});
}
// // 0 1 2 3 4 5 6 7 8 9 10
// clickItemBtnAction(int type){
// state.clickNextType = type;
// if (state.lockUserNo == 0) {
// // lockUserNo为0
// addUserConnectBlue();
// } else {
// clickPushBtnAction();
// }
// }
//
// clickPushBtnAction(){
// // 0 1 2 3 4 5 6 7 8 9 10
// switch(state.clickNextType){
// case 0:
// //
// startOpenLock();
// break;
// case 1:
// //
// startUnLock();
// break;
// case 2:
// //
// Get.toNamed(Routers.passwordKeyListPage, arguments: {"keyInfo": state.keyInfos.value});
// break;
// case 3:
// //
// Get.toNamed(Routers.passwordKeyListPage, arguments: {"keyInfo": state.keyInfos.value});
// break;
// case 10:
// //
// Get.toNamed(Routers.lockSetPage, arguments: {
// "lockId": state.keyInfos.value.lockId,
// "isOnlyOneData": state.isOnlyOneData,
// });
// break;
// }
// }
// token
void getLockNetToken() async {
@ -706,17 +562,6 @@ class LockDetailLogic extends BaseGetXController {
}
}
//
// Future<void> uploadElectricQuantityRequest(String electricQuantity) async {
// KeyOperationRecordEntity entity = await ApiRepository.to
// .uploadElectricQuantity(
// electricQuantity, state.keyInfos.value.lockId.toString());
// if (entity.errorCode!.codeIsSuccessful) {
// showToast("电量更新成功", something: () {
// eventBus.fire(RefreshLockListInfoDataEvent());
// });
// }
// }
///
void initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction() {
@ -773,81 +618,6 @@ class LockDetailLogic extends BaseGetXController {
return text;
}
// late StreamSubscription<List<DiscoveredDevice>>
// _scanListDiscoveredDeviceSubscription;
// void _scanListDiscoveredDeviceSubscriptionAction() {
// _scanListDiscoveredDeviceSubscription = EventBusManager().eventBus!.on<List<DiscoveredDevice>>().listen((List<DiscoveredDevice> list) {
// final knownDeviceIndex = list.indexWhere((d) => d.name == state.keyInfos.value.bluetooth!.bluetoothDeviceName!);
// if (knownDeviceIndex >= 0) {
// //
// state.currentDeviceUUid.value = (list[knownDeviceIndex].serviceUuids.isNotEmpty ? list[knownDeviceIndex].serviceUuids[0] : "").toString();
// }
// });
// }
//
// void _showFullScreenOverlay(BuildContext context) {
// Future.delayed(const Duration(seconds: 3), () {
// if (state.iSClosedUnlockSuccessfulPopup.value != true) {
// state.iSClosedUnlockSuccessfulPopup.value = true;
// Get.back();
// }
// });
// showModalBottomSheet(
// context: context,
// isScrollControlled: true,
// backgroundColor: Colors.transparent,
// builder: (BuildContext context) {
// return GestureDetector(
// onTap: () {
// if (state.iSClosedUnlockSuccessfulPopup.value != true) {
// state.iSClosedUnlockSuccessfulPopup.value = true;
// Get.back();
// }
// },
// child: Container(
// height: MediaQuery.of(context).size.height,
// width: MediaQuery.of(context).size.width,
// color: Colors.black.withOpacity(0.2),
// child: _unlockSuccessWidget(),
// ),
// );
// },
// );
// }
// Widget _unlockSuccessWidget() {
// return Stack(
// alignment: Alignment.center,
// children: [
// Image.asset(
// 'images/main/unlocked_bg.png',
// width: 358.w,
// height: 348.h,
// ),
// Positioned(
// top: ScreenUtil().screenHeight / 2,
// child: Column(
// children: [
// Text(
// state.keyInfos.value.lockAlias!,
// style: TextStyle(
// color: AppColors.placeholderTextColor, fontSize: 24.sp),
// ),
// SizedBox(
// height: 10.h,
// ),
// Text(
// getCurrentFormattedTime(),
// style: TextStyle(
// color: AppColors.darkGrayTextColor, fontSize: 24.sp),
// )
// ],
// ))
// ],
// );
// }
String getCurrentFormattedTime() {
//
DateTime now = DateTime.now();
@ -856,82 +626,23 @@ class LockDetailLogic extends BaseGetXController {
return formattedTime;
}
Future<void> positionPermissionAlert() async {
//
if (Platform.isAndroid) {
AppFirstEnterHandle().getAppFirstEnter(state.widgetContext, isAgreePosition);
var getFlag = await Storage.getString(isAgreePosition);
if (getFlag == isAgreePosition) {
openBlueSet();
}
} else {
openBlueSet();
}
}
openBlueSet() {
if (!Platform.isIOS) {
getMicrophonePermission().then((value) {
if (!value) {
// app系统设置
openAppSettings();
} else {
//
}
});
}
}
///
Future<bool> getMicrophonePermission() async {
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
Permission.location,
].request();
//granted denied permanentlyDenied
if (statuses[Permission.bluetoothScan]!.isGranted &&
statuses[Permission.bluetoothConnect]!.isGranted &&
statuses[Permission.location]!.isGranted) {
return true;
}
return false;
}
@override
Future<void> onReady() async {
// TODO: implement onReady
super.onReady();
Get.log("LockDetailPage onReady");
// _initReplySubscription();
// _initLockSetOpenOrCloseCheckInRefreshLockDetailWithAttendanceAction();
// openBlueSet();
await PermissionDialog.request(Permission.location);
// positionPermissionAlert();
await PermissionDialog.requestBluetooth();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
Get.log("LockDetailPage onInit");
//
// connectBlue();
}
@override
void onClose() {
// TODO: implement onClose
super.onClose();
Get.log("LockDetailPage onClose");
// _scanListDiscoveredDeviceSubscription.cancel();
}
}

View File

@ -1,10 +1,15 @@
import 'dart:async';
import 'package:colorfilter_generator/addons.dart';
import 'package:colorfilter_generator/colorfilter_generator.dart';
import 'package:colorfilter_generator/presets.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/tools/showTipView.dart';
import 'package:star_lock/widget/flavors_img.dart';
import '../../../appRouters.dart';
import '../../../app_settings/app_colors.dart';
@ -68,6 +73,7 @@ class _LockDetailPageState extends State<LockDetailPage>
}
StreamSubscription? _lockRefreshLockDetailInfoDataEvent;
void _initRefreshLockDetailInfoDataEventAction() {
// eventBus
_lockRefreshLockDetailInfoDataEvent =
@ -224,24 +230,33 @@ class _LockDetailPageState extends State<LockDetailPage>
Widget topWidget() {
return Column(
children: [
SizedBox(height: 50.h),
F.sw(
defaultCall: () => SizedBox(height: 50.h),
xhjCall: () => Padding(
padding: EdgeInsets.only(
top: 12.h,
left: 15.w,
bottom: 16.h,
right: 15.w,
),
child: adminInfoView(center: false, add: true),
),
),
Stack(
alignment: Alignment.center,
children: [
SizedBox(
width: 1.sw - 120.w * 2,
child: Center(
child: Text(
state.lockAlias.value,
style: TextStyle(
fontSize: 22.sp,
fontWeight: FontWeight.w400,
color: state.isOpenPassageMode.value == 1
? AppColors.openPassageModeColor
: AppColors.darkGrayTextColor),
))),
Center(
child: Text(
state.lockAlias.value,
style: TextStyle(
fontSize: 22.sp,
fontWeight: FontWeight.w400,
color: state.isOpenPassageMode.value == 1
? AppColors.openPassageModeColor
: AppColors.darkGrayTextColor),
)),
Positioned(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
GestureDetector(
onTap: () {
@ -252,20 +267,24 @@ class _LockDetailPageState extends State<LockDetailPage>
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Image.asset(
showElectricIcon(state.electricQuantity.value),
width: 30.w,
height: 24.w),
FlavorsImg(
child: Image.asset(
showElectricIcon(state.electricQuantity.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text("${state.electricQuantity.value}%",
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
FlavorsImg(
child: Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
),
SizedBox(width: 20.w),
],
@ -274,18 +293,24 @@ class _LockDetailPageState extends State<LockDetailPage>
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Image.asset(showElectricIcon(state.electricQuantity.value),
width: 30.w, height: 24.w),
FlavorsImg(
child: Image.asset(
showElectricIcon(state.electricQuantity.value),
width: 30.w,
height: 24.w),
),
SizedBox(width: 2.w),
Text("--%",
style: TextStyle(
fontSize: 18.sp,
color: AppColors.darkGrayTextColor)),
SizedBox(width: 2.w),
Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
FlavorsImg(
child: Icon(
Icons.info, // 使 warning
color: AppColors.mainColor, //
size: 25.w, // 30
),
),
SizedBox(width: 20.w),
],
@ -294,7 +319,10 @@ class _LockDetailPageState extends State<LockDetailPage>
))
],
),
SizedBox(height: 30.h),
F.sw(
defaultCall: () => SizedBox(height: 30.h),
xhjCall: () => SizedBox(height: 15.h),
),
Container(
// width: 1.sw,
color: Colors.white,
@ -317,37 +345,43 @@ class _LockDetailPageState extends State<LockDetailPage>
setState(() {
startUnLock();
});
// startUnLock();
}
: null,
child: Stack(
children: [
Image.asset(
state.openDoorBtnisUneable.value == false
? 'images/main/icon_main_openLockBtn_grey.png'
: (state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_center.png'
: 'images/main/icon_main_openLockBtn_center.png'),
width: 330.w,
height: 330.w,
FlavorsImg(
child: Image.asset(
state.openDoorBtnisUneable.value == false
? 'images/main/icon_main_openLockBtn_grey.png'
: (state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_center.png'
: 'images/main/icon_main_openLockBtn_center.png'),
width: 330.w,
height: 330.w,
// color: AppColors.primaryTopColor,
),
),
state.openDoorBtnisUneable.value == false
? Positioned(
child: Image.asset(
'images/main/icon_main_openLockBtn_grey.png',
width: 330.w,
height: 330.w,
child: FlavorsImg(
child: Image.asset(
'images/main/icon_main_openLockBtn_grey.png',
width: 330.w,
height: 330.w,
),
),
)
: state.openLockBtnState.value == 1
? buildRotationTransition()
: Positioned(
child: FlavorsImg(
child: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: 330.w,
height: 330.w,
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: 330.w,
height: 330.w,
),
)),
],
),
@ -358,21 +392,6 @@ class _LockDetailPageState extends State<LockDetailPage>
SizedBox(
height: 30.h,
),
// Row(
// mainAxisAlignment: MainAxisAlignment.center,
// children: [
// Text(
// '门已上锁',
// style: TextStyle(
// fontSize: 26.sp,
// color: Colors.black,
// fontWeight: FontWeight.w500),
// ),
// ],
// ),
// SizedBox(
// height: 6.h,
// ),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
@ -388,47 +407,7 @@ class _LockDetailPageState extends State<LockDetailPage>
SizedBox(
height: 30.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Image.asset(
'images/icon_electronicKey_admin.png',
width: 24.w,
height: 20.w,
color: AppColors.blackColor, //
),
SizedBox(width: 6.w),
Text(
state.keyInfos.value.isLockOwner == 1
? TranslationLoader.lanKeys!.superAdmin!.tr
: (state.keyInfos.value.keyRight == 1
? TranslationLoader.lanKeys!.authorizedAdmin!.tr
: TranslationLoader.lanKeys!.normalUser!.tr),
style: TextStyle(
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
),
SizedBox(width: 80.w),
Image.asset(
state.keyInfos.value.remoteEnable == 1
? 'images/main/icon_main_remoteUnlocking.png'
: 'images/main/icon_main_remoteUnlocking_grey.png',
width: 24.w,
height: 20.w,
// color: state.keyInfos.value.remoteEnable == 1
// ? AppColors.btnDisableColor
// : AppColors.mainColor,
),
SizedBox(width: 6.w),
Text(
TranslationLoader.lanKeys!.gatewayDevice!.tr,
style: TextStyle(
fontSize: 20.sp,
color: state.keyInfos.value.remoteEnable == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
],
),
F.sw(defaultCall: () => adminInfoView(), xhjCall: () => SizedBox()),
SizedBox(
height: 20.h,
),
@ -442,6 +421,77 @@ class _LockDetailPageState extends State<LockDetailPage>
);
}
Widget adminInfoView({bool center = true, bool add = false}) {
return Row(
mainAxisAlignment:
center ? MainAxisAlignment.center : MainAxisAlignment.start,
children: [
Image.asset(
'images/icon_electronicKey_admin.png',
width: 24.w,
height: 20.w,
color: AppColors.blackColor, //
),
SizedBox(width: 6.w),
Text(
state.keyInfos.value.isLockOwner == 1
? TranslationLoader.lanKeys!.superAdmin!.tr
: (state.keyInfos.value.keyRight == 1
? TranslationLoader.lanKeys!.authorizedAdmin!.tr
: TranslationLoader.lanKeys!.normalUser!.tr),
style: TextStyle(fontSize: 20.sp, color: AppColors.darkGrayTextColor),
),
if (add) SizedBox(width: 20.w) else SizedBox(width: 80.w),
FlavorsImg(
child: Image.asset(
state.keyInfos.value.remoteEnable == 1
? 'images/main/icon_main_remoteUnlocking.png'
: 'images/main/icon_main_remoteUnlocking_grey.png',
width: 24.w,
height: 20.w,
),
),
SizedBox(width: 6.w),
Text(
TranslationLoader.lanKeys!.gatewayDevice!.tr,
style: TextStyle(
fontSize: 20.sp,
color: state.keyInfos.value.remoteEnable == 1
? AppColors.mainColor
: AppColors.btnDisableColor),
),
if (add) ...[
const Spacer(),
GestureDetector(
onTap: () {
Get.toNamed(Routers.selectLockTypePage);
},
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
FlavorsImg(
child: Image.asset(
'images/mine/icon_mine_main_addLock.png',
width: 24.w,
height: 20.w,
),
),
Text(
TranslationLoader.lanKeys!.addDevice!.tr,
style: TextStyle(
fontSize: 20.sp, color: AppColors.darkGrayTextColor),
)
],
),
),
),
]
],
);
}
//
Widget buildRotationTransition() {
return Positioned(
@ -451,12 +501,14 @@ class _LockDetailPageState extends State<LockDetailPage>
//
turns: state.animationController!,
//view
child: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: 330.w,
height: 330.w,
child: FlavorsImg(
child: Image.asset(
state.isOpenPassageMode.value == 1
? 'images/main/icon_main_normallyOpenMode_circle.png'
: 'images/main/icon_main_openLockBtn_circle.png',
width: 330.w,
height: 330.w,
),
),
),
);
@ -487,7 +539,7 @@ class _LockDetailPageState extends State<LockDetailPage>
return SizedBox(
width: ScreenUtil().screenWidth - 20.w,
child: GridView.count(
crossAxisCount: 4,
crossAxisCount: F.sw(defaultCall: () => 4, xhjCall: () => 3),
// childAspectRatio: 3,
crossAxisSpacing: 20.w,
mainAxisSpacing: 0.h,
@ -532,12 +584,14 @@ class _LockDetailPageState extends State<LockDetailPage>
return SizedBox(
width: ScreenUtil().screenWidth - 20.w,
child: GridView.count(
crossAxisCount: 4,
crossAxisCount: F.sw(defaultCall: () => 4, xhjCall: () => 3),
// childAspectRatio: 3,
crossAxisSpacing: 25.h,
mainAxisSpacing: 0.h,
physics: const NeverScrollableScrollPhysics(),
children: getBottomWidget()),
children: F.sw(
defaultCall: () => getBottomWidget(),
xhjCall: () => getBottomWidget().reversed.toList())),
);
}
@ -554,7 +608,7 @@ class _LockDetailPageState extends State<LockDetailPage>
//
List<Widget> getNormalWidget() {
var showWidgetArr = <Widget>[];
List<Widget> showWidgetArr = <Widget>[];
//
if (state.isAttendance.value == 1) {
showWidgetArr.add(bottomItem(
@ -630,9 +684,6 @@ class _LockDetailPageState extends State<LockDetailPage>
TranslationLoader.lanKeys!.card!.tr,
state.openDoorBtnisUneable.value,
state.bottomBtnisEable.value, () {
// logic.showToast("普通用户第一次需要在锁旁边操作哦。", something: () {
// logic.showEasyLoading();
// });
Get.toNamed(Routers.cardListPage, arguments: {
"lockId": state.keyInfos.value.lockId,
});
@ -727,10 +778,6 @@ class _LockDetailPageState extends State<LockDetailPage>
arguments: {"keyInfo": state.keyInfos.value});
}));
}
// bottomItem('images/main/icon_main_authorizedAdmin.png', TranslationLoader.lanKeys!.authorizedAdmin!.tr, state.bottomBtnisUneable.value, () {
// Get.toNamed(Routers.authorizedAdminListPage,
// arguments: {"keyInfo": state.keyInfos.value});
// })
var endWiddget = <Widget>[];
endWiddget.add(
@ -788,8 +835,8 @@ class _LockDetailPageState extends State<LockDetailPage>
//
Widget bottomItem(String iconUrl, String name, bool openDoorBtnisUneable,
bool bottomBtnisEable, Function() onClick) {
var width = 42.w;
var height = 42.h;
var width = F.sw(defaultCall: () => 42.w, xhjCall: () => 63.w);
var height = F.sw(defaultCall: () => 42.h, xhjCall: () => 63.h);
return GestureDetector(
onTap: openDoorBtnisUneable
? (bottomBtnisEable
@ -807,16 +854,16 @@ class _LockDetailPageState extends State<LockDetailPage>
SizedBox(
width: width,
height: height,
child: Image.asset(
iconUrl,
width: width,
height: height,
color: openDoorBtnisUneable
? (bottomBtnisEable
? AppColors.mainColor
: AppColors.lockDetailBottomBtnUneable)
: AppColors.lockDetailBottomBtnUneable,
// fit: BoxFit.fitWidth
child: FlavorsImg(
child: Image.asset(iconUrl,
width: width,
height: height,
color: openDoorBtnisUneable
? (bottomBtnisEable
? AppColors.mainColor
: AppColors.lockDetailBottomBtnUneable)
: AppColors.lockDetailBottomBtnUneable,
fit: BoxFit.fitWidth),
),
),
SizedBox(height: 10.w),
@ -933,25 +980,6 @@ class _LockDetailPageState extends State<LockDetailPage>
return formattedTime;
}
// void showDeletAlertDialog(BuildContext context, String dateStr) {
// showCupertinoDialog(
// context: context,
// builder: (context) {
// return CupertinoAlertDialog(
// content: Text('锁更新时间:$dateStr'),
// actions: [
// CupertinoDialogAction(
// child: Text(TranslationLoader.lanKeys!.sure!.tr),
// onPressed: () {
// Get.back();
// },
// ),
// ],
// );
// },
// );
// }
startOpenLock() {
if (state.openLockBtnState.value == 1) {
return;
@ -996,15 +1024,6 @@ class _LockDetailPageState extends State<LockDetailPage>
}
}
// @override
// void didChangeDependencies() {
// // TODO: implement didChangeDependencies
// super.didChangeDependencies();
//
// ///
// AppRouteObserver().routeObserver.subscribe(this, ModalRoute.of(context)!);
// }
@override
void dispose() {
// TODO: implement dispose
@ -1043,12 +1062,6 @@ class _LockDetailPageState extends State<LockDetailPage>
BlueManage().stopScan();
BlueManage().disconnect();
state.openLockBtnState.value = 0;
// if(state.animationController != null){
// state.animationController.reset();
// state.animationController.forward();
// state.animationController.dispose();
// }
}
///
@ -1068,9 +1081,5 @@ class _LockDetailPageState extends State<LockDetailPage>
logic.cancelBlueConnetctToastTimer();
BlueManage().stopScan();
state.openLockBtnState.value = 0;
// if (state.animationController!.isAnimating) {
// state.animationController!.stop();
// }
}
}

View File

@ -79,7 +79,7 @@ class _StarLockMainXHJPageState extends State<StarLockMainXHJPage>
),
),
bottomNavigationBar: Container(
height: 100.h + Get.bottomBarHeight,
padding: EdgeInsets.only(top: 20.h),
decoration: const BoxDecoration(
color: Colors.transparent,
border: Border(
@ -89,28 +89,32 @@ class _StarLockMainXHJPageState extends State<StarLockMainXHJPage>
),
),
),
child: Row(
children: [
// navigationBarItem(Icons.start, '场景', false, () {
// logic.setIndex(0);
// }),
child: SafeArea(
top: false,
child: Row(
children: [
// navigationBarItem(Icons.start, '场景', false, () {
// logic.setIndex(0);
// }),
navigationBarItem(Icons.devices,
TranslationLoader.lanKeys!.device!.tr, logic, 0, () {
logic.setIndex(0);
}),
navigationBarItem(Icons.message,
TranslationLoader.lanKeys!.message!.tr, logic, 1, () {
logic.setIndex(1);
}),
navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 2, () {
logic.setIndex(2);
}),
navigationBarItem(Icons.account_circle, '我的'.tr, logic, 3,
() {
logic.setIndex(3);
}),
],
navigationBarItem(Icons.devices,
TranslationLoader.lanKeys!.device!.tr, logic, 0, () {
logic.setIndex(0);
}),
navigationBarItem(Icons.message,
TranslationLoader.lanKeys!.message!.tr, logic, 1, () {
logic.setIndex(1);
}),
navigationBarItem(Icons.shopping_cart, '商城'.tr, logic, 2,
() {
logic.setIndex(2);
}),
navigationBarItem(Icons.account_circle, '我的'.tr, logic, 3,
() {
logic.setIndex(3);
}),
],
),
),
),
);

View File

@ -0,0 +1,9 @@
import 'flavors.dart';
import 'main.dart' as runner;
Future<void> main() async {
F.appFlavor = Flavor.xhj;
F.isLite = true;
await runner.main();
}

View File

@ -1,22 +1,23 @@
import 'dart:io';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/mine/addLock/addLock/addLock_state.dart';
import 'package:star_lock/permission/permission_dialog.dart';
import 'package:star_lock/tools/baseGetXController.dart';
import '../../../blue/blue_manage.dart';
class AddLockLogic extends BaseGetXController {
final AddLockState state = AddLockState();
@override
void onReady() {
// TODO: implement onReady
super.onReady();
// BlueManage().stopScan();
}
@override
void onInit() {
// TODO: implement onInit
super.onInit();
}
@ -24,4 +25,18 @@ class AddLockLogic extends BaseGetXController {
void onClose() {
// TODO: implement onClose
}
//
Future<void> getNearByLimits() async {
if (!Platform.isIOS) {
bool bluetoothRequest = await PermissionDialog.requestBluetooth();
bool locationRequest = await PermissionDialog.request(Permission.location);
if (!bluetoothRequest || !locationRequest) {
return;
}
}
Get.toNamed(Routers.nearbyLockPage);
}
}

View File

@ -23,125 +23,71 @@ class AddLockPage extends StatefulWidget {
}
class _AddLockPageState extends State<AddLockPage> with BaseWidget {
final logic = Get.put(AddLockLogic());
final state = Get.find<AddLockLogic>().state;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.white,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.addLock!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
body: ListView(
// mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 100.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationLoader.lanKeys!.lightTouchScreen!.tr,
style: TextStyle(
fontSize: 24.sp,
return GetBuilder<AddLockLogic>(
init: AddLockLogic(),
builder: (AddLockLogic logic) {
return Scaffold(
backgroundColor: Colors.white,
appBar: TitleAppBar(
barTitle: TranslationLoader.lanKeys!.addLock!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor),
body: ListView(
// mainAxisAlignment: MainAxisAlignment.center,
// crossAxisAlignment: CrossAxisAlignment.center,
children: [
SizedBox(
height: 100.h,
),
),
],
),
SizedBox(
height: 120.h,
),
Obx(() => Image.asset(
state.lockTypeImg.value,
width: 278.w,
height: 278.w,
)),
SizedBox(
height: 120.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationLoader.lanKeys!.lightTouchScreenTip!.tr,
style: TextStyle(fontSize: 20.sp, fontWeight: FontWeight.w500),
),
],
),
SizedBox(
height: 120.h,
),
Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w),
child: SubmitBtn(
btnName: TranslationLoader.lanKeys!.next!.tr,
borderRadius: 20.w,
onClick: () {
getNearByLimits();
}),
),
],
),
);
}
void onShow() {}
void onHide() {}
//
void getNearByLimits() {
if (Platform.isIOS) {
Navigator.pushNamed(context, Routers.nearbyLockPage);
} else {
positionPermissionAlert();
}
}
///
Future<bool> getMicrophonePermission() async {
// You can request multiple permissions at once.
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
Permission.location,
].request();
//granted denied permanentlyDenied
if (statuses[Permission.bluetoothScan]!.isGranted &&
statuses[Permission.bluetoothConnect]!.isGranted &&
statuses[Permission.location]!.isGranted) {
return true;
}
return false;
}
Future<void> positionPermissionAlert() async {
//
if (Platform.isAndroid) {
AppFirstEnterHandle().getAppFirstEnter(context, isAgreePosition);
var getFlag = await Storage.getString(isAgreePosition);
if (getFlag == isAgreePosition) {
onPermissionPush();
}
} else {
onPermissionPush();
}
}
void onPermissionPush() {
getMicrophonePermission().then((value) {
if (value) {
//
Navigator.pushNamed(context, Routers.nearbyLockPage);
} else {
//
openAppSettings(); //app系统设置
}
});
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationLoader.lanKeys!.lightTouchScreen!.tr,
style: TextStyle(
fontSize: 24.sp,
),
),
],
),
SizedBox(
height: 120.h,
),
Obx(() => Image.asset(
logic.state.lockTypeImg.value,
width: 278.w,
height: 278.w,
)),
SizedBox(
height: 120.h,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
TranslationLoader.lanKeys!.lightTouchScreenTip!.tr,
style: TextStyle(
fontSize: 20.sp, fontWeight: FontWeight.w500),
),
],
),
SizedBox(
height: 120.h,
),
Container(
margin: EdgeInsets.only(left: 20.w, right: 20.w),
child: SubmitBtn(
btnName: TranslationLoader.lanKeys!.next!.tr,
borderRadius: 20.w,
onClick: () {
logic.getNearByLimits();
}),
),
],
),
);
});
}
}

View File

@ -1,4 +1,3 @@
import 'dart:async';
import 'dart:io';
@ -11,6 +10,7 @@ import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:amap_flutter_map/amap_flutter_map.dart';
import 'package:amap_flutter_base/amap_flutter_base.dart';
import 'package:star_lock/permission/permission_dialog.dart';
import '../../../../appRouters.dart';
import '../../../../app_settings/app_colors.dart';
@ -28,12 +28,14 @@ class LockAddressGaoDePage extends StatefulWidget {
State<LockAddressGaoDePage> createState() => _LockAddressGaoDePageState();
}
class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteAware{
class _LockAddressGaoDePageState extends State<LockAddressGaoDePage>
with RouteAware {
final logic = Get.put(LockAddressGaoDeLogic());
final state = Get.find<LockAddressGaoDeLogic>().state;
//
static AMapApiKey amapApiKeys = AMapApiKey(iosKey: F.aMapKey.iosKey, androidKey: F.aMapKey.androidKey);
static AMapApiKey amapApiKeys =
AMapApiKey(iosKey: F.aMapKey.iosKey, androidKey: F.aMapKey.androidKey);
AMapController? mapController;
AMapFlutterLocation location = AMapFlutterLocation();
@ -44,72 +46,29 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
@override
void initState() {
super.initState();
AMapFlutterLocation.updatePrivacyAgree(true);
AMapFlutterLocation.updatePrivacyShow(true, true);
requestPermission();
AMapFlutterLocation.setApiKey(F.aMapKey.androidKey, F.aMapKey.iosKey);
// EasyLoading.show();
// Future.delayed(const Duration(seconds: 10), () { //asynchronous delay
// print("10s之后 菊花没有隐藏的话,强制隐藏菊花");
// if(EasyLoading.isShow){
// EasyLoading.dismiss();
// }
// });
// requestLocation();
}
Future<void> requestPermission() async {
final status = await Permission.location.request();
print("Permission.location.request()=status:$status");
permissionStatus = status;
if(Platform.isIOS){
final status = await PermissionDialog.request(Permission.location);
if (Platform.isIOS || status) {
_setLocationOption();
requestIOSLocation();
}
switch (status) {
case PermissionStatus.denied:
// print("拒绝");
break;
case PermissionStatus.granted:
if(Platform.isIOS){
// _setLocationOption();
// requestIOSLocation();
}else{
requestAndroidLocation();
location.startLocation();
}
break;
case PermissionStatus.limited:
// print("限制");
break;
case PermissionStatus.permanentlyDenied:
// print("永久的否认");
break;
case PermissionStatus.provisional:
// print("临时");
break;
default:
// print("其他状态");
// requestLocation();
break;
}
}
Future<void> requestAndroidLocation() async {
location.onLocationChanged().listen((event) {
// print("listenLocationChanged$event");
// EasyLoading.dismiss();
if (event.isNotEmpty) {
setState(() {
addressInfo = event;
});
location.stopLocation();
}
});
if (event.isNotEmpty) {
setState(() {
addressInfo = event;
});
location.stopLocation();
}
});
}
Future<void> requestIOSLocation() async {
@ -136,25 +95,6 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
barTitle: TranslationLoader.lanKeys!.lockAddress!.tr,
haveBack: true,
backgroundColor: AppColors.mainColor,
// actionsList: [
// TextButton(
// child: Text(
// TranslationLoader.lanKeys!.next!.tr,
// style: TextStyle(color: Colors.white, fontSize: 24.sp),
// ),
// onPressed: () {
// if(addressInfo!.isEmpty){
// Toast.show(msg:"还未获取到位置信息哦,请耐心等待一下!");
// return;
// }
// Get.toNamed(Routers.saveLockPage, arguments: {
// "addressInfo": addressInfo,
// "pwdTimestamp": state.pwdTimestamp.value,
// });
// // Navigator.pushNamed(context, Routers.saveLockPage);
// },
// ),
// ],
),
body: ListView(
children: [
@ -168,74 +108,89 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
),
),
SizedBox(
child:
(addressInfo != null && addressInfo!.containsKey("latitude")) ?
Column(
children: [
SizedBox(
height: 1.sw/5*4,
width: 1.sw,
child: AMapWidget(
apiKey: amapApiKeys,
//
initialCameraPosition: (
CameraPosition(
target: LatLng(double.parse(addressInfo!['latitude'].toString()), double.parse(addressInfo!['longitude'].toString())),
zoom: 10.0,
)
),
//
myLocationStyleOptions: MyLocationStyleOptions(
true,
),
// normal,satellite,night, navi,bus,
mapType: MapType.normal,
//
minMaxZoomPreference: const MinMaxZoomPreference(3, 20),
//
privacyStatement: const AMapPrivacyStatement(hasAgree: true, hasContains: true, hasShow: true),
// AMapController
onMapCreated: (AMapController controller) {
mapController = controller;
},
),
),
Container(
// color: Colors.red,
margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
child: (addressInfo != null && addressInfo!.containsKey("latitude"))
? Column(
children: [
Flexible(child: Text("检查以确保以下地址是正确的".tr, style: TextStyle(fontSize: 24.sp))),
],
),
),
// SizedBox(height: 20.h),
Container(
// color: Colors.red,
// height: 45.h,
margin: EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w),
child:Column(
children: [
Row(
SizedBox(
height: 1.sw / 5 * 4,
width: 1.sw,
child: AMapWidget(
apiKey: amapApiKeys,
//
initialCameraPosition: (CameraPosition(
target: LatLng(
double.parse(
addressInfo!['latitude'].toString()),
double.parse(
addressInfo!['longitude'].toString())),
zoom: 10.0,
)),
//
myLocationStyleOptions: MyLocationStyleOptions(
true,
),
// normal,satellite,night, navi,bus,
mapType: MapType.normal,
//
minMaxZoomPreference:
const MinMaxZoomPreference(3, 20),
//
privacyStatement: const AMapPrivacyStatement(
hasAgree: true, hasContains: true, hasShow: true),
// AMapController
onMapCreated: (AMapController controller) {
mapController = controller;
},
),
),
Container(
// color: Colors.red,
margin:
EdgeInsets.only(left: 25.w, top: 20.h, right: 25.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.grey, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip))
),
Flexible(
child: Text("检查以确保以下地址是正确的".tr,
style: TextStyle(fontSize: 24.sp))),
],
),
SizedBox(height: 5.h),
Container(height: 1.h, color: AppColors.mainColor,),
],
)
),
],
) : SizedBox(
height: 1.sw/5*4 + 65.h*2,
child: Center(child: Text('地图加载中,请稍候。。。'.tr)))
,
),
// SizedBox(height: 20.h),
Container(
// color: Colors.red,
// height: 45.h,
margin: EdgeInsets.only(
left: 25.w, top: 20.h, right: 25.w),
child: Column(
children: [
Row(
children: [
Expanded(
child: Text(
addressInfo!["address"].toString() ??
"",
style: const TextStyle(
color: Colors.grey,
fontSize: 16,
fontWeight: FontWeight.w500,
overflow: TextOverflow.clip))),
],
),
SizedBox(height: 5.h),
Container(
height: 1.h,
color: AppColors.mainColor,
),
],
)),
],
)
: SizedBox(
height: 1.sw / 5 * 4 + 65.h * 2,
child: Center(child: Text('地图加载中,请稍候。。。'.tr))),
),
SizedBox(height:200.h),
SizedBox(height: 200.h),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: [
@ -261,7 +216,7 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
style: TextStyle(color: Colors.black, fontSize: 24.sp),
),
onPressed: () {
if(addressInfo!.isEmpty){
if (addressInfo!.isEmpty) {
logic.showToast("还未获取到位置信息哦,请耐心等待一下!".tr);
return;
}
@ -279,50 +234,9 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
),
],
)
// Positioned(
// left: 20.w, right: 20.w, bottom: 100.h,
// child: Container(
// // height: h(106),
// decoration: BoxDecoration(
// color: AppColors.mainColor,
// borderRadius: BorderRadius.circular(15.w),
// ),
// child:Column(
// children: [
// Container(
// // height: h(53),
// padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w),
// child: Row(
// children: [
// Image.asset('images/main/icon_addUserShowAddress.png', width: 30.w, height: 30.w),
// SizedBox(width: 10.w),
// Expanded(
// child: Text(addressInfo!["address"].toString() ?? "", style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, overflow: TextOverflow.clip))
// ),
// ],
// ),
// ),
// // Container(height: 1.h, color: const Color(0xFF021732),),
// // Container(
// // // height: h(52),
// // padding: EdgeInsets.only(top: 15.h, bottom: 15, left:15.w, right: 15.w),
// // child: Row(
// // children: [
// // Image.asset('images/main/icon_addUserAddressShowTime.png', width: 30.w, height: 30.w),
// // SizedBox(width: 10.w,),
// // Expanded(
// // child: Text(DateTool().getNowDateYMDHM(), style: const TextStyle(color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),)
// // ),
// // ],
// // ),
// // ),
// ],
// )
// ),),
],
),
);
}
///
@ -338,7 +252,8 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
///
locationOption.geoLanguage = GeoLanguage.DEFAULT;
locationOption.desiredLocationAccuracyAuthorizationMode = AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
locationOption.desiredLocationAccuracyAuthorizationMode =
AMapLocationAccuracyAuthorizationMode.ReduceAccuracy;
locationOption.fullAccuracyPurposeKey = "AMapLocationScene";
@ -396,21 +311,18 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
@override
void didPush() {
super.didPush();
}
///
@override
void didPop() {
super.didPop();
}
///
@override
void didPopNext() {
super.didPopNext();
}
///
@ -421,5 +333,4 @@ class _LockAddressGaoDePageState extends State<LockAddressGaoDePage> with RouteA
location.stopLocation();
location.destroy();
}
}

View File

@ -161,6 +161,16 @@ class _MinePersonInfoPageState extends State<MinePersonInfoPage> {
Get.toNamed(Routers.valueAddedServicesPage);
},
),
if (widget.showAbout)
CommonItem(
leftTitel: TranslationLoader.lanKeys!.set!.tr,
isHaveLine: true,
isHaveDirection: true,
action: () {
Get.back();
Get.toNamed(Routers.mineSetPage);
},
),
if (widget.showAbout)
CommonItem(
leftTitel: TranslationLoader.lanKeys!.about!.tr,

View File

@ -12,6 +12,9 @@ class PermissionDialog {
Permission.photos: '相册'.tr,
Permission.storage: '读写'.tr,
Permission.location: '定位'.tr,
Permission.bluetooth: '蓝牙'.tr,
Permission.bluetoothScan: '蓝牙'.tr,
Permission.bluetoothConnect: '蓝牙'.tr,
};
static Map<Permission, String> contents = {
@ -19,8 +22,67 @@ class PermissionDialog {
Permission.photos: '需要访问相机权限才能使用相册图片上传文件上传头像'.tr,
Permission.storage: '需要访问读写权限才能使用本地图片上传头像'.tr,
Permission.location: '需要访问定位权限才能使用添加钥匙功能的位置信息'.tr,
Permission.bluetooth: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr,
Permission.bluetoothScan: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr,
Permission.bluetoothConnect: '需要访问蓝牙权限才能使用添加钥匙功能的位置信息'.tr,
};
static Future<bool> requestBluetooth() async {
if (Get.context == null) {
return false;
}
bool application = true;
Map<Permission, PermissionStatus> statuses = await [
Permission.bluetoothScan,
Permission.bluetoothConnect,
].request();
Permission permission = Permission.bluetoothScan;
dynamic cache = await Storage.getString(titles[permission]);
bool isGranted = statuses.values.every((element) => element.isGranted);
if (AppPlatform.isAndroid && !isGranted && cache is! String) {
application = await showCupertinoDialog(
context: Get.context!,
builder: (context) {
return PopScope(
canPop: false,
child: CupertinoAlertDialog(
title: Text('${'申请'.tr}${titles[permission] ?? ''}${'权限'.tr}'),
content: Text(contents[permission] ?? ''),
actions: [
CupertinoDialogAction(
child: Text('不允许'.tr),
onPressed: () {
Get.back(result: false);
},
),
CupertinoDialogAction(
child: Text('允许'.tr),
onPressed: () {
Get.back(result: true);
},
),
],
));
},
);
if (application) {
await Storage.setString(titles[permission], titles[permission]);
}
} else if (cache is String) {
bool isDenied = statuses.values.every((element) => element.isDenied);
if (isDenied) {
showSet(permission);
return false;
}
}
if (application) {
PermissionStatus status = await permission.request();
return status.isGranted;
}
return false;
}
//
static Future<bool> request(Permission permission) async {
if (Get.context == null) {

View File

@ -15,7 +15,7 @@ class WxPayTool {
static Future<void> pay(Payment payment, WeChatResponseSubscriber listener) async {
if (!isInit) {
isInit = true;
await init(payment.appId, '123');
await init(payment.appId, 'https://lock.skychip.top/apple-app-site-association.json');
//
responseListener(WeChatResponse response) {
if (response is WeChatPaymentResponse) {

View File

@ -0,0 +1,27 @@
import 'package:colorfilter_generator/addons.dart';
import 'package:colorfilter_generator/colorfilter_generator.dart';
import 'package:flutter/material.dart';
import 'package:star_lock/flavors.dart';
class FlavorsImg extends StatelessWidget {
FlavorsImg({required this.child, key});
Widget child;
ColorFilterGenerator myFilter = ColorFilterGenerator(name: "xhj", filters: [
// ColorFilterAddons.addictiveColor(1, 22, 93),
ColorFilterAddons.addictiveColor(1, 22, 93),
// ColorFilterAddons.grayscale(),z
]);
@override
Widget build(BuildContext context) {
if (F.appFlavor != Flavor.xhj) {
return child;
}
return ColorFiltered(
colorFilter: ColorFilter.matrix(myFilter.matrix),
child: child,
);
}
}

View File

@ -31,9 +31,11 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# 1.0.26+20240408打包预发布环境给欧阳测试
# 1.0.27+2024041101打包提审
# 1.0.27+2024041102打包预发布环境给田总测试
# 1.0.28+2024041703打包给欧阳回归测试
# 1.0.28+2024041702打包给欧阳回归测试
# 1.0.27+2024041702 打包星星锁提审华为
# 1.0.27+2024041703 打包星星锁提审ios
version: 1.0.28+2024041703
version: 1.0.27+2024041803
environment:
sdk: '>=2.12.0 <3.0.0'
@ -161,6 +163,7 @@ dependencies:
fluwx: ^4.5.5
system_settings: ^2.0.0
expandable: ^5.0.1
colorfilter_generator: ^0.0.8
dev_dependencies: