口味😋: 完成Android的口味构建
@ -28,6 +28,35 @@ apply plugin: 'kotlin-android'
|
|||||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||||
|
|
||||||
android {
|
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
|
compileSdkVersion flutter.compileSdkVersion
|
||||||
ndkVersion flutter.ndkVersion
|
ndkVersion flutter.ndkVersion
|
||||||
|
|
||||||
|
|||||||
BIN
star_lock/android/app/src/dev/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.0 KiB |
BIN
star_lock/android/app/src/dev/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.6 KiB |
BIN
star_lock/android/app/src/dev/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
star_lock/android/app/src/dev/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 9.2 KiB |
BIN
star_lock/android/app/src/dev/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
@ -1,110 +1,78 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.star_lock">
|
||||||
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.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" />
|
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" android:maxSdkVersion="30" />-->
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" android:maxSdkVersion="30" />-->
|
||||||
<!-- <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.INTERNET" />
|
<!--允许获取粗略位置,粗略定位必选-->
|
||||||
<!--允许获取精确位置,精准定位必选-->
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
<!--允许获取设备和运营商信息,用于问题排查和网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
||||||
<!--允许获取粗略位置,粗略定位必选-->
|
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
|
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS"/>
|
||||||
|
<!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
||||||
<!--允许获取设备和运营商信息,用于问题排查和网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
|
<!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
||||||
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
|
||||||
|
<!--允许获取wifi状态改变,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
||||||
<!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
|
||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<!--后台获取位置信息,若需后台定位则必选-->
|
||||||
|
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
|
||||||
<!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
<!--用于申请调用A-GPS模块,卫星定位加速-->
|
||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<!-- <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />-->
|
||||||
|
<!--允许写设备缓存,用于问题排查-->
|
||||||
<!--允许获取wifi状态改变,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
|
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
<!--允许写入扩展存储,用于写入缓存定位数据-->
|
||||||
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
<!--后台获取位置信息,若需后台定位则必选-->
|
<!--允许读设备等信息,用于问题排查-->
|
||||||
<!-- <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />-->
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
|
<!--允许麦克风权限,用于录音发送-->
|
||||||
<!--用于申请调用A-GPS模块,卫星定位加速-->
|
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
||||||
<!-- <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />-->
|
<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.WRITE_SETTINGS" />
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
||||||
|
<uses-permission android:name="android.permission.VIBRATE"/>
|
||||||
<!--允许写入扩展存储,用于写入缓存定位数据-->
|
<uses-permission android:name="android.permission.REORDER_TASKS"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
<application android:label="@string/app_name" android:name="${applicationName}" android:icon="@mipmap/ic_launcher">
|
||||||
|
<!-- 配置定位Service -->
|
||||||
<!--允许读设备等信息,用于问题排查-->
|
<service android:name="com.amap.api.location.APSService"/>
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
<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
|
||||||
<!--允许麦克风权限,用于录音发送-->
|
|
||||||
<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
|
|
||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
to determine the Window background behind the Flutter UI. -->
|
to determine the Window background behind the Flutter UI. -->
|
||||||
<meta-data
|
<meta-data android:name="io.flutter.embedding.android.NormalTheme" android:resource="@style/NormalTheme"/>
|
||||||
android:name="io.flutter.embedding.android.NormalTheme"
|
<intent-filter>
|
||||||
android:resource="@style/NormalTheme"
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
/>
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
<intent-filter>
|
</intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN"/>
|
</activity>
|
||||||
<category android:name="android.intent.category.LAUNCHER"/>
|
<!-- Don't delete the meta-data below.
|
||||||
</intent-filter>
|
|
||||||
|
|
||||||
</activity>
|
|
||||||
<!-- Don't delete the meta-data below.
|
|
||||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||||
<meta-data
|
<meta-data android:name="flutterEmbedding" android:value="2"/>
|
||||||
android:name="flutterEmbedding"
|
<meta-data android:name="com.amap.api.v2.apikey" android:value="11d49b3f4fc09c04a02bbb7500925ba2"></meta-data>
|
||||||
android:value="2" />
|
<!-- 请填写你自己的- appKey -->
|
||||||
<meta-data android:name="com.amap.api.v2.apikey" android:value="11d49b3f4fc09c04a02bbb7500925ba2"> </meta-data>
|
<meta-data android:name="com.alibaba.app.appkey" android:value="333904040"/>
|
||||||
<!-- 请填写你自己的- appKey -->
|
<!-- 请填写你自己的appSecret -->
|
||||||
<meta-data android:name="com.alibaba.app.appkey" android:value="333904040"/>
|
<meta-data android:name="com.alibaba.app.appsecret" android:value="c316965fe0a74fc9a481a5c44a535dc2"/>
|
||||||
<!-- 请填写你自己的appSecret -->
|
<!-- 消息接收监听器 (用户可自主扩展) -->
|
||||||
<meta-data android:name="com.alibaba.app.appsecret" android:value="c316965fe0a74fc9a481a5c44a535dc2"/>
|
<receiver android:name="cn.starlock.lock.MyMessageReceiver" android:exported="false">
|
||||||
<!-- 消息接收监听器 (用户可自主扩展) -->
|
<!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
|
||||||
<receiver
|
<intent-filter>
|
||||||
android:name="cn.starlock.lock.MyMessageReceiver"
|
<action android:name="com.alibaba.sdk.android.push.intent.MESSAGE"/>
|
||||||
android:exported="false" > <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.alibaba.sdk.android.push.intent.MESSAGE" />
|
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
|
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
|
<action android:name="com.alibaba.sdk.android.push.RECEIVE"/>
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
<intent-filter>
|
</receiver>
|
||||||
<action android:name="com.alibaba.sdk.android.push.RECEIVE" />
|
</application>
|
||||||
</intent-filter>
|
|
||||||
</receiver>
|
|
||||||
</application>
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@ -7,6 +7,6 @@
|
|||||||
<item>
|
<item>
|
||||||
<bitmap
|
<bitmap
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:src="@mipmap/ic_logo" />
|
android:src="@mipmap/ic_launcher" />
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
|||||||
@ -7,6 +7,6 @@
|
|||||||
<item>
|
<item>
|
||||||
<bitmap
|
<bitmap
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:src="@mipmap/ic_logo" />
|
android:src="@mipmap/ic_launcher" />
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 11 KiB |
BIN
star_lock/android/app/src/pre/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
star_lock/android/app/src/pre/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
star_lock/android/app/src/pre/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 5.4 KiB |
BIN
star_lock/android/app/src/pre/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
star_lock/android/app/src/pre/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
star_lock/android/app/src/sky/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
star_lock/android/app/src/sky/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
star_lock/android/app/src/sky/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
star_lock/android/app/src/sky/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.7 KiB |
BIN
star_lock/android/app/src/sky/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
star_lock/android/app/src/xhj/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.7 KiB |
BIN
star_lock/android/app/src/xhj/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
star_lock/android/app/src/xhj/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
star_lock/android/app/src/xhj/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.0 KiB |
BIN
star_lock/android/app/src/xhj/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 46 KiB |
@ -1,93 +1,54 @@
|
|||||||
# 用于编译出不同的APPID
|
# 用于编译出不同的APPID
|
||||||
|
|
||||||
# 用法:dart run flutter_flavorizr -p xxx
|
# 生成:意思是将本文件定义的配置,生成对应的代码,或者原生的配置、构建过程、文件资源等
|
||||||
|
# 风味用法:dart run flutter_flavorizr -p <processor_1>,<processor_2>
|
||||||
|
|
||||||
# 用法-生成flutter风味配置文件(lib/flavors.dart):dart 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
|
# 项目运行说明:添加不同风味后,不能再使用flutter默认的运行方式`flutter run`,而是需要指定运行的风味
|
||||||
# 用法-生成安卓构建参数集配置:dart run flutter_flavorizr -p android:androidManifest
|
# flutter run --flavor <flavor> -t lib/main_<flavor>.dart
|
||||||
# 用法-生成安卓构建目标配置:dart run flutter_flavorizr -p android:buildGradle
|
# 注意,这里有 入口文件(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
|
app:
|
||||||
# 用法-生成iOS构建参数集配置:dart run flutter_flavorizr -p ios:xcconfig
|
android:
|
||||||
# 用法-生成iOS构建目标配置:dart run flutter_flavorizr -p ios:buildTargets
|
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:
|
flavors:
|
||||||
dev:
|
dev:
|
||||||
app:
|
app:
|
||||||
name: "星锁-dev"
|
name: "星锁-dev"
|
||||||
icon: "assets/icon/dev.png"
|
icon: "assets/icon/dev.png"
|
||||||
instructions: [
|
|
||||||
"android:icons",
|
|
||||||
"android:androidManifest",
|
|
||||||
"android:buildGradle",
|
|
||||||
"ios:icons",
|
|
||||||
"ios:xcconfig",
|
|
||||||
"ios:buildTargets"
|
|
||||||
]
|
|
||||||
android:
|
android:
|
||||||
applicationId: "com.starlock.lock.dev"
|
applicationId: "com.starlock.lock.dev"
|
||||||
ios:
|
|
||||||
bundleId: "com.starlock.lock.dev"
|
|
||||||
buildSettings:
|
|
||||||
# 开发团队在苹果开发者门户中可见
|
|
||||||
DEVELOPMENT_TEAM: YOURDEVTEAMID
|
|
||||||
PROVISIONING_PROFILE_SPECIFIER: "Dev-ProvisioningProfile"
|
|
||||||
pre:
|
pre:
|
||||||
app:
|
app:
|
||||||
name: "星锁-pre"
|
name: "星锁"
|
||||||
icon: "assets/icon/pre.png"
|
icon: "assets/icon/pre.png"
|
||||||
instructions: [
|
|
||||||
"android:icons",
|
|
||||||
"android:androidManifest",
|
|
||||||
"android:buildGradle",
|
|
||||||
"ios:icons",
|
|
||||||
"ios:xcconfig",
|
|
||||||
"ios:buildTargets"
|
|
||||||
]
|
|
||||||
android:
|
android:
|
||||||
applicationId: "com.starlock.lock.pre"
|
applicationId: "com.starlock.lock.pre"
|
||||||
ios:
|
|
||||||
bundleId: "com.starlock.lock.pre"
|
|
||||||
sky:
|
sky:
|
||||||
app:
|
app:
|
||||||
name: "锁通通"
|
name: "锁通通"
|
||||||
icon: "assets/icon/sky.png"
|
icon: "assets/icon/sky.png"
|
||||||
instructions: [
|
|
||||||
"android:icons",
|
|
||||||
"android:androidManifest",
|
|
||||||
"android:buildGradle",
|
|
||||||
"ios:icons",
|
|
||||||
"ios:xcconfig",
|
|
||||||
"ios:buildTargets"
|
|
||||||
]
|
|
||||||
android:
|
android:
|
||||||
applicationId: "com.skychip.lock"
|
applicationId: "com.skychip.lock"
|
||||||
ios:
|
|
||||||
bundleId: "com.skychip.lock"
|
|
||||||
xhj:
|
xhj:
|
||||||
app:
|
app:
|
||||||
name: "鑫锁"
|
name: "鑫锁"
|
||||||
icon: "assets/icon/xhj.png"
|
icon: "assets/icon/xhj.png"
|
||||||
instructions: [
|
|
||||||
"android:icons",
|
|
||||||
"android:androidManifest",
|
|
||||||
"android:buildGradle",
|
|
||||||
"ios:icons",
|
|
||||||
"ios:xcconfig",
|
|
||||||
"ios:buildTargets"
|
|
||||||
]
|
|
||||||
android:
|
android:
|
||||||
applicationId: "com.xhjcn.lock"
|
applicationId: "com.xhjcn.lock"
|
||||||
ios:
|
ide: idea
|
||||||
bundleId: "com.xhjcn.lock"
|
|
||||||
|
|||||||
177
star_lock/lib/app.dart
Normal 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;
|
||||||
|
}
|
||||||
@ -1,8 +1,8 @@
|
|||||||
import 'package:star_lock/network/api.dart';
|
import '../../flavors.dart';
|
||||||
|
|
||||||
class XSConstantMacro {
|
class XSConstantMacro {
|
||||||
// 网页的宏定义网址
|
// 网页的宏定义网址
|
||||||
static String baseWebURL = Api.baseAddress; //base地址
|
static String baseWebURL = F.apiPrefix; //base地址
|
||||||
static String introduceURL = '$baseWebURL/app/introduce'; //介绍页
|
static String introduceURL = '$baseWebURL/app/introduce'; //介绍页
|
||||||
static String userAgreementURL = '$baseWebURL/app/userAgreement'; //用户协议
|
static String userAgreementURL = '$baseWebURL/app/userAgreement'; //用户协议
|
||||||
static String privacyPolicyURL = '$baseWebURL/app/privacy'; //隐私政策
|
static String privacyPolicyURL = '$baseWebURL/app/privacy'; //隐私政策
|
||||||
|
|||||||
43
star_lock/lib/flavors.dart
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,28 +1,16 @@
|
|||||||
import 'package:aliyun_push/aliyun_push.dart';
|
import 'dart:async';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:star_lock/translations/trans_lib.dart';
|
||||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
import 'app.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/device_info_service.dart';
|
import 'package:star_lock/tools/device_info_service.dart';
|
||||||
import 'package:star_lock/tools/platform_info_services.dart';
|
import 'package:star_lock/tools/platform_info_services.dart';
|
||||||
import 'package:star_lock/tools/storage.dart';
|
import 'app_settings/app_settings.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 'tools/store_service.dart';
|
import 'tools/store_service.dart';
|
||||||
import 'dart:io';
|
import 'package:get/get.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
|
|
||||||
void main() async {
|
// 该文件不可作为编译入口,请查看 flavorizr.yaml 中的说明
|
||||||
|
FutureOr<void> main() async {
|
||||||
await _setCommonServices();
|
await _setCommonServices();
|
||||||
|
|
||||||
// 设置国际化信息
|
// 设置国际化信息
|
||||||
@ -30,135 +18,19 @@ void main() async {
|
|||||||
|
|
||||||
runApp(MyApp());
|
runApp(MyApp());
|
||||||
|
|
||||||
if (Platform.isAndroid) {
|
if (AppPlatform.isAndroid) {
|
||||||
SystemUiOverlayStyle systemUiOverlayStyle =
|
SystemUiOverlayStyle systemUiOverlayStyle =
|
||||||
const SystemUiOverlayStyle(statusBarColor: Colors.transparent);
|
const SystemUiOverlayStyle(statusBarColor: Colors.transparent);
|
||||||
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
|
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(
|
Future _initTranslation() async => TranslationLoader.loadTranslation(
|
||||||
zhSource: "images/lan/lan_zh.json",
|
zhSource: "images/lan/lan_zh.json",
|
||||||
enSource: "images/lan/lan_en.json",
|
enSource: "images/lan/lan_en.json",
|
||||||
keySource: "images/lan/lan_keys.json",
|
keySource: "images/lan/lan_keys.json",
|
||||||
);
|
);
|
||||||
|
|
||||||
// 设置包名服务设备信息
|
// 设置包名服务设备信息
|
||||||
Future _setCommonServices() async {
|
Future _setCommonServices() async {
|
||||||
@ -167,43 +39,3 @@ Future _setCommonServices() async {
|
|||||||
await Get.putAsync(() => DeviceInfoService().init());
|
await Get.putAsync(() => DeviceInfoService().init());
|
||||||
// Get.log(PlatformInfoService.to.info.version);
|
// 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;
|
|
||||||
}
|
|
||||||
|
|||||||
8
star_lock/lib/main_dev.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'flavors.dart';
|
||||||
|
|
||||||
|
import 'main.dart' as runner;
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
F.appFlavor = Flavor.dev;
|
||||||
|
await runner.main();
|
||||||
|
}
|
||||||
8
star_lock/lib/main_pre.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'flavors.dart';
|
||||||
|
|
||||||
|
import 'main.dart' as runner;
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
F.appFlavor = Flavor.pre;
|
||||||
|
await runner.main();
|
||||||
|
}
|
||||||
8
star_lock/lib/main_sky.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'flavors.dart';
|
||||||
|
|
||||||
|
import 'main.dart' as runner;
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
F.appFlavor = Flavor.sky;
|
||||||
|
await runner.main();
|
||||||
|
}
|
||||||
8
star_lock/lib/main_xhj.dart
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import 'flavors.dart';
|
||||||
|
|
||||||
|
import 'main.dart' as runner;
|
||||||
|
|
||||||
|
Future<void> main() async {
|
||||||
|
F.appFlavor = Flavor.xhj;
|
||||||
|
await runner.main();
|
||||||
|
}
|
||||||
@ -5,6 +5,7 @@ import 'package:star_lock/appRouters.dart';
|
|||||||
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
||||||
|
|
||||||
import '../../app_settings/app_colors.dart';
|
import '../../app_settings/app_colors.dart';
|
||||||
|
import '../../flavors.dart';
|
||||||
import '../../tools/commonItem.dart';
|
import '../../tools/commonItem.dart';
|
||||||
import '../../tools/titleAppBar.dart';
|
import '../../tools/titleAppBar.dart';
|
||||||
import '../../translations/trans_lib.dart';
|
import '../../translations/trans_lib.dart';
|
||||||
@ -38,12 +39,12 @@ class _AboutPageState extends State<AboutPage> {
|
|||||||
),
|
),
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
Text(
|
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),
|
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor),
|
||||||
),
|
),
|
||||||
SizedBox(height: 20.h),
|
SizedBox(height: 20.h),
|
||||||
Text(
|
Text(
|
||||||
Api.baseAddress,
|
F.apiPrefix,
|
||||||
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor),
|
style: TextStyle(fontSize: 24.sp, color: AppColors.blackColor),
|
||||||
),
|
),
|
||||||
SizedBox(
|
SizedBox(
|
||||||
|
|||||||
@ -1,11 +1,4 @@
|
|||||||
abstract class Api {
|
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 getVerificationCodeUrl = '/user/sendValidationCode';
|
||||||
final String registerUrl = '/user/register';
|
final String registerUrl = '/user/register';
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart';
|
|||||||
|
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import '../appRouters.dart';
|
import '../appRouters.dart';
|
||||||
|
import '../flavors.dart';
|
||||||
import 'api.dart';
|
import 'api.dart';
|
||||||
import 'request_interceptor.dart';
|
import 'request_interceptor.dart';
|
||||||
import 'request_interceptor_log.dart';
|
import 'request_interceptor_log.dart';
|
||||||
@ -11,7 +12,7 @@ import 'response_interceptor_log.dart';
|
|||||||
class BaseProvider extends GetConnect with Api {
|
class BaseProvider extends GetConnect with Api {
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
httpClient.baseUrl = baseUrl;
|
httpClient.baseUrl = '${F.apiPrefix}/api';
|
||||||
httpClient.addRequestModifier(requestInterceptor);
|
httpClient.addRequestModifier(requestInterceptor);
|
||||||
httpClient.addResponseModifier(responseInterceptor);
|
httpClient.addResponseModifier(responseInterceptor);
|
||||||
httpClient.addRequestModifier(requestLogInterceptor);
|
httpClient.addRequestModifier(requestLogInterceptor);
|
||||||
|
|||||||
@ -8,7 +8,7 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
|
|
||||||
import 'package:star_lock/main.dart';
|
import 'package:star_lock/app.dart';
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||||
|
|||||||