口味😋: 完成Android的口味构建

This commit is contained in:
葛佳祥 2024-01-27 16:05:17 +08:00
parent 5b4f3c3b15
commit 0c9e64905d
44 changed files with 402 additions and 365 deletions

View File

@ -28,6 +28,35 @@ apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
// ----- BEGIN flavorDimensions (autogenerated by flutter_flavorizr) -----
flavorDimensions "flavor-type"
productFlavors {
dev {
dimension "flavor-type"
applicationId "com.starlock.lock.dev"
resValue "string", "app_name", "星锁-dev"
}
pre {
dimension "flavor-type"
applicationId "com.starlock.lock.pre"
resValue "string", "app_name", "星锁"
}
sky {
dimension "flavor-type"
applicationId "com.skychip.lock"
resValue "string", "app_name", "锁通通"
}
xhj {
dimension "flavor-type"
applicationId "com.xhjcn.lock"
resValue "string", "app_name", "鑫锁"
}
}
// ----- END flavorDimensions (autogenerated by flutter_flavorizr) -----
compileSdkVersion flutter.compileSdkVersion
ndkVersion flutter.ndkVersion

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,110 +1,78 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.star_lock">
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />-->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />-->
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--允许获取粗略位置,粗略定位必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--允许获取设备和运营商信息用于问题排查和网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
<!--允许获取网络状态用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允许获取wifi网络信息用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允许获取wifi状态改变用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--后台获取位置信息,若需后台定位则必选-->
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
<!--用于申请调用A-GPS模块,卫星定位加速-->
<!-- <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />-->
<!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!--允许写入扩展存储,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--允许麦克风权限,用于录音发送-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.REORDER_TASKS" />
<application
android:label="星锁"
android:name="${applicationName}"
android:icon="@mipmap/ic_logo">
<!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService"/>
<activity
android:name="cn.starlock.lock.MainActivity"
android:exported="true"
android:screenOrientation="portrait"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.star_lock">
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />-->
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />-->
<!--允许访问网络,必选权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--允许获取精确位置,精准定位必选-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<!--允许获取粗略位置,粗略定位必选-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!--允许获取设备和运营商信息用于问题排查和网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
<!--允许获取网络状态用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--允许获取wifi网络信息用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<!--允许获取wifi状态改变用于网络定位无gps情况下的定位若需网络定位功能则必选-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<!--后台获取位置信息,若需后台定位则必选-->
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
<!--用于申请调用A-GPS模块,卫星定位加速-->
<!-- <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />-->
<!--允许写设备缓存,用于问题排查-->
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<!--允许写入扩展存储,用于写入缓存定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--允许读设备等信息,用于问题排查-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<!--允许麦克风权限,用于录音发送-->
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.REORDER_TASKS"/>
<application android:label="@string/app_name" android:name="${applicationName}" android:icon="@mipmap/ic_launcher">
<!-- 配置定位Service -->
<service android:name="com.amap.api.location.APSService"/>
<activity android:name="cn.starlock.lock.MainActivity" android:exported="true" android:screenOrientation="portrait" android:launchMode="singleTop" android:theme="@style/LaunchTheme" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode" android:hardwareAccelerated="true" android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme"/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data android:name="com.amap.api.v2.apikey" android:value="11d49b3f4fc09c04a02bbb7500925ba2"> </meta-data>
<!-- 请填写你自己的- appKey -->
<meta-data android:name="com.alibaba.app.appkey" android:value="333904040"/>
<!-- 请填写你自己的appSecret -->
<meta-data android:name="com.alibaba.app.appsecret" android:value="c316965fe0a74fc9a481a5c44a535dc2"/>
<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver
android:name="cn.starlock.lock.MyMessageReceiver"
android:exported="false" > <!-- 为保证receiver安全建议设置不可导出如需对其他应用开放可通过androidpermission进行限制 -->
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.intent.MESSAGE" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.RECEIVE" />
</intent-filter>
</receiver>
</application>
<meta-data android:name="flutterEmbedding" android:value="2"/>
<meta-data android:name="com.amap.api.v2.apikey" android:value="11d49b3f4fc09c04a02bbb7500925ba2"></meta-data>
<!-- 请填写你自己的- appKey -->
<meta-data android:name="com.alibaba.app.appkey" android:value="333904040"/>
<!-- 请填写你自己的appSecret -->
<meta-data android:name="com.alibaba.app.appsecret" android:value="c316965fe0a74fc9a481a5c44a535dc2"/>
<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver android:name="cn.starlock.lock.MyMessageReceiver" android:exported="false">
<!-- 为保证receiver安全建议设置不可导出如需对其他应用开放可通过androidpermission进行限制 -->
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.intent.MESSAGE"/>
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED"/>
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED"/>
</intent-filter>
<intent-filter>
<action android:name="com.alibaba.sdk.android.push.RECEIVE"/>
</intent-filter>
</receiver>
</application>
</manifest>

