Merge branch 'release_hyx' into release

This commit is contained in:
anfe 2024-06-05 14:21:50 +08:00
commit 0a99c6663d
8 changed files with 438 additions and 394 deletions

View File

@ -7,9 +7,13 @@ import 'package:permission_handler/permission_handler.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/blue/blue_manage.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/app_get_version.dart';
import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/app_manager.dart';
import 'package:star_lock/tools/bindings/app_binding.dart';
import 'package:star_lock/tools/customer_tool.dart';
import 'package:star_lock/tools/storage.dart';
import 'package:star_lock/translations/app_dept.dart';
@ -22,15 +26,13 @@ import 'tools/appRouteObserver.dart';
import 'tools/store_service.dart';
class MyApp extends StatefulWidget {
const MyApp({GlobalKey? key}) : super(key: key);
MyApp({required this.isLogin, GlobalKey? key}) : super(key: key);
bool isLogin;
@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) {
@ -39,10 +41,20 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
builder: (BuildContext w, Widget? a) => _initMaterialApp());
}
GetMaterialApp _initMaterialApp() => GetMaterialApp(
GetMaterialApp _initMaterialApp() {
//
String initialRoute;
if (widget.isLogin) {
initialRoute = Routers.starLockMain;
} else {
initialRoute = Routers.login;
}
return GetMaterialApp(
// enableLog: false,
title: F.navTitle,
navigatorObservers: <NavigatorObserver>[AppRouteObserver().routeObserver],
navigatorObservers: <NavigatorObserver>[
AppRouteObserver().routeObserver
],
translations: TranslationMessage(),
supportedLocales: appDept.deptSupportedLocales,
localizationsDelegates: const <LocalizationsDelegate<dynamic>>[
@ -53,16 +65,16 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
localeResolutionCallback:
(Locale? locale, Iterable<Locale> supportedLocales) {
if (!supportedLocales.contains(locale)) {
final int idx = appSupportedLocales.indexWhere(
(Locale element) => element.languageCode == locale!.languageCode);
final int idx = appSupportedLocales.indexWhere((Locale element) =>
element.languageCode == locale!.languageCode);
if (idx != -1) {
locale = appSupportedLocales[idx];
} else {
locale = const Locale('zh', 'CN');
}
}
AppManager()
.setLanCode(code: '${locale!.languageCode}_${locale.countryCode}');
AppManager().setLanCode(
code: '${locale!.languageCode}_${locale.countryCode}');
return locale;
},
locale: StoreService.to.getLanguageCode()!.isNotEmpty
@ -90,7 +102,8 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
backgroundColor: const Color(0xFFFFFFFF),
elevation: 0,
centerTitle: true,
iconTheme: IconThemeData(color: const Color(0xff333333), size: 36.sp),
iconTheme:
IconThemeData(color: const Color(0xff333333), size: 36.sp),
titleTextStyle: TextStyle(
color: const Color(0xff333333),
fontWeight: FontWeight.w400,
@ -104,7 +117,8 @@ class _MyAppState extends State<MyApp> with WidgetsBindingObserver, BaseWidget {
getPages: AppRouters.routePages,
builder: EasyLoading.init(),
initialBinding: AppBindings(),
initialRoute: '/');
initialRoute: initialRoute );
}
@override
void initState() {
@ -153,3 +167,15 @@ Future<bool> getLoginStatus() async {
}
return false;
}
Future<void> getAgreePrivacyShowUpdate() async {
final String? data = await Storage.getString(isAgreePrivacy);
if (data == isAgreePrivacy) {
AppFirstEnterHandle().getAppFirstEnter(isShowUpdateVersion);
}
}
Future<void> getAppInfo() async {
final GetAppInfo entity = await ApiRepository.to.getAppInfo();
CustomerTool.init(entity.data?.wechatServiceUrl ?? '');
}

View File

@ -486,6 +486,8 @@ abstract class Routers {
'/advancedFunctionRecordPage'; //
static const String administratorAssociationLockPage =
'/administratorAssociationLockPage'; //--
static const String login = '/login'; //
}
abstract class AppRouters {
@ -494,6 +496,12 @@ abstract class AppRouters {
name: Routers.initial,
page: () => const StarLockApplication(),
),
GetPage<dynamic>(
name: Routers.login,
page: () => F.sw(
skyCall: () => const StarLockLoginPage(),
xhjCall: () => const StarLockLoginXHJPage()),
),
GetPage<dynamic>(
name: Routers.starLockMain,
page: () => F.sw(

View File

@ -3,14 +3,17 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/starLock_login_state.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/customer_tool.dart';
import 'package:star_lock/tools/storage.dart';
import '../../appRouters.dart';
import '../../app_settings/app_colors.dart';
import '../../common/XSConstantMacro/XSConstantMacro.dart';
import '../../tools/commonItem.dart';
import '../../tools/tf_loginInput.dart';
import '../../tools/submitBtn.dart';
import '../../tools/tf_loginInput.dart';
import '../../tools/titleAppBar.dart';
import '../../translations/trans_lib.dart';
import 'starLock_login_logic.dart';
@ -23,8 +26,16 @@ class StarLockLoginPage extends StatefulWidget {
}
class _StarLockLoginPageState extends State<StarLockLoginPage> {
final logic = Get.put(StarLockLoginLogic());
final state = Get.find<StarLockLoginLogic>().state;
final StarLockLoginLogic logic = Get.put(StarLockLoginLogic());
final StarLockLoginState state = Get.find<StarLockLoginLogic>().state;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
AppFirstEnterHandle().getAppFirstEnter(isAgreePrivacy);
});
}
@override
Widget build(BuildContext context) {
@ -35,7 +46,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
barTitle: TranslationLoader.lanKeys!.login!.tr,
haveBack: false,
backgroundColor: AppColors.mainColor,
actionsList: [
actionsList: <Widget>[
const IconButton(
onPressed: CustomerTool.openCustomerService,
icon: Icon(
@ -62,7 +73,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
),
body: ListView(
padding: EdgeInsets.only(top: 120.h, left: 40.w, right: 40.w),
children: [
children: <Widget>[
Container(
padding: EdgeInsets.all(10.w),
child: Center(
@ -111,7 +122,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
hintText:
TranslationLoader.lanKeys!.pleaseEnterNumberOrEmail!.tr,
// keyboardType: TextInputType.number,
inputFormatters: [
inputFormatters: <TextInputFormatter>[
// FilteringTextInputFormatter.allow(RegExp('[0-9]')),
LengthLimitingTextInputFormatter(30),
]),
@ -135,13 +146,13 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
),
hintText:
"${TranslationLoader.lanKeys!.pleaseEnter!.tr}${TranslationLoader.lanKeys!.password!.tr}",
inputFormatters: [
inputFormatters: <TextInputFormatter>[
LengthLimitingTextInputFormatter(20),
]),
// SizedBox(height: 15.h),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
children: <Widget>[
Obx(() => GestureDetector(
onTap: () {
state.agree.value = !state.agree.value;
@ -168,7 +179,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
text: TranslationLoader.lanKeys!.readAndAgree!.tr,
style: TextStyle(
color: const Color(0xff333333), fontSize: 20.sp),
children: [
children: <InlineSpan>[
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
@ -178,7 +189,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
color: AppColors.mainColor,
fontSize: 20.sp)),
onTap: () {
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
'url': XSConstantMacro.userAgreementURL,
'title': '用户协议'.tr
});
@ -193,7 +204,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
color: AppColors.mainColor,
fontSize: 20.sp)),
onTap: () {
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
'url': XSConstantMacro.privacyPolicyURL,
'title': '隐私政策'.tr
});
@ -224,7 +235,7 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
SizedBox(height: 50.w),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
children: <Widget>[
GestureDetector(
child: SizedBox(
// width: 150.w,
@ -284,9 +295,9 @@ class _StarLockLoginPageState extends State<StarLockLoginPage> {
width: 1.sp,
// height: 200.h,
child: Column(
children: [
children: <Widget>[
Row(
children: [
children: <Widget>[
Container(
color: Colors.red,
child: Image.asset(

View File

@ -1,20 +1,18 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/starLock_login_state.dart';
import 'package:star_lock/tools/appFirstEnterHandle.dart';
import 'package:star_lock/tools/customer_tool.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:star_lock/tools/storage.dart';
import '../../appRouters.dart';
import '../../app_settings/app_colors.dart';
import '../../common/XSConstantMacro/XSConstantMacro.dart';
import '../../tools/commonItem.dart';
import '../../tools/tf_loginInput.dart';
import '../../tools/submitBtn.dart';
import '../../tools/titleAppBar.dart';
import '../../tools/tf_loginInput.dart';
import '../../translations/trans_lib.dart';
import 'starLock_login_logic.dart';
@ -29,12 +27,22 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
final StarLockLoginLogic logic = Get.put(StarLockLoginLogic());
final StarLockLoginState state = Get.find<StarLockLoginLogic>().state;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
AppFirstEnterHandle().getAppFirstEnter(isAgreePrivacy);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
resizeToAvoidBottomInset: false,
backgroundColor: const Color(0xFFFFFFFF),
body: ListView(
body: SizedBox(
width: Get.width,
child: ListView(
padding: EdgeInsets.only(
top: 110.h,
),
@ -45,7 +53,7 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Row(
children: [
children: <Widget>[
Expanded(
child: Text(
'${"欢迎使用".tr}${F.title}',
@ -94,7 +102,8 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
return Text(
'${state.countryName.value} +${state.countryCode.value}',
style: TextStyle(
fontSize: 22.sp, color: AppColors.mainColor),
fontSize: 22.sp,
color: AppColors.mainColor),
);
})
],
@ -151,7 +160,8 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
},
child: Container(
color: Colors.transparent,
padding: EdgeInsets.symmetric(vertical: 30.h, horizontal: 40.w),
padding:
EdgeInsets.symmetric(vertical: 30.h, horizontal: 40.w),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: <Widget>[
@ -170,16 +180,12 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
),
),
),
Flexible(
child: RichText(
text: TextSpan(
text: TranslationLoader.lanKeys!.readAndAgree!.tr,
Row(children: <Widget>[
Text(TranslationLoader.lanKeys!.readAndAgree!.tr,
style: TextStyle(
color: const Color(0xff333333), fontSize: 20.sp),
children: <InlineSpan>[
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
color: const Color(0xff333333),
fontSize: 20.sp)),
GestureDetector(
child: Text(
'${TranslationLoader.lanKeys!.userAgreement!.tr}',
style: TextStyle(
@ -192,10 +198,8 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
'title': '用户协议'.tr
});
},
)),
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: GestureDetector(
),
GestureDetector(
child: Text(
'${TranslationLoader.lanKeys!.privacyPolicy!.tr}',
style: TextStyle(
@ -208,10 +212,8 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
'title': '隐私政策'.tr
});
},
)),
],
)),
)
),
]),
],
),
),
@ -258,7 +260,8 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
backgroundColor: AppColors.mainColor),
child: Text(
TranslationLoader.lanKeys!.register!.tr,
style: TextStyle(fontSize: 22.sp, color: Colors.white),
style:
TextStyle(fontSize: 22.sp, color: Colors.white),
),
),
),
@ -313,6 +316,7 @@ class _StarLockLoginPageState extends State<StarLockLoginXHJPage> {
),
)
],
),
));
}

View File

@ -1,14 +1,16 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
import 'package:get/get.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/mine/about/debug/debug_tool.dart';
import 'package:star_lock/network/api_provider.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/bugly/bugly_tool.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_jPhush.dart';
import 'package:star_lock/translations/trans_lib.dart';
@ -25,12 +27,20 @@ FutureOr<void> main() async {
//
await _initTranslation();
// bugly错误日志监控
await BuglyTool.init();
final bool isLogin = await getLoginStatus();
if (isLogin) {
await privacySDKInitialization();
Future<void>.delayed(const Duration(milliseconds: 500), getAppInfo);
}
await XSJPushProvider().initJPushService();
WidgetsBinding.instance.addPostFrameCallback((_) async {
final bool? openDeBug = await Storage.getBool(isOpenDeBug);
if (openDeBug == true) {
DeBug.showFloatWidget();
}
});
runApp(const MyApp());
runApp(MyApp(isLogin: isLogin));
if (AppPlatform.isAndroid) {
const SystemUiOverlayStyle systemUiOverlayStyle =
@ -40,16 +50,18 @@ FutureOr<void> main() async {
}
//
Future _initTranslation() async => TranslationLoader.loadTranslation(
Future<void> _initTranslation() async => TranslationLoader.loadTranslation(
zhSource: 'images/lan/lan_zh.json',
enSource: 'images/lan/lan_en.json',
keySource: 'images/lan/lan_keys.json',
);
//
Future _setCommonServices() async {
Future<void> _setCommonServices() async {
await Get.putAsync(() => StoreService().init());
await Get.putAsync(() => PlatformInfoService().init());
Get.put(ApiProvider());
Get.put(ApiRepository(Get.find<ApiProvider>()));
if (F.isLite) {
//
// await Get.putAsync(() => DeviceInfoService().init());
@ -57,3 +69,9 @@ Future _setCommonServices() async {
await Get.putAsync(() => DeviceInfoService().init());
}
}
//
Future<void> privacySDKInitialization() async {
await BuglyTool.init();
await XSJPushProvider().initJPushService();
}

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:star_lock/app.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/app_get_version.dart';
import 'package:star_lock/login/login/starLock_login_page.dart';
@ -23,12 +24,7 @@ class _StarLockApplicationState extends State<StarLockApplication> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async {
bool? openDeBug = await Storage.getBool(isOpenDeBug);
if (openDeBug == true) {
DeBug.showFloatWidget();
}
});
}
@override
@ -37,7 +33,7 @@ class _StarLockApplicationState extends State<StarLockApplication> {
return FutureBuilder<bool>(
future: getLoginStatus(),
builder: (context, snapshot) {
builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
//
return const CircularProgressIndicator();
@ -66,23 +62,5 @@ class _StarLockApplicationState extends State<StarLockApplication> {
);
}
Future<bool> getLoginStatus() async {
final data = await Storage.getString(saveUserLoginData);
if (data != null && data.isNotEmpty) {
return true;
}
return false;
}
Future<void> getAgreePrivacyShowUpdate() async {
final data = await Storage.getString(isAgreePrivacy);
if (data == isAgreePrivacy) {
AppFirstEnterHandle().getAppFirstEnter(isShowUpdateVersion);
}
}
Future<void> getAppInfo() async {
final GetAppInfo entity = await ApiRepository.to.getAppInfo();
CustomerTool.init(entity.data?.wechatServiceUrl ?? '');
}
}

View File

@ -6,14 +6,18 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:star_lock/appRouters.dart';
import 'package:star_lock/app_settings/app_colors.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
import 'package:star_lock/flavors.dart';
import 'package:star_lock/login/login/app_get_version.dart';
import 'package:star_lock/main.dart';
import 'package:star_lock/network/api_repository.dart';
import 'package:star_lock/tools/customer_tool.dart';
import 'package:star_lock/tools/storage.dart';
import '../versionUndate/versionUndateTool.dart';
import 'bugly/bugly_tool.dart';
import 'xs_jPhush.dart';
class AppFirstEnterHandle {
Future<void> getAppFirstEnter(String flagStr) async {
@ -24,6 +28,7 @@ class AppFirstEnterHandle {
await showPrivacyAgreementAlert();
}
getAppInfo();
await privacySDKInitialization();
break;
case isAgreePosition: //
if (getFlag != isAgreePosition) {
@ -49,7 +54,7 @@ class AppFirstEnterHandle {
Future<void> showPrivacyAgreementAlert() async {
await showCupertinoDialog(
context: Get.context!,
builder: (context) {
builder: (BuildContext context) {
return PopScope(
canPop: false,
child: F.sw(
@ -72,7 +77,7 @@ class AppFirstEnterHandle {
TextSpan(
text: '感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读'.tr,
style: const TextStyle(fontSize: 16.0),
children: [
children: <InlineSpan>[
TextSpan(
text: '《用户协议》'.tr,
style: const TextStyle(
@ -80,7 +85,7 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
@ -94,7 +99,7 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
@ -106,15 +111,13 @@ class AppFirstEnterHandle {
],
),
),
actions: [
actions: <Widget>[
CupertinoDialogAction(
child: Text(
'不同意'.tr,
style: TextStyle(color: Colors.black),
),
onPressed: () {
_exitApp();
},
onPressed: _exitApp,
),
CupertinoDialogAction(
child: Text(
@ -140,7 +143,7 @@ class AppFirstEnterHandle {
TextSpan(
text: '感谢您使用本应用。我们非常重视您的个人信息和隐私保护,在使用本产品之前,请认真阅读'.tr,
style: const TextStyle(fontSize: 16.0),
children: [
children: <InlineSpan>[
TextSpan(
text: '《用户协议》'.tr,
style: TextStyle(
@ -149,7 +152,7 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.userAgreementURL,
"title": '用户协议'.tr
});
@ -164,7 +167,7 @@ class AppFirstEnterHandle {
recognizer: TapGestureRecognizer()
..onTap = () {
//
Get.toNamed(Routers.webviewShowPage, arguments: {
Get.toNamed(Routers.webviewShowPage, arguments: <String, String>{
"url": XSConstantMacro.privacyPolicyURL,
"title": '隐私政策'.tr
});
@ -176,15 +179,13 @@ class AppFirstEnterHandle {
],
),
),
actions: [
actions: <Widget>[
CupertinoDialogAction(
child: Text(
'不同意'.tr,
style: TextStyle(color: Colors.black),
),
onPressed: () {
_exitApp();
},
onPressed: _exitApp,
),
CupertinoDialogAction(
child: Text(
@ -205,13 +206,13 @@ class AppFirstEnterHandle {
void showPositionAlert() {
showCupertinoDialog(
context: Get.context!,
builder: (context) {
builder: (BuildContext context) {
return PopScope(
canPop: false,
child: CupertinoAlertDialog(
title: const Text('位置权限'),
content: const Text('请开启位置权限,应用需要位置权限才可以完成智能锁和网关的蓝牙操作'),
actions: [
actions: <Widget>[
CupertinoDialogAction(
child: Text('取消'.tr),
onPressed: () {
@ -235,13 +236,13 @@ class AppFirstEnterHandle {
void showCameraAlert() {
showCupertinoDialog(
context: Get.context!,
builder: (context) {
builder: (BuildContext context) {
return PopScope(
canPop: false,
child: CupertinoAlertDialog(
title: const Text('相机/相册权限'),
content: const Text('请开启本地存储权限,允许应用读写设备上的照片及文件'),
actions: [
actions: <Widget>[
CupertinoDialogAction(
child: const Text('取消'),
onPressed: () {

View File

@ -7,8 +7,6 @@ import '../../network/api_repository.dart';
class AppBindings extends Bindings {
@override
void dependencies() {
Get.put(ApiProvider());
Get.put(ApiRepository(Get.find<ApiProvider>()));
}
}