View File

@ -7,6 +7,6 @@
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_logo" />
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>

View File

@ -7,6 +7,6 @@
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_logo" />
android:src="@mipmap/ic_launcher" />
</item>
</layer-list>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -1,93 +1,54 @@
# 用于编译出不同的APPID
# 用法dart run flutter_flavorizr -p xxx
# 生成:意思是将本文件定义的配置,生成对应的代码,或者原生的配置、构建过程、文件资源等
# 风味用法dart run flutter_flavorizr -p <processor_1>,<processor_2>
# 用法-生成flutter风味配置文件lib/flavors.dartdart run flutter_flavorizr -p flutter:flavors
# 以下行为都是覆盖,所以如果不是很清楚自己在做什么,请不要随意运行,以免覆盖有用的文件
# 安卓图标dart run flutter_flavorizr -p android:icons
# 安卓构建参数集配置dart run flutter_flavorizr -p android:androidManifest
# 安卓构建目标配置dart run flutter_flavorizr -p android:buildGradle
# iOS图标dart run flutter_flavorizr -
# iOS构建参数集配置dart run flutter_flavorizr -
# iOS构建目标配置dart run flutter_flavorizr -
# 用法-生成安卓图标dart run flutter_flavorizr -p android:icons
# 用法-生成安卓构建参数集配置dart run flutter_flavorizr -p android:androidManifest
# 用法-生成安卓构建目标配置dart run flutter_flavorizr -p android:buildGradle
# 项目运行说明添加不同风味后不能再使用flutter默认的运行方式`flutter run`,而是需要指定运行的风味
# flutter run --flavor <flavor> -t lib/main_<flavor>.dart
# 注意,这里有 入口文件(main_<flavor>.dart) 和 口味(<flavor>) 两个参数
# 其中入口文件在代码中指定运行时的差异,例如 页面上的名称、颜色、API请求的域名等
# 而 口味 指定 构建差异,例如 APPID、Logo、应用名称等
# 下面是4个运行示例
# 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.dart
# flutter run --flavor xhj -t lib/main_xhj.dart
# 用法-生成iOS图标dart run flutter_flavorizr -p ios:icons
# 用法-生成iOS构建参数集配置dart run flutter_flavorizr -p ios:xcconfig
# 用法-生成iOS构建目标配置dart run flutter_flavorizr -p ios:buildTargets
app:
android:
flavorDimensions: "flavor-type"
# 运行flutter run --flavor <flavorName> -t lib/main.dart
# 构建flutter build --flavor <flavorName> -t lib/main.dart
# 例如flutter run --profile --flavor dev -t lib/main.dart
flavorizr:
app:
android:
flavorDimensions: "flavor-type"
ios:
ide: "idea"
flavors:
dev:
app:
name: "星锁-dev"
icon: "assets/icon/dev.png"
instructions: [
"android:icons",
"android:androidManifest",
"android:buildGradle",
"ios:icons",
"ios:xcconfig",
"ios:buildTargets"
]
android:
applicationId: "com.starlock.lock.dev"
ios:
bundleId: "com.starlock.lock.dev"
buildSettings:
# 开发团队在苹果开发者门户中可见
DEVELOPMENT_TEAM: YOURDEVTEAMID
PROVISIONING_PROFILE_SPECIFIER: "Dev-ProvisioningProfile"
pre:
app:
name: "星锁-pre"
name: "星锁"
icon: "assets/icon/pre.png"
instructions: [
"android:icons",
"android:androidManifest",
"android:buildGradle",
"ios:icons",
"ios:xcconfig",
"ios:buildTargets"
]
android:
applicationId: "com.starlock.lock.pre"
ios:
bundleId: "com.starlock.lock.pre"
sky:
app:
name: "锁通通"
icon: "assets/icon/sky.png"
instructions: [
"android:icons",
"android:androidManifest",
"android:buildGradle",
"ios:icons",
"ios:xcconfig",
"ios:buildTargets"
]
android:
applicationId: "com.skychip.lock"
ios:
bundleId: "com.skychip.lock"
xhj:
app:
name: "鑫锁"
icon: "assets/icon/xhj.png"
instructions: [
"android:icons",
"android:androidManifest",
"android:buildGradle",
"ios:icons",
"ios:xcconfig",
"ios:buildTargets"
]
android:
applicationId: "com.xhjcn.lock"
ios:
bundleId: "com.xhjcn.lock"
ide: idea

177
star_lock/lib/app.dart Normal file
View File

@ -0,0 +1,177 @@
import 'package:aliyun_push/aliyun_push.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_aliyunPush.dart';
import 'package:star_lock/translations/app_dept.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'appRouters.dart';
import 'baseWidget.dart';
import 'tools/appRouteObserver.dart';
import 'dart:io';
import 'package:flutter/services.dart';
class MyApp extends StatefulWidget {
const MyApp({GlobalKey? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
// RouteObserver navigation observer.
// final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(585, 1265),
builder: (w, a) => _initMaterialApp());
}
GetMaterialApp _initMaterialApp() => GetMaterialApp(
title: 'Star Lock',
navigatorObservers: [AppRouteObserver().routeObserver],
translations: TranslationMessage(),
supportedLocales: appDept.deptSupportedLocales,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
localeResolutionCallback: (locale, supportedLocales) {
if (!supportedLocales.contains(locale)) {
int idx = appSupportedLocales.indexWhere(
(element) => element.languageCode == locale!.languageCode);
if (idx != -1) {
locale = appSupportedLocales[idx];
} else {
locale = const Locale('zh', 'CN');
}
}
// print("localelocalelocalelocalelocale locale:${locale} locale.languageCode:${locale.languageCode} locale.countryCode:${locale.countryCode} supportedLocales:${supportedLocales}");
AppManager()
.setLanCode(code: '${locale!.languageCode}_${locale.countryCode}');
return locale;
},
// locale: StoreService.to.getLanguageCode().isNotEmpty ? appDept.deptSupportedLocales.where((element) => element.languageCode == StoreService.to.getLanguageCode()).first : Get.deviceLocale,
locale: Get.deviceLocale,
fallbackLocale: const Locale('zh', 'CN'),
theme: ThemeData(
scaffoldBackgroundColor: const Color(0xFFF6F6F6),
backgroundColor: const Color(0xFFF6F6F6),
primaryColor: const Color(0xFFFFFFFF),
textTheme: TextTheme(
//Material组件上的文字显示,
bodyText1:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
//Material组件上的文字显示
bodyText2:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
button: TextStyle(fontSize: 28.sp)),
iconTheme: IconThemeData(size: 28.sp, color: const Color(0xff2E2B2B)),
appBarTheme: AppBarTheme(
backgroundColor: const Color(0xFFFFFFFF),
elevation: 0,
centerTitle: true,
iconTheme: IconThemeData(color: const Color(0xff333333), size: 36.sp),
titleTextStyle: TextStyle(
color: const Color(0xff333333),
fontWeight: FontWeight.w400,
fontSize: 36.sp),
),
splashColor: Colors.transparent, //
highlightColor: Colors.transparent,
),
debugShowCheckedModeBanner: false,
getPages: AppRouters.routePages,
builder: EasyLoading.init(),
initialBinding: AppBindings(),
initialRoute: '/');
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
openBlueScan();
initAliyunPush();
}
//
void initAliyunPush() {
final aliyunPush = AliyunPush();
XSAliyunPushProvider().init(aliyunPush);
XSAliyunPushProvider().initAliyunPush();
if (Platform.isAndroid) {
XSAliyunPushProvider().initAliyunThirdPush();
}
//使DeviceID推送
aliyunPush.getDeviceId().then((deviceId) async {
// print('得到的DeviceId$deviceId');
final data = await Storage.getString(saveUserLoginData);
if (data!.isNotEmpty && deviceId.isNotEmpty) {
XSAliyunPushProvider()
.pushBindDeviceID(deviceId, Platform.isAndroid ? 10 : 20);
}
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
void openBlueScan() {
if (Platform.isIOS) {
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
getMicrophonePermission().then((value) {
if (value) {
//
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
//
openAppSettings(); //app系统设置
}
});
}
}
// void startScanAction() {
// BlueManage().startScan();
// }
///
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

@ -1,8 +1,8 @@
import 'package:star_lock/network/api.dart';
import '../../flavors.dart';
class XSConstantMacro {
//
static String baseWebURL = Api.baseAddress; //base地址
static String baseWebURL = F.apiPrefix; //base地址
static String introduceURL = '$baseWebURL/app/introduce'; //
static String userAgreementURL = '$baseWebURL/app/userAgreement'; //
static String privacyPolicyURL = '$baseWebURL/app/privacy'; //

View File

@ -0,0 +1,43 @@
enum Flavor {
dev,
pre,
sky,
xhj,
}
class F {
static Flavor? appFlavor;
static String get name => appFlavor?.name ?? '';
static String get title {
switch (appFlavor) {
case Flavor.dev:
return '星锁-dev';
case Flavor.pre:
return '星锁-pre';
case Flavor.sky:
return '锁通通';
case Flavor.xhj:
return '鑫锁';
default:
throw Exception('flavor[$name] title not found');
}
}
static String get apiPrefix {
switch (appFlavor) {
case Flavor.dev:
return 'https://dev.lock.star-lock.cn';
case Flavor.pre:
return 'https://pre.lock.star-lock.cn';
case Flavor.sky:
return 'https://lock.skychip.top';
case Flavor.xhj:
return 'https://lock.xhjcn.ltd';
default:
// "http://192.168.1.15:8022"; //
// "https://ge.lock.star-lock.cn"; //
throw Exception('flavor[$name] apiPrefix not found');
}
}
}

View File

@ -1,28 +1,16 @@
import 'package:aliyun_push/aliyun_push.dart';
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart';
import 'package:flutter/services.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'app.dart';
import 'package:star_lock/tools/device_info_service.dart';
import 'package:star_lock/tools/platform_info_services.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/tools/xs_aliyunPush.dart';
import 'package:star_lock/translations/app_dept.dart';
import 'package:star_lock/translations/trans_lib.dart';
import 'appRouters.dart';
import 'baseWidget.dart';
import 'blue/blue_manage.dart';
import 'tools/appRouteObserver.dart';
import 'app_settings/app_settings.dart';
import 'tools/store_service.dart';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:get/get.dart';
void main() async {
// flavorizr.yaml
FutureOr<void> main() async {
await _setCommonServices();
//
@ -30,135 +18,19 @@ void main() async {
runApp(MyApp());
if (Platform.isAndroid) {
if (AppPlatform.isAndroid) {
SystemUiOverlayStyle systemUiOverlayStyle =
const SystemUiOverlayStyle(statusBarColor: Colors.transparent);
const SystemUiOverlayStyle(statusBarColor: Colors.transparent);
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
}
}
class MyApp extends StatefulWidget {
const MyApp({GlobalKey? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
// RouteObserver navigation observer.
// final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: const Size(585, 1265),
builder: (w, a) => _initMaterialApp());
}
GetMaterialApp _initMaterialApp() => GetMaterialApp(
title: 'Star Lock',
navigatorObservers: [AppRouteObserver().routeObserver],
translations: TranslationMessage(),
supportedLocales: appDept.deptSupportedLocales,
localizationsDelegates: const [
GlobalMaterialLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
localeResolutionCallback: (locale, supportedLocales) {
if (!supportedLocales.contains(locale)) {
int idx = appSupportedLocales.indexWhere(
(element) => element.languageCode == locale!.languageCode);
if (idx != -1) {
locale = appSupportedLocales[idx];
} else {
locale = const Locale('zh', 'CN');
}
}
// print("localelocalelocalelocalelocale locale:${locale} locale.languageCode:${locale.languageCode} locale.countryCode:${locale.countryCode} supportedLocales:${supportedLocales}");
AppManager()
.setLanCode(code: '${locale!.languageCode}_${locale.countryCode}');
return locale;
},
// locale: StoreService.to.getLanguageCode().isNotEmpty ? appDept.deptSupportedLocales.where((element) => element.languageCode == StoreService.to.getLanguageCode()).first : Get.deviceLocale,
locale: Get.deviceLocale,
fallbackLocale: const Locale('zh', 'CN'),
theme: ThemeData(
scaffoldBackgroundColor: const Color(0xFFF6F6F6),
backgroundColor: const Color(0xFFF6F6F6),
primaryColor: const Color(0xFFFFFFFF),
textTheme: TextTheme(
//Material组件上的文字显示,
bodyText1:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
//Material组件上的文字显示
bodyText2:
TextStyle(fontSize: 28.sp, color: const Color(0xff2E2B2B)),
button: TextStyle(fontSize: 28.sp)),
iconTheme: IconThemeData(size: 28.sp, color: const Color(0xff2E2B2B)),
appBarTheme: AppBarTheme(
backgroundColor: const Color(0xFFFFFFFF),
elevation: 0,
centerTitle: true,
iconTheme: IconThemeData(color: const Color(0xff333333), size: 36.sp),
titleTextStyle: TextStyle(
color: const Color(0xff333333),
fontWeight: FontWeight.w400,
fontSize: 36.sp),
),
splashColor: Colors.transparent, //
highlightColor: Colors.transparent,
),
debugShowCheckedModeBanner: false,
getPages: AppRouters.routePages,
builder: EasyLoading.init(),
initialBinding: AppBindings(),
initialRoute: '/');
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
openBlueScan();
initAliyunPush();
}
//
void initAliyunPush() {
final aliyunPush = AliyunPush();
XSAliyunPushProvider().init(aliyunPush);
XSAliyunPushProvider().initAliyunPush();
if (Platform.isAndroid) {
XSAliyunPushProvider().initAliyunThirdPush();
}
//使DeviceID推送
aliyunPush.getDeviceId().then((deviceId) async {
// print('得到的DeviceId$deviceId');
final data = await Storage.getString(saveUserLoginData);
if (data!.isNotEmpty && deviceId.isNotEmpty) {
XSAliyunPushProvider()
.pushBindDeviceID(deviceId, Platform.isAndroid ? 10 : 20);
}
});
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
}
//
Future _initTranslation() async => TranslationLoader.loadTranslation(
zhSource: "images/lan/lan_zh.json",
enSource: "images/lan/lan_en.json",
keySource: "images/lan/lan_keys.json",
);
zhSource: "images/lan/lan_zh.json",
enSource: "images/lan/lan_en.json",
keySource: "images/lan/lan_keys.json",
);
//
Future _setCommonServices() async {
@ -167,43 +39,3 @@ Future _setCommonServices() async {
await Get.putAsync(() => DeviceInfoService().init());
// Get.log(PlatformInfoService.to.info.version);
}
void openBlueScan() {
if (Platform.isIOS) {
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
getMicrophonePermission().then((value) {
if (value) {
//
print("有蓝牙权限开始扫描");
// startScanAction();
} else {
//
openAppSettings(); //app系统设置
}
});
}
}
// void startScanAction() {
// BlueManage().startScan();
// }
///
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

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

View File

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

View File

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

View File

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

View File

@ -5,6 +5,7 @@ import 'package:star_lock/appRouters.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import '../../app_settings/app_colors.dart';
import '../../flavors.dart';
import '../../tools/commonItem.dart';
import '../../tools/titleAppBar.dart';
import '../../translations/trans_lib.dart';
@ -38,12 +39,12 @@ class _AboutPageState extends State<AboutPage> {
),
SizedBox(height: 20.h),
Text(
"星锁 1.0.0.09(preRelease-20240126-1)",
"${F.title} 1.0.0.09(preRelease-20240126-1)",
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor),
),
SizedBox(height: 20.h),
Text(
Api.baseAddress,
F.apiPrefix,
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor),
),
SizedBox(

View File

@ -1,11 +1,4 @@
abstract class Api {
static String baseAddress = "https://pre.lock.star-lock.cn"; //
// static String baseAddress = "https://dev.lock.star-lock.cn"; //
// static String baseAddress = "http://192.168.1.15:8022"; //
// static String baseAddress = "https://ge.lock.star-lock.cn"; //
final String baseUrl = "$baseAddress/api";
//
final String getVerificationCodeUrl = '/user/sendValidationCode';
final String registerUrl = '/user/register';

View File

@ -2,6 +2,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:get/get.dart';
import '../appRouters.dart';
import '../flavors.dart';
import 'api.dart';
import 'request_interceptor.dart';
import 'request_interceptor_log.dart';
@ -11,7 +12,7 @@ import 'response_interceptor_log.dart';
class BaseProvider extends GetConnect with Api {
@override
void onInit() {
httpClient.baseUrl = baseUrl;
httpClient.baseUrl = '${F.apiPrefix}/api';
httpClient.addRequestModifier(requestInterceptor);
httpClient.addResponseModifier(responseInterceptor);
httpClient.addRequestModifier(requestLogInterceptor);

View File

@ -8,7 +8,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:star_lock/main.dart';
import 'package:star_lock/app.dart';
void main() {
testWidgets('Counter increments smoke test', (WidgetTester tester) async {