fix: all code issue
This commit is contained in:
parent
89e7a575a8
commit
d78a2598ac
|
@ -52,6 +52,7 @@ android {
|
|||
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
|
||||
minSdkVersion flutter.minSdkVersion
|
||||
targetSdkVersion flutter.targetSdkVersion
|
||||
compileSdkVersion 34
|
||||
versionCode flutterVersionCode.toInteger()
|
||||
versionName flutterVersionName
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'dart:io';
|
|||
import 'package:dio/dio.dart';
|
||||
import 'package:sk_base_mobile/constants/global_url.dart';
|
||||
import 'package:sk_base_mobile/models/base_response.dart';
|
||||
import 'package:sk_base_mobile/models/dict_type.model.dart';
|
||||
import 'package:sk_base_mobile/services/dio.service.dart';
|
||||
import '../constants/constants.dart';
|
||||
|
||||
|
|
|
@ -50,7 +50,7 @@ final theme = ThemeData(
|
|||
confirmButtonStyle: ButtonStyle(
|
||||
textStyle: MaterialStateProperty.resolveWith<TextStyle?>(
|
||||
(Set<MaterialState> states) {
|
||||
return TextStyle(color: AppTheme.primaryColor);
|
||||
return const TextStyle(color: AppTheme.primaryColor);
|
||||
},
|
||||
),
|
||||
),
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
/// Global config
|
||||
// ignore_for_file: constant_identifier_names
|
||||
|
||||
// Global config
|
||||
class GloablConfig {
|
||||
// static const BASE_URL = "http://10.0.2.2:8001/api/";
|
||||
// static const OSS_URL = "http://10.0.2.2:8001";
|
||||
|
||||
static const BASE_URL = "http://144.123.43.138:3001/api/";
|
||||
static const OSS_URL = "http://144.123.43.138:3001";
|
||||
// static const BASE_URL = "http://192.168.60.220:8001/api/";
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import 'dart:ui';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
//ignore_for_file: constant_identifier_names
|
||||
class DictTypeEnum {
|
||||
static const String InventoryRoom = "inventory_room";
|
||||
static const String InventoryLine = 'inventory_line';
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
//ignore_for_file: constant_identifier_names
|
||||
enum BackActionEnum {
|
||||
refresh,
|
||||
}
|
||||
|
|
|
@ -14,6 +14,6 @@ class RouteConfig {
|
|||
GetPage(name: login, page: () => LoginScreen()),
|
||||
GetPage(name: home, page: () => LandingPage()),
|
||||
GetPage(name: userinfo, page: () => UserInfoPage()),
|
||||
GetPage(name: inventory, page: () => InventoryPage()),
|
||||
GetPage(name: inventory, page: () => const InventoryPage()),
|
||||
];
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
//ignore_for_file: constant_identifier_names
|
||||
import 'dart:io';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:sk_base_mobile/models/task_model.dart';
|
||||
import 'package:sk_base_mobile/util/util.dart';
|
||||
import 'package:sqflite/sqflite.dart';
|
|
@ -18,8 +18,6 @@ class IndexPage extends StatelessWidget {
|
|||
Widget build(BuildContext context) {
|
||||
final isLandscape =
|
||||
MediaQuery.of(context).orientation == Orientation.landscape;
|
||||
final isLogin =
|
||||
StorageService.to.getString(CacheKeys.token, isWithUser: false) != null;
|
||||
return ScreenUtilInit(
|
||||
minTextAdapt: true,
|
||||
designSize: isLandscape
|
||||
|
@ -42,7 +40,8 @@ class IndexPage extends StatelessWidget {
|
|||
return Obx(() => MediaQuery(
|
||||
//设置文字大小不随系统设置改变
|
||||
data: MediaQuery.of(context).copyWith(
|
||||
textScaleFactor: AppInfoService.to.scale.value),
|
||||
textScaler:
|
||||
TextScaler.linear(AppInfoService.to.scale.value)),
|
||||
child: widget!));
|
||||
})));
|
||||
}
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
import 'dart:math';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
// import 'package:sentry_flutter/sentry_flutter.dart';
|
||||
import 'package:sk_base_mobile/global.dart';
|
||||
import 'package:sk_base_mobile/index.dart';
|
||||
|
@ -12,9 +8,8 @@ Future<void> main() async {
|
|||
try {
|
||||
await Global.init();
|
||||
} catch (e) {
|
||||
LoggerUtil().error('Init failed, please try again.${e}');
|
||||
LoggerUtil().error('Init failed, please try again.$e');
|
||||
}
|
||||
bool isProduction = kReleaseMode;
|
||||
// await SentryFlutter.init(
|
||||
// (options) {
|
||||
// options.environment = isProduction ? 'production' : 'development';
|
||||
|
|
|
@ -15,7 +15,7 @@ class AppConfig {
|
|||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = Map<String, dynamic>();
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['ver'] = ver;
|
||||
if (items != null) {
|
||||
data['items'] = items!.map((v) => v.toJson()).toList();
|
||||
|
@ -36,7 +36,7 @@ class AppConfigItem {
|
|||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> json = new Map<String, dynamic>();
|
||||
final Map<String, dynamic> json = <String, dynamic>{};
|
||||
json['data'] = data;
|
||||
json['name'] = name;
|
||||
return json;
|
||||
|
|
|
@ -8,7 +8,7 @@ class Auth {
|
|||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = Map<String, dynamic>();
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['token'] = token;
|
||||
return data;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
class BaseModel {
|
||||
BaseModel.fromJson(Map<String, dynamic> json) {}
|
||||
BaseModel.fromJson(Map<String, dynamic> json);
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,6 +37,6 @@ class CompanyModel {
|
|||
"updatedAt": updatedAt?.toIso8601String(),
|
||||
"name": name,
|
||||
"isDelete": isDelete,
|
||||
"files": files.map((x) => x?.toJson()).toList(),
|
||||
"files": files.map((x) => x.toJson()).toList(),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
import 'package:sk_base_mobile/constants/enum.dart';
|
||||
import 'package:sk_base_mobile/models/file.model.dart';
|
||||
import 'package:sk_base_mobile/models/index.dart';
|
||||
import 'package:sk_base_mobile/models/inventory.model.dart';
|
||||
import 'package:sk_base_mobile/models/product.model.dart';
|
||||
import 'package:sk_base_mobile/models/project.model.dart';
|
||||
|
||||
class InventoryInOutModel {
|
||||
InventoryInOutModel({
|
||||
|
|
|
@ -71,7 +71,7 @@ class ProductModel {
|
|||
'productNumber': productNumber,
|
||||
'productSpecification': productSpecification,
|
||||
"namePinyin": namePinyin,
|
||||
"files": files.map((x) => x?.toJson()).toList(),
|
||||
"files": files.map((x) => x.toJson()).toList(),
|
||||
"company": company?.toJson(),
|
||||
"unit": unit?.toJson(),
|
||||
};
|
||||
|
|
|
@ -70,6 +70,6 @@ class UserInfoModel {
|
|||
"remark": remark,
|
||||
"status": status,
|
||||
"dept": dept?.toJson(),
|
||||
"roles": roles.map((x) => x?.toJson()).toList(),
|
||||
"roles": roles.map((x) => x.toJson()).toList(),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -2,7 +2,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/change_icon.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/filter_btn.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/today_button.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/inventory_inout_controller.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
|
|
@ -10,7 +10,7 @@ import 'package:sk_base_mobile/widgets/fade_in_cache_image.dart';
|
|||
import '../../../constants/enum.dart';
|
||||
|
||||
class InventoryInoutCard extends StatelessWidget {
|
||||
InventoryInoutCard({required this.index, required this.ind});
|
||||
InventoryInoutCard({super.key, required this.index, required this.ind});
|
||||
final int index;
|
||||
final int ind;
|
||||
final controller = Get.find<InventoryInoutController>();
|
||||
|
@ -48,9 +48,9 @@ class InventoryInoutCard extends StatelessWidget {
|
|||
),
|
||||
),
|
||||
Positioned(
|
||||
child: buildInOrOut(),
|
||||
right: ScreenAdaper.width(5),
|
||||
top: ScreenAdaper.height(5),
|
||||
child: buildInOrOut(),
|
||||
)
|
||||
],
|
||||
),
|
||||
|
|
|
@ -13,11 +13,10 @@ import 'package:sk_base_mobile/widgets/image_preview.dart';
|
|||
import 'package:sk_base_mobile/widgets/loading_indicator.dart';
|
||||
|
||||
class InventoryInoutInfo extends StatelessWidget {
|
||||
late int inventoryInoutId;
|
||||
late InventoryInouInfoController controller;
|
||||
InventoryInoutInfo({Key? key, required this.inventoryInoutId})
|
||||
: controller = Get.put(InventoryInouInfoController(inventoryInoutId)),
|
||||
super(key: key);
|
||||
final int inventoryInoutId;
|
||||
final InventoryInouInfoController controller;
|
||||
InventoryInoutInfo({super.key, required this.inventoryInoutId})
|
||||
: controller = Get.put(InventoryInouInfoController(inventoryInoutId));
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/change_button_roe.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/inventory_inout_page_View.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/inventory_inout_page_view.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class TaskPageBody extends StatelessWidget {
|
||||
|
|
|
@ -4,15 +4,13 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
|
|||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/enum.dart';
|
||||
import 'package:sk_base_mobile/db_helper/dbHelper.dart';
|
||||
import 'package:sk_base_mobile/db_helper/db_help.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/components/inventory_inout_info.dart';
|
||||
import 'package:sk_base_mobile/screens/new_inventory_inout/new_inventory_inout.dart';
|
||||
import 'package:sk_base_mobile/util/date.util.dart';
|
||||
import 'package:sk_base_mobile/util/logger_util.dart';
|
||||
import 'package:sk_base_mobile/util/modal.util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import '../../models/index.dart';
|
||||
import 'components/responsive.dart';
|
||||
|
||||
class InventoryInoutController extends GetxController {
|
||||
RxMap userData = {}.obs;
|
||||
|
|
|
@ -17,20 +17,20 @@ class LandingPage extends StatelessWidget {
|
|||
child: Stack(children: [
|
||||
const BackColors(),
|
||||
SafeArea(
|
||||
top: true,
|
||||
child: Obx(() => Scaffold(
|
||||
floatingActionButtonLocation:
|
||||
FloatingActionButtonLocation.centerDocked,
|
||||
floatingActionButton: [0].indexWhere(
|
||||
(item) => item == controller.currentIndex.value) >
|
||||
-1
|
||||
? FloatingCreateButton()
|
||||
: null,
|
||||
bottomNavigationBar: BottomNavBar(),
|
||||
backgroundColor: Colors.transparent,
|
||||
body: Obx(
|
||||
() => controller.pages[controller.currentIndex.value]),
|
||||
)))
|
||||
bottom: false,
|
||||
child: Scaffold(
|
||||
floatingActionButtonLocation:
|
||||
FloatingActionButtonLocation.centerDocked,
|
||||
// floatingActionButton: [0].indexWhere(
|
||||
// (item) => item == controller.currentIndex.value) >
|
||||
// -1
|
||||
// ? FloatingCreateButton()
|
||||
// : null,
|
||||
floatingActionButton: FloatingCreateButton(),
|
||||
bottomNavigationBar: BottomNavBar(),
|
||||
backgroundColor: Colors.transparent,
|
||||
body: Obx(() => controller.pages[controller.currentIndex.value]),
|
||||
))
|
||||
]),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import 'package:sk_base_mobile/screens/inventory/inventory.dart';
|
|||
import 'package:sk_base_mobile/screens/inventory_inout/inventory_inout.dart';
|
||||
import 'package:sk_base_mobile/screens/mine/mine.dart';
|
||||
import 'package:sk_base_mobile/screens/workbench/workbench.dart';
|
||||
import 'package:sk_base_mobile/services/app_info.service.dart';
|
||||
|
||||
class LandingController extends GetxController {
|
||||
RxInt currentIndex = 0.obs;
|
||||
|
@ -21,7 +20,7 @@ class LandingController extends GetxController {
|
|||
icon: Icons.inventory_outlined,
|
||||
activeIcon: Icons.inventory_rounded,
|
||||
label: '库存',
|
||||
page: InventoryPage()),
|
||||
page: const InventoryPage()),
|
||||
AppBottomNavItem(
|
||||
icon: Icons.widgets_outlined,
|
||||
activeIcon: Icons.widgets_rounded,
|
||||
|
@ -31,7 +30,7 @@ class LandingController extends GetxController {
|
|||
icon: Icons.person_outline_outlined,
|
||||
activeIcon: Icons.person,
|
||||
label: '我的',
|
||||
page: MinePage()),
|
||||
page: const MinePage()),
|
||||
];
|
||||
@override
|
||||
onInit() {
|
||||
|
|
|
@ -1,183 +0,0 @@
|
|||
import 'package:date_format/date_format.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/screens/login/login.controller.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class LoginScreen extends StatelessWidget {
|
||||
LoginScreen({super.key});
|
||||
final _controller = Get.put<LoginController>(LoginController());
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: Container(
|
||||
decoration: const BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: AssetImage('assets/images/bg.jpg'),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
),
|
||||
child: buildBody()));
|
||||
|
||||
// return Scaffold(
|
||||
|
||||
// body: SafeArea(child: buildBody()));
|
||||
}
|
||||
|
||||
buildBody() {
|
||||
return Center(
|
||||
child: SingleChildScrollView(
|
||||
child: GestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
onTap: () {
|
||||
// 点击空白处时收起键盘
|
||||
FocusScope.of(Get.context!).unfocus();
|
||||
},
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Image(
|
||||
height: ScreenAdaper.width(150),
|
||||
image: const AssetImage(
|
||||
'assets/images/company_logo.png',
|
||||
)),
|
||||
SizedBox(
|
||||
width: ScreenAdaper.width(10),
|
||||
),
|
||||
Text(
|
||||
'山矿通',
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w700,
|
||||
color: AppTheme.nearlyWhite,
|
||||
letterSpacing: ScreenAdaper.sp(5),
|
||||
fontSize: ScreenAdaper.height(70)),
|
||||
)
|
||||
],
|
||||
),
|
||||
SizedBox(height: ScreenAdaper.height(50)),
|
||||
buildForm(),
|
||||
SizedBox(height: ScreenAdaper.height(50)),
|
||||
],
|
||||
),
|
||||
),
|
||||
));
|
||||
}
|
||||
|
||||
Widget buildForm() {
|
||||
final children = [
|
||||
buildUserNameInput(),
|
||||
SizedBox(
|
||||
height: ScreenAdaper.height(20),
|
||||
),
|
||||
buildPasswordInput(),
|
||||
SizedBox(
|
||||
height: ScreenAdaper.height(20),
|
||||
),
|
||||
buildForgotPassword(),
|
||||
SizedBox(
|
||||
height: ScreenAdaper.height(20),
|
||||
),
|
||||
buildSubmitButton(),
|
||||
];
|
||||
|
||||
final child = Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: children,
|
||||
);
|
||||
|
||||
return Form(
|
||||
key: _controller.formKey,
|
||||
child: Container(
|
||||
alignment: Alignment.center,
|
||||
width: ScreenAdaper.width(800),
|
||||
padding: EdgeInsets.symmetric(
|
||||
vertical: 0, horizontal: ScreenAdaper.width(50)),
|
||||
child: child,
|
||||
));
|
||||
}
|
||||
|
||||
Widget buildSubmitButton() {
|
||||
final button = ElevatedButton(
|
||||
style: ElevatedButton.styleFrom(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(ScreenAdaper.sp(30))),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: ScreenAdaper.height(25),
|
||||
vertical: ScreenAdaper.height(20)),
|
||||
foregroundColor: AppTheme.nearlyWhite,
|
||||
textStyle: TextStyle(
|
||||
letterSpacing: 5,
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: ScreenAdaper.height(25)),
|
||||
backgroundColor: AppTheme.primaryColor),
|
||||
onPressed: _controller.doLogin,
|
||||
child: const Text('登录'),
|
||||
);
|
||||
final child = Expanded(
|
||||
child: button,
|
||||
);
|
||||
return Row(
|
||||
children: [child],
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildUserNameInput() {
|
||||
return TextFormField(
|
||||
decoration: const InputDecoration(
|
||||
labelText: '用户名',
|
||||
),
|
||||
onFieldSubmitted: (value) {
|
||||
_controller.passwordFocusNode.requestFocus();
|
||||
},
|
||||
style: TextStyle(fontSize: ScreenAdaper.height(25)),
|
||||
onChanged: (value) {},
|
||||
validator: (String? value) {
|
||||
if (value == null || value == '') {
|
||||
return '用户名必填';
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildPasswordInput() {
|
||||
return TextFormField(
|
||||
decoration: const InputDecoration(
|
||||
labelText: '密码',
|
||||
),
|
||||
obscureText: true,
|
||||
focusNode: _controller.passwordFocusNode,
|
||||
onFieldSubmitted: (value) {
|
||||
_controller.doLogin();
|
||||
},
|
||||
style: TextStyle(fontSize: ScreenAdaper.height(25)),
|
||||
onChanged: (value) {},
|
||||
validator: (String? value) {
|
||||
return (value ?? '').length >= 6 ? null : '密码长度至少6位';
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
Widget buildForgotPassword() {
|
||||
return GestureDetector(
|
||||
onTap: () {},
|
||||
child: Container(
|
||||
alignment: Alignment.centerRight,
|
||||
child: Text(
|
||||
'忘记密码?',
|
||||
style: TextStyle(
|
||||
color: Colors.grey,
|
||||
fontSize: ScreenAdaper.height(20),
|
||||
decoration: TextDecoration.underline,
|
||||
),
|
||||
)),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -1,7 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/models/mine_about.model.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
|
||||
class MineController extends GetxController {
|
||||
final selectedTabIndex = 0.obs;
|
||||
|
|
|
@ -1,23 +1,17 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/screens/mine/mine.controller.dart';
|
||||
import 'package:sk_base_mobile/screens/mine/settings/mine_settings.dart';
|
||||
// import 'package:sk_base_mobile/screens/mine/mine_about.dart';
|
||||
// import 'package:sk_base_mobile/screens/mine/mine_block.dart';
|
||||
// import 'package:sk_base_mobile/screens/mine/mine_mytickets.dart';
|
||||
// import 'package:sk_base_mobile/screens/mine/mine_settings.dart';
|
||||
import 'package:sk_base_mobile/services/service.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
import 'package:sk_base_mobile/util/common.util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/want_keep_alive.dart';
|
||||
import 'package:sk_base_mobile/widgets/my_avatar.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/router.dart';
|
||||
import '../../constants/constants.dart';
|
||||
|
||||
class MinePage extends StatefulWidget {
|
||||
MinePage({super.key});
|
||||
const MinePage({super.key});
|
||||
|
||||
@override
|
||||
State<MinePage> createState() => _MinePageState();
|
||||
|
@ -25,8 +19,6 @@ class MinePage extends StatefulWidget {
|
|||
|
||||
class _MinePageState extends State<MinePage>
|
||||
with SingleTickerProviderStateMixin {
|
||||
final _controller = Get.put<MineController>(MineController());
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
@ -105,7 +97,7 @@ class _MinePageState extends State<MinePage>
|
|||
SizedBox(
|
||||
height: ScreenAdaper.height(50),
|
||||
),
|
||||
Expanded(child: MineSettingsPage())
|
||||
const Expanded(child: MineSettingsPage())
|
||||
// Expanded(
|
||||
// child: DefaultTabController(
|
||||
// length: 4,
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/models/mine_about.model.dart';
|
||||
|
||||
class MineController extends GetxController {
|
||||
final selectedTabIndex = 0.obs;
|
||||
TabController? tabController;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +1,10 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/screens/mine/mine.controller.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class MineSettingsPage extends StatelessWidget {
|
||||
final _controller = Get.find<MineController>();
|
||||
MineSettingsPage({super.key});
|
||||
const MineSettingsPage({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/models/user_info.model.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
|
||||
class UserInfoController extends GetxController {
|
||||
final nickNameController = TextEditingController(text: '');
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
import 'package:date_format/date_format.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/constants/data.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/my_avatar.dart';
|
||||
|
||||
|
|
|
@ -6,8 +6,6 @@ import 'package:pull_to_refresh/pull_to_refresh.dart';
|
|||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
import 'package:sk_base_mobile/models/index.dart';
|
||||
import 'package:sk_base_mobile/models/inventory.model.dart';
|
||||
import 'package:sk_base_mobile/models/user_info.model.dart';
|
||||
import 'package:sk_base_mobile/util/debouncer.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
@ -15,8 +13,8 @@ import 'package:sk_base_mobile/widgets/empty.dart';
|
|||
import 'package:sk_base_mobile/widgets/fade_in_cache_image.dart';
|
||||
|
||||
class AgentSearch extends StatelessWidget {
|
||||
Function(UserInfoModel)? onSelected;
|
||||
Function(UserInfoModel)? beforeSelectedCheck;
|
||||
final Function(UserInfoModel)? onSelected;
|
||||
final Function(UserInfoModel)? beforeSelectedCheck;
|
||||
AgentSearch({super.key, this.onSelected, this.beforeSelectedCheck});
|
||||
final controller = Get.put(AgentSearchController());
|
||||
final listTitleTextStyle =
|
||||
|
@ -79,7 +77,6 @@ class AgentSearch extends StatelessWidget {
|
|||
}
|
||||
|
||||
Widget buildList() {
|
||||
final textStyle = TextStyle(fontSize: ScreenAdaper.height(22));
|
||||
return Obx(() => SmartRefresher(
|
||||
enablePullDown: true,
|
||||
enablePullUp: true,
|
||||
|
@ -87,13 +84,13 @@ class AgentSearch extends StatelessWidget {
|
|||
onLoading: controller.onLoading,
|
||||
onRefresh: controller.onRefresh,
|
||||
child: controller.refreshController.isLoading
|
||||
? SizedBox()
|
||||
? const SizedBox()
|
||||
: controller.list.isEmpty
|
||||
? Center(
|
||||
? const Center(
|
||||
child: Empty(text: '暂无数据'),
|
||||
)
|
||||
: ListView.separated(
|
||||
separatorBuilder: (context, index) => Divider(
|
||||
separatorBuilder: (context, index) => const Divider(
|
||||
color: AppTheme.dividerColor,
|
||||
),
|
||||
itemCount: controller.list.length,
|
||||
|
|
|
@ -94,12 +94,12 @@ class DateTimeContainer extends StatelessWidget {
|
|||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Icon(
|
||||
const Icon(
|
||||
Icons.date_range,
|
||||
color: darkBlue,
|
||||
size: 16,
|
||||
),
|
||||
SizedBox(
|
||||
const SizedBox(
|
||||
width: defaultPadding / 4,
|
||||
),
|
||||
Text(text),
|
||||
|
|
|
@ -18,7 +18,7 @@ class DescriptionInput extends StatelessWidget {
|
|||
height: defaultPadding / 2,
|
||||
),
|
||||
const Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
padding: EdgeInsets.symmetric(vertical: 10),
|
||||
child: Text(
|
||||
'Description',
|
||||
style:
|
||||
|
|
|
@ -10,12 +10,11 @@ import 'package:sk_base_mobile/models/index.dart';
|
|||
import 'package:sk_base_mobile/models/inventory.model.dart';
|
||||
import 'package:sk_base_mobile/util/debouncer.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/core/zt_search_select.dart';
|
||||
import 'package:sk_base_mobile/widgets/empty.dart';
|
||||
|
||||
class InventorySearch extends StatelessWidget {
|
||||
Function(InventoryModel)? onInventorySelected;
|
||||
Function(InventoryModel)? beforeSelectedCheck;
|
||||
final Function(InventoryModel)? onInventorySelected;
|
||||
final Function(InventoryModel)? beforeSelectedCheck;
|
||||
InventorySearch(
|
||||
{super.key, this.onInventorySelected, this.beforeSelectedCheck});
|
||||
final controller = Get.put(InventorySearchController());
|
||||
|
@ -100,12 +99,14 @@ class InventorySearch extends StatelessWidget {
|
|||
value: controller.projectId.value,
|
||||
isExpanded: true,
|
||||
items: [
|
||||
DropdownMenuItem(
|
||||
child: Text('所有项目'),
|
||||
const DropdownMenuItem(
|
||||
value: 0,
|
||||
child: Text('所有项目'),
|
||||
),
|
||||
...controller.projects.map((element) => DropdownMenuItem(
|
||||
child: Text('${element.name}'), value: element.id))
|
||||
value: element.id,
|
||||
child: Text('${element.name}'),
|
||||
))
|
||||
],
|
||||
onChanged: (value) {
|
||||
controller.projectId.value = value;
|
||||
|
@ -156,18 +157,18 @@ class InventorySearch extends StatelessWidget {
|
|||
child: Obx(
|
||||
() => DropdownButtonFormField(
|
||||
value: controller.hasInventoryStatus.value,
|
||||
items: [
|
||||
items: const [
|
||||
DropdownMenuItem(
|
||||
child: Text('全部'),
|
||||
value: 0,
|
||||
child: Text('全部'),
|
||||
),
|
||||
DropdownMenuItem(
|
||||
child: const Text('有库存'),
|
||||
value: 1,
|
||||
child: Text('有库存'),
|
||||
),
|
||||
DropdownMenuItem(
|
||||
child: const Text('无库存'),
|
||||
value: 2,
|
||||
child: Text('无库存'),
|
||||
),
|
||||
],
|
||||
onChanged: (value) {
|
||||
|
@ -195,15 +196,15 @@ class InventorySearch extends StatelessWidget {
|
|||
onLoading: controller.onLoading,
|
||||
onRefresh: controller.onRefresh,
|
||||
child: controller.refreshController.isLoading
|
||||
? SizedBox()
|
||||
? const SizedBox()
|
||||
: controller.inventories.isEmpty
|
||||
? Center(
|
||||
? const Center(
|
||||
child: Empty(text: '暂无库存'),
|
||||
)
|
||||
: !ScreenAdaper.isLandspace()
|
||||
? buildPortraitList()
|
||||
: Table(columnWidths: {
|
||||
0: MinColumnWidth(
|
||||
0: const MinColumnWidth(
|
||||
FixedColumnWidth(80), FixedColumnWidth(80)),
|
||||
1: MinColumnWidth(
|
||||
FixedColumnWidth(
|
||||
|
@ -227,7 +228,7 @@ class InventorySearch extends StatelessWidget {
|
|||
}, children: [
|
||||
// table header
|
||||
TableRow(
|
||||
decoration: BoxDecoration(
|
||||
decoration: const BoxDecoration(
|
||||
border: Border(
|
||||
bottom: BorderSide(
|
||||
color: AppTheme.dividerColor))),
|
||||
|
@ -285,7 +286,7 @@ class InventorySearch extends StatelessWidget {
|
|||
]),
|
||||
...controller.inventories.map((itemData) {
|
||||
return TableRow(
|
||||
decoration: BoxDecoration(
|
||||
decoration: const BoxDecoration(
|
||||
border: Border(
|
||||
bottom: BorderSide(
|
||||
color: AppTheme.dividerColor))),
|
||||
|
@ -358,7 +359,7 @@ class InventorySearch extends StatelessWidget {
|
|||
itemData: itemData,
|
||||
alignment: Alignment.centerRight),
|
||||
]);
|
||||
}).toList()
|
||||
})
|
||||
])));
|
||||
}
|
||||
|
||||
|
@ -389,50 +390,46 @@ class InventorySearch extends StatelessWidget {
|
|||
itemBuilder: (_, index) {
|
||||
final itemData = controller.inventories[index];
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
if (beforeSelectedCheck != null) {
|
||||
if (!beforeSelectedCheck!(itemData)) {
|
||||
return;
|
||||
}
|
||||
onTap: () {
|
||||
if (beforeSelectedCheck != null) {
|
||||
if (!beforeSelectedCheck!(itemData)) {
|
||||
return;
|
||||
}
|
||||
if (onInventorySelected != null) onInventorySelected!(itemData);
|
||||
},
|
||||
child: Container(
|
||||
child: Row(children: [
|
||||
}
|
||||
if (onInventorySelected != null) onInventorySelected!(itemData);
|
||||
},
|
||||
child: Row(children: [
|
||||
Text(
|
||||
'${itemData.inventoryNumber}',
|
||||
style: TextStyle(fontSize: ScreenAdaper.sp(40)),
|
||||
),
|
||||
SizedBox(
|
||||
width: ScreenAdaper.width(10),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'${itemData.inventoryNumber}',
|
||||
'${itemData.product?.name}${itemData.product?.productSpecification != '' ? '(${itemData.product?.productSpecification})' : ''}',
|
||||
style: TextStyle(fontSize: ScreenAdaper.sp(40)),
|
||||
),
|
||||
SizedBox(
|
||||
width: ScreenAdaper.width(10),
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'${itemData.product?.name}${itemData.product?.productSpecification != '' ? '(${itemData.product?.productSpecification})' : ''}',
|
||||
style: TextStyle(fontSize: ScreenAdaper.sp(40)),
|
||||
),
|
||||
Text(
|
||||
'${itemData.product?.company?.name}',
|
||||
style: TextStyle(
|
||||
fontSize: ScreenAdaper.sp(30),
|
||||
color: AppTheme.grey),
|
||||
),
|
||||
Text('¥${double.parse('${itemData.unitPrice}')}',
|
||||
style: TextStyle(
|
||||
fontSize: ScreenAdaper.sp(30),
|
||||
color: AppTheme.grey))
|
||||
],
|
||||
),
|
||||
Spacer(),
|
||||
Text(
|
||||
'${itemData.quantity}${itemData.product?.unit?.label ?? ''}',
|
||||
style: TextStyle(fontSize: ScreenAdaper.sp(40))),
|
||||
]),
|
||||
));
|
||||
'${itemData.product?.company?.name}',
|
||||
style: TextStyle(
|
||||
fontSize: ScreenAdaper.sp(30), color: AppTheme.grey),
|
||||
),
|
||||
Text('¥${double.parse('${itemData.unitPrice}')}',
|
||||
style: TextStyle(
|
||||
fontSize: ScreenAdaper.sp(30), color: AppTheme.grey))
|
||||
],
|
||||
),
|
||||
const Spacer(),
|
||||
Text('${itemData.quantity}${itemData.product?.unit?.label ?? ''}',
|
||||
style: TextStyle(fontSize: ScreenAdaper.sp(40))),
|
||||
]),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (_, index) => Divider(
|
||||
separatorBuilder: (_, index) => const Divider(
|
||||
color: AppTheme.dividerColor,
|
||||
),
|
||||
itemCount: controller.inventories.length);
|
||||
|
|
|
@ -42,7 +42,7 @@ class LabelInput extends StatelessWidget {
|
|||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
const Text(
|
||||
'Periority',
|
||||
style:
|
||||
TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class PeriorityContainer extends StatelessWidget {
|
||||
final String text;
|
||||
|
@ -11,20 +12,23 @@ class PeriorityContainer extends StatelessWidget {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AnimatedContainer(
|
||||
duration: Duration(milliseconds: 300),
|
||||
duration: const Duration(milliseconds: 300),
|
||||
padding: EdgeInsets.all(selected ? 3 : 0),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
color: selected ? Colors.orange : Colors.black12),
|
||||
child: Container(
|
||||
padding: EdgeInsets.symmetric(horizontal: 20, vertical: 10),
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: ScreenAdaper.width(20),
|
||||
vertical: ScreenAdaper.height(10)),
|
||||
decoration: BoxDecoration(
|
||||
color: selected ? Colors.white : Colors.transparent,
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
),
|
||||
child: Text(
|
||||
text,
|
||||
style: TextStyle(color: darkAccentBlue, fontWeight: FontWeight.bold),
|
||||
style: const TextStyle(
|
||||
color: darkAccentBlue, fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -11,7 +11,7 @@ import 'package:sk_base_mobile/util/debouncer.dart';
|
|||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class ProductSearch extends StatelessWidget {
|
||||
Function(ProductModel)? onProductSelected;
|
||||
final Function(ProductModel)? onProductSelected;
|
||||
ProductSearch({super.key, this.onProductSelected});
|
||||
final controller = Get.put(ProductSearchController());
|
||||
final listTitleTextStyle =
|
||||
|
|
|
@ -34,14 +34,14 @@ class TextInputField extends StatelessWidget {
|
|||
},
|
||||
onTap: onTap,
|
||||
decoration: InputDecoration(
|
||||
contentPadding: EdgeInsets.symmetric(horizontal: 20),
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 20),
|
||||
hintText: hint,
|
||||
fillColor: Colors.white,
|
||||
filled: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
borderSide: BorderSide.none),
|
||||
hintStyle: TextStyle(color: Colors.grey, fontSize: 12),
|
||||
hintStyle: const TextStyle(color: Colors.grey, fontSize: 12),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
|
|
@ -19,15 +19,13 @@ import 'package:sk_base_mobile/widgets/core/zk_date_picker.dart';
|
|||
import 'package:sk_base_mobile/widgets/core/zt_text_input.dart';
|
||||
import 'package:sk_base_mobile/widgets/gradient_button.dart';
|
||||
import 'package:sk_base_mobile/screens/new_inventory_inout/new_inventory_inout_controller.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class NewInventoryInout extends StatelessWidget {
|
||||
final NewInventoryInoutController controller;
|
||||
final dictService = Get.find<DictService>();
|
||||
final int inOrOut;
|
||||
NewInventoryInout({Key? key, this.inOrOut = InventoryInOrOutEnum.In})
|
||||
: controller = Get.put(NewInventoryInoutController(inOrOut: inOrOut)),
|
||||
super(key: key);
|
||||
NewInventoryInout({super.key, this.inOrOut = InventoryInOrOutEnum.In})
|
||||
: controller = Get.put(NewInventoryInoutController(inOrOut: inOrOut));
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
@ -418,13 +416,13 @@ class NewInventoryInout extends StatelessWidget {
|
|||
thirdLevel: thirdtLevelData
|
||||
.map((e) => Center(child: (Text(e.label))))
|
||||
.toList(),
|
||||
onChanged: (_0, _1, _2) {
|
||||
String position = firstLevelData[_0].label;
|
||||
if (_1 >= 1) {
|
||||
position += ', ${secondLevelData[_1].label}';
|
||||
onChanged: (level1, level2, level3) {
|
||||
String position = firstLevelData[level1].label;
|
||||
if (level2 >= 1) {
|
||||
position += ', ${secondLevelData[level2].label}';
|
||||
}
|
||||
if (_2 >= 1) {
|
||||
position += ', ${thirdtLevelData[_2].label}';
|
||||
if (level3 >= 1) {
|
||||
position += ', ${thirdtLevelData[level3].label}';
|
||||
}
|
||||
// , ${secondLevelData[_1].label}, ${thirdtLevelData[_2].label}
|
||||
controller.positionTextController.text = position;
|
||||
|
@ -536,7 +534,7 @@ class NewInventoryInout extends StatelessWidget {
|
|||
},
|
||||
child: Icon(
|
||||
Icons.close,
|
||||
shadows: [
|
||||
shadows: const [
|
||||
Shadow(
|
||||
color: Colors.black,
|
||||
offset: Offset(1, 1),
|
||||
|
|
|
@ -6,7 +6,7 @@ import 'package:get/get.dart';
|
|||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:sk_base_mobile/constants/enum.dart';
|
||||
import 'package:sk_base_mobile/db_helper/dbHelper.dart';
|
||||
import 'package:sk_base_mobile/db_helper/db_help.dart';
|
||||
import 'package:sk_base_mobile/models/index.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/inventory_inout_controller.dart';
|
||||
import 'package:sk_base_mobile/util/date.util.dart';
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/router.dart';
|
||||
|
@ -16,7 +14,7 @@ class WorkBenchModel {
|
|||
|
||||
class WorkBenchPage extends StatelessWidget {
|
||||
WorkBenchPage({super.key});
|
||||
List<WorkBenchModel> works = [
|
||||
final List<WorkBenchModel> works = [
|
||||
WorkBenchModel(title: '库存', route: '/inventory'),
|
||||
WorkBenchModel(title: '产品', route: '/product'),
|
||||
WorkBenchModel(title: '合同', route: '/contract'),
|
||||
|
@ -73,14 +71,14 @@ class WorkBenchPage extends StatelessWidget {
|
|||
clipBehavior: Clip.antiAlias,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
gradient: LinearGradient(
|
||||
gradient: const LinearGradient(
|
||||
begin: Alignment.centerLeft,
|
||||
end: Alignment.centerRight,
|
||||
colors: [AppTheme.primaryColorLight, AppTheme.primaryColor]),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: AppTheme.black.withOpacity(0.4),
|
||||
offset: Offset(0, 0),
|
||||
offset: const Offset(0, 0),
|
||||
blurRadius: 1,
|
||||
spreadRadius: 1)
|
||||
],
|
||||
|
|
|
@ -4,15 +4,6 @@ import 'package:get/get.dart';
|
|||
class WorkBenchController extends GetxController {
|
||||
late final AnimationController animationController;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
// animationController = AnimationController(
|
||||
// vsync: this,
|
||||
// duration: Duration(seconds: 2),
|
||||
// )..forward();
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
animationController.dispose();
|
||||
|
|
|
@ -1,24 +1,9 @@
|
|||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:package_info/package_info.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/models/app_bottom_nav_item.dart';
|
||||
import 'package:sk_base_mobile/models/app_config.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory/inventory.dart';
|
||||
import 'package:sk_base_mobile/screens/inventory_inout/inventory_inout.dart';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:sk_base_mobile/screens/workbench/workbench.dart';
|
||||
import 'package:sk_base_mobile/services/service.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
import 'package:sk_base_mobile/util/convert.dart';
|
||||
import 'package:sk_base_mobile/util/logger_util.dart';
|
||||
import 'dart:ui' as ui;
|
||||
import 'package:sk_base_mobile/config.dart';
|
||||
import '../constants/constants.dart';
|
||||
import '../screens/mine/mine.dart';
|
||||
|
||||
class AppInfoService extends GetxService {
|
||||
static AppInfoService get to => Get.find();
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'dart:convert';
|
||||
import 'package:get/get.dart' as Get;
|
||||
import 'package:get/get.dart' as get_package;
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:sk_base_mobile/models/base_response.dart';
|
||||
import 'package:sk_base_mobile/util/logger_util.dart';
|
||||
|
@ -10,14 +10,14 @@ import 'package:sk_base_mobile/util/snack_bar.util.dart';
|
|||
|
||||
import '../constants/constants.dart';
|
||||
|
||||
class DioService extends Get.GetxService {
|
||||
static DioService get to => Get.Get.find();
|
||||
class DioService extends get_package.GetxService {
|
||||
static DioService get to => get_package.Get.find();
|
||||
static Dio get dio => _dio;
|
||||
static late Dio _dio;
|
||||
List<String> whiteList = [Urls.login];
|
||||
BaseOptions dioBaseOptions = BaseOptions(
|
||||
connectTimeout: const Duration(seconds: GloablConfig.DIO_TIMEOUT),
|
||||
baseUrl: '${GloablConfig.BASE_URL}',
|
||||
baseUrl: GloablConfig.BASE_URL,
|
||||
followRedirects: true);
|
||||
|
||||
late CancelToken cancelToken;
|
||||
|
@ -55,7 +55,7 @@ class DioService extends Get.GetxService {
|
|||
// await SnackBarUtil().error(
|
||||
// 'The server is busy, please try again.',
|
||||
// );
|
||||
} else if (e.type == DioErrorType.badResponse) {
|
||||
} else if (e.type == DioExceptionType.badResponse) {
|
||||
// When the server response, but with a incorrect status, such as 404, 503...
|
||||
if (e.response?.statusCode == 400) {
|
||||
await SnackBarUtil().error(
|
||||
|
@ -82,7 +82,7 @@ class DioService extends Get.GetxService {
|
|||
} else if (e.response?.statusCode == 422) {
|
||||
await SnackBarUtil().error(e.response?.data['message']);
|
||||
}
|
||||
} else if (e.type == DioErrorType.cancel) {
|
||||
} else if (e.type == DioExceptionType.cancel) {
|
||||
// When the request is cancelled, dio will throw a error with this type.
|
||||
LoggerUtil().error("[Service-dio] 请求取消");
|
||||
} else {
|
||||
|
@ -117,9 +117,8 @@ class DioService extends Get.GetxService {
|
|||
.getString(CacheKeys.deviceModel, isWithUser: false); // 设备型号
|
||||
}
|
||||
if (GloablConfig.DEBUG && (options.data is! FormData)) {
|
||||
LoggerUtil().info('[Service-dio] url: ${options.path}' +
|
||||
', params: ${jsonEncode(options.queryParameters)}' +
|
||||
', body: ${jsonEncode(options.data)}, Header:${jsonEncode(options.headers)}');
|
||||
LoggerUtil().info(
|
||||
'[Service-dio] url: ${options.path}, params: ${jsonEncode(options.queryParameters)}, body: ${jsonEncode(options.data)}, Header:${jsonEncode(options.headers)}');
|
||||
}
|
||||
|
||||
handler.next(options);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:convert';
|
||||
|
||||
import 'package:dio/dio.dart' as Dio;
|
||||
import 'package:dio/dio.dart' as dio_package;
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:sk_base_mobile/store/dict.store.dart';
|
||||
|
@ -31,7 +31,7 @@ class AuthStore extends GetxService {
|
|||
}
|
||||
} catch (e) {
|
||||
LoggerUtil().info(
|
||||
'[Store-Auth]Init failed, please try again.${e}',
|
||||
'[Store-Auth]Init failed, please try again.$e',
|
||||
);
|
||||
}
|
||||
return this;
|
||||
|
@ -49,7 +49,6 @@ class AuthStore extends GetxService {
|
|||
await SnackBarUtil().error('Delete account faield. Please try again.');
|
||||
} finally {
|
||||
await LoadingUtil.to.dismiss();
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -65,7 +64,7 @@ class AuthStore extends GetxService {
|
|||
|
||||
Future<void> login(
|
||||
{required String username, required String password}) async {
|
||||
Dio.Response response;
|
||||
dio_package.Response response;
|
||||
// if (type == LoginEnum.fastLogin &&
|
||||
// StorageService.to.getString(CacheKeys.deviceUUID, isWithUser: false) ==
|
||||
// null) {
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:get/get.dart';
|
||||
import 'package:get/get_state_manager/get_state_manager.dart';
|
||||
import 'package:sk_base_mobile/constants/dict_enum.dart';
|
||||
import 'package:sk_base_mobile/models/dict_item.model.dart';
|
||||
import 'package:sk_base_mobile/models/dict_type.model.dart';
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
Map<K, dynamic> toMap<K>(dynamic value, {reserveNull = false}) {
|
||||
Map<K, dynamic> map = Map();
|
||||
Map<K, dynamic> map = {};
|
||||
|
||||
if (value == null) return map;
|
||||
|
||||
|
|
|
@ -27,13 +27,14 @@ Function(T) debouncer<T>(Function(T text)? func, {int? delayTime}) {
|
|||
Duration delay = Duration(milliseconds: delayTime ?? 1500);
|
||||
|
||||
Timer? timer;
|
||||
Function(T) target = (T value) {
|
||||
target(T value) {
|
||||
if (timer?.isActive ?? false) {
|
||||
timer?.cancel();
|
||||
}
|
||||
timer = Timer(delay, () {
|
||||
if (func != null) func.call(value);
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
|
|
@ -25,8 +25,10 @@ class LoadingUtil extends GetxService {
|
|||
|
||||
_loadingOverlay = OverlayEntry(
|
||||
builder: (BuildContext context) {
|
||||
return WillPopScope(
|
||||
onWillPop: () async => false,
|
||||
return PopScope(
|
||||
onPopInvoked: (_) {
|
||||
hideLoading();
|
||||
},
|
||||
child: Stack(
|
||||
children: <Widget>[
|
||||
ModalBarrier(dismissible: false, color: AppTheme.barrierColor),
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
import 'package:dio/dio.dart' as Dio;
|
||||
import 'package:dio/dio.dart' as dio_package;
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:image_gallery_saver/image_gallery_saver.dart';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
|
@ -45,7 +45,7 @@ class MediaUtil {
|
|||
|
||||
Future<UploadResultModel?> uploadImg(File imgfile,
|
||||
{int? bussinessRecordId, String? bussinessModule}) async {
|
||||
Dio.Response response = await Api.uploadImg(imgfile);
|
||||
dio_package.Response response = await Api.uploadImg(imgfile);
|
||||
if (response.data != null && response.data['filename'] != null) {
|
||||
return UploadResultModel.fromJson(response.data["filename"]);
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/core/zt_bottomsheet_picker.dart';
|
||||
|
@ -29,7 +28,7 @@ class ModalUtil {
|
|||
TextButton(
|
||||
child: Text(
|
||||
button,
|
||||
style: TextStyle(color: Colors.orange),
|
||||
style: const TextStyle(color: Colors.orange),
|
||||
),
|
||||
onPressed: () {
|
||||
onConfirm();
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
|
|
|
@ -42,7 +42,7 @@ class ScreenAdaper {
|
|||
|
||||
/// Text 尾部整个单词全部变成省略号的问题
|
||||
static overflowByChar(String? text) {
|
||||
return '${text ?? ''}'.replaceAll('', '\u200B');
|
||||
return (text ?? '').replaceAll('', '\u200B');
|
||||
}
|
||||
|
||||
static isLandspace() {
|
||||
|
|
|
@ -53,9 +53,10 @@ class SnackBarUtil {
|
|||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: AppTheme.snackbarSuccessBackgroudColor,
|
||||
borderRadius: 15,
|
||||
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: ScreenAdaper.height(15), vertical: 0),
|
||||
overlayColor: Colors.white,
|
||||
duration: Duration(seconds: 2),
|
||||
duration: const Duration(seconds: 2),
|
||||
dismissDirection: DismissDirection.horizontal,
|
||||
forwardAnimationCurve: Curves.fastLinearToSlowEaseIn,
|
||||
reverseAnimationCurve: Curves.linearToEaseOut);
|
||||
|
@ -71,8 +72,9 @@ class SnackBarUtil {
|
|||
message: title,
|
||||
snackPosition: SnackPosition.TOP,
|
||||
borderRadius: 15,
|
||||
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
|
||||
duration: Duration(seconds: 2),
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: ScreenAdaper.height(15), vertical: 0),
|
||||
duration: const Duration(seconds: 2),
|
||||
dismissDirection: DismissDirection.horizontal,
|
||||
forwardAnimationCurve: Curves.fastLinearToSlowEaseIn,
|
||||
reverseAnimationCurve: Curves.linearToEaseOut);
|
||||
|
@ -89,9 +91,10 @@ class SnackBarUtil {
|
|||
snackPosition: SnackPosition.TOP,
|
||||
backgroundColor: AppTheme.snackbarWarningBackgroudColor,
|
||||
borderRadius: 15,
|
||||
margin: EdgeInsets.symmetric(horizontal: 10, vertical: 0),
|
||||
margin: EdgeInsets.symmetric(
|
||||
horizontal: ScreenAdaper.height(15), vertical: 0),
|
||||
overlayColor: Colors.white,
|
||||
duration: Duration(seconds: 2),
|
||||
duration: const Duration(seconds: 2),
|
||||
dismissDirection: DismissDirection.horizontal,
|
||||
forwardAnimationCurve: Curves.fastLinearToSlowEaseIn,
|
||||
reverseAnimationCurve: Curves.linearToEaseOut);
|
||||
|
|
|
@ -8,18 +8,15 @@ import 'dart:async';
|
|||
Function throttler(
|
||||
Future Function(String text) func,
|
||||
) {
|
||||
|
||||
if (func == null) {
|
||||
return func;
|
||||
}
|
||||
bool enable = true;
|
||||
Function target = (String value) {
|
||||
target(String value) {
|
||||
if (enable == true) {
|
||||
enable = false;
|
||||
func(value).then((_) {
|
||||
enable = true;
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
|
|
@ -3,9 +3,9 @@ class ValidatorUtil {
|
|||
if (value == null || value == '') {
|
||||
return 'Email is required';
|
||||
}
|
||||
final String regexEmail =
|
||||
const String regexEmail =
|
||||
"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*\$";
|
||||
if (value == null || value.isEmpty) return null;
|
||||
return new RegExp(regexEmail).hasMatch(value) ? null : 'Email format error';
|
||||
return RegExp(regexEmail).hasMatch(value) ? null : 'Email format error';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -150,7 +150,7 @@ class BackColors extends StatelessWidget {
|
|||
filter: ImageFilter.blur(
|
||||
sigmaY: ScreenAdaper.height(30),
|
||||
sigmaX: ScreenAdaper.width(30)),
|
||||
child: SizedBox(),
|
||||
child: const SizedBox(),
|
||||
)),
|
||||
],
|
||||
),
|
||||
|
|
|
@ -3,7 +3,6 @@ import 'package:flutter/material.dart';
|
|||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/screens/landing/landing_controller.dart';
|
||||
import 'package:sk_base_mobile/services/app_info.service.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
|
||||
|
@ -16,13 +15,14 @@ class BottomNavBar extends StatelessWidget {
|
|||
return Obx(
|
||||
() => AnimatedBottomNavigationBar.builder(
|
||||
itemCount: controller.pages.length,
|
||||
elevation: ScreenAdaper.height(30),
|
||||
elevation: ScreenAdaper.height(20),
|
||||
height: ScreenAdaper.height(100),
|
||||
activeIndex: controller.currentIndex.value,
|
||||
gapLocation: GapLocation.center,
|
||||
notchSmoothness: NotchSmoothness.verySmoothEdge,
|
||||
leftCornerRadius: ScreenAdaper.sp(25),
|
||||
rightCornerRadius: ScreenAdaper.sp(25),
|
||||
notchMargin: ScreenAdaper.height(10),
|
||||
notchSmoothness: NotchSmoothness.smoothEdge,
|
||||
leftCornerRadius: ScreenAdaper.sp(40),
|
||||
rightCornerRadius: ScreenAdaper.sp(40),
|
||||
onTap: (index) {
|
||||
controller.currentIndex.value = index;
|
||||
},
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:get/get_core/src/get_main.dart';
|
||||
import 'package:sk_base_mobile/util/date.util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class ZtDatePicker extends StatelessWidget {
|
||||
|
|
|
@ -1,101 +0,0 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/util/logger_util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class ZtBaseDatePicker extends StatelessWidget {
|
||||
final Function? onDateTimeChanged;
|
||||
final yearController =
|
||||
FixedExtentScrollController(initialItem: DateTime.now().year - 2000);
|
||||
final monthController =
|
||||
FixedExtentScrollController(initialItem: DateTime.now().month - 1);
|
||||
final dayController =
|
||||
FixedExtentScrollController(initialItem: DateTime.now().day - 1);
|
||||
ZtBaseDatePicker({super.key, this.onDateTimeChanged});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
height: ScreenAdaper.height(250),
|
||||
color: Colors.white,
|
||||
child: Column(
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
},
|
||||
child: Text(
|
||||
'取消',
|
||||
style: TextStyle(fontSize: ScreenAdaper.height(25)),
|
||||
)),
|
||||
const Spacer(),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
Get.back();
|
||||
final year = 2000 + yearController.selectedItem;
|
||||
String month = '${monthController.selectedItem + 1}';
|
||||
if (int.parse(month) < 10) {
|
||||
month = '0$month';
|
||||
}
|
||||
final day = dayController.selectedItem + 1;
|
||||
if (onDateTimeChanged != null) {
|
||||
onDateTimeChanged!('$year-$month-$day');
|
||||
}
|
||||
LoggerUtil().info('$year-$month-$day');
|
||||
},
|
||||
child: Text(
|
||||
'确定',
|
||||
style: TextStyle(fontSize: ScreenAdaper.height(25)),
|
||||
))
|
||||
],
|
||||
),
|
||||
Expanded(
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: CupertinoPicker(
|
||||
scrollController: yearController,
|
||||
itemExtent: ScreenAdaper.height(60),
|
||||
onSelectedItemChanged: (int index) {
|
||||
// 处理用户选择的年份
|
||||
},
|
||||
children: List<Widget>.generate(DateTime.now().year - 1999,
|
||||
(int index) {
|
||||
return Center(child: Text('${2000 + index}年'));
|
||||
}),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: CupertinoPicker(
|
||||
scrollController: monthController,
|
||||
itemExtent: ScreenAdaper.height(60),
|
||||
onSelectedItemChanged: (int index) {
|
||||
// 处理用户选择的月份
|
||||
},
|
||||
children: List<Widget>.generate(12, (int index) {
|
||||
return Center(child: Text('${index + 1}月'));
|
||||
}),
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: CupertinoPicker(
|
||||
scrollController: dayController,
|
||||
itemExtent: ScreenAdaper.height(60),
|
||||
onSelectedItemChanged: (int index) {
|
||||
// 处理用户选择的日期
|
||||
},
|
||||
children: List<Widget>.generate(31, (int index) {
|
||||
return Center(child: Text('${index + 1}日'));
|
||||
}),
|
||||
),
|
||||
),
|
||||
],
|
||||
))
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import 'package:get/get.dart';
|
|||
import 'package:sk_base_mobile/util/logger_util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
// ignore: must_be_immutable
|
||||
class ZtBaseDatePicker extends StatelessWidget {
|
||||
final Function(String)? onDateTimeChanged;
|
||||
late final FixedExtentScrollController yearController;
|
||||
|
|
|
@ -6,17 +6,17 @@ import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
|||
|
||||
class ZtBottomSheetPicker extends StatelessWidget {
|
||||
final Function? onChanged;
|
||||
FixedExtentScrollController firstLevelControlller =
|
||||
final FixedExtentScrollController firstLevelControlller =
|
||||
FixedExtentScrollController();
|
||||
FixedExtentScrollController secondLevelController =
|
||||
final FixedExtentScrollController secondLevelController =
|
||||
FixedExtentScrollController();
|
||||
FixedExtentScrollController thirdLevelController =
|
||||
final FixedExtentScrollController thirdLevelController =
|
||||
FixedExtentScrollController();
|
||||
final List<Widget> firstLevel;
|
||||
final List<Widget>? secondLevel;
|
||||
final List<Widget>? thirdLevel;
|
||||
double? itemHeight;
|
||||
double? popupHeight;
|
||||
final double? itemHeight;
|
||||
final double? popupHeight;
|
||||
final String title;
|
||||
ZtBottomSheetPicker(
|
||||
{super.key,
|
||||
|
|
|
@ -1,9 +1,6 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
import 'package:sk_base_mobile/screens/new_inventory_inout/new_inventory_inout_controller.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class ZtNumberInput extends StatelessWidget {
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_typeahead/flutter_typeahead.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
|
@ -82,7 +81,7 @@ class ZtSearchSelect<T> extends StatelessWidget {
|
|||
fontSize: ScreenAdaper.height(30)),
|
||||
),
|
||||
])
|
||||
: SizedBox()));
|
||||
: const SizedBox()));
|
||||
},
|
||||
emptyBuilder: (_) => Container(
|
||||
alignment: Alignment.center,
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/constants/bg_color.dart';
|
||||
import 'package:sk_base_mobile/screens/new_inventory_inout/new_inventory_inout_controller.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
|
||||
class ZtTextInput extends StatelessWidget {
|
||||
|
|
|
@ -9,19 +9,19 @@ class FadeInCacheImage extends StatefulWidget {
|
|||
final double? height;
|
||||
final String? url;
|
||||
final BoxFit? fit;
|
||||
bool compress;
|
||||
bool canFullscreen;
|
||||
FadeInCacheImage(
|
||||
{Key? key,
|
||||
final bool compress;
|
||||
final bool canFullscreen;
|
||||
const FadeInCacheImage(
|
||||
{super.key,
|
||||
this.width,
|
||||
this.height,
|
||||
this.url,
|
||||
this.fit = BoxFit.cover,
|
||||
this.compress = false,
|
||||
this.canFullscreen = false})
|
||||
: super(key: key);
|
||||
this.canFullscreen = false});
|
||||
|
||||
@override
|
||||
// ignore: library_private_types_in_public_api
|
||||
_FadeInCacheImageState createState() => _FadeInCacheImageState();
|
||||
}
|
||||
|
||||
|
|
|
@ -48,7 +48,8 @@ class _ImagePreivewState extends State<ImagePreivew> {
|
|||
scrollPhysics: const BouncingScrollPhysics(),
|
||||
builder: _buildItem,
|
||||
itemCount: widget.galleryItems.length,
|
||||
loadingBuilder: (_, _1) => const LoadingIndicator(common: true),
|
||||
loadingBuilder: (_, chunkEvent) =>
|
||||
const LoadingIndicator(common: true),
|
||||
backgroundDecoration: widget.backgroundDecoration,
|
||||
pageController: widget.pageController,
|
||||
onPageChanged: onPageChanged,
|
||||
|
@ -75,7 +76,6 @@ class _ImagePreivewState extends State<ImagePreivew> {
|
|||
await MediaUtil().saveImageToPhotoLib(
|
||||
imgUrl:
|
||||
'${GloablConfig.OSS_URL}${widget.galleryItems[currentIndex].path}');
|
||||
} catch (e) {
|
||||
} finally {
|
||||
LoadingUtil.to.dismiss();
|
||||
SnackBarUtil().success('已保存到相册');
|
||||
|
@ -95,7 +95,7 @@ class _ImagePreivewState extends State<ImagePreivew> {
|
|||
PhotoViewGalleryPageOptions _buildItem(BuildContext context, int index) {
|
||||
final FileModel item = widget.galleryItems[index];
|
||||
return PhotoViewGalleryPageOptions(
|
||||
onTapUp: (_, _1, _2) {
|
||||
onTapUp: (_, tapUpDetails, value) {
|
||||
Get.back();
|
||||
},
|
||||
imageProvider: Image.network('${GloablConfig.OSS_URL}${item.path}').image,
|
||||
|
|
|
@ -1,15 +1,8 @@
|
|||
import 'dart:io';
|
||||
import 'package:sk_base_mobile/apis/index.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:sk_base_mobile/models/upload_result.model.dart';
|
||||
import 'package:sk_base_mobile/store/auth.store.dart';
|
||||
import 'package:sk_base_mobile/util/media_util.dart';
|
||||
import 'package:sk_base_mobile/util/photo_picker_util.dart';
|
||||
import 'package:sk_base_mobile/util/loading_util.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/util/snack_bar.util.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
|
||||
import '../util/util.dart';
|
||||
|
|
|
@ -1,12 +1,10 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:loading_animation_widget/loading_animation_widget.dart';
|
||||
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/loading_indicator.dart';
|
||||
|
||||
class RefreshFooter extends StatefulWidget {
|
||||
const RefreshFooter({Key? key}) : super(key: key);
|
||||
const RefreshFooter({super.key});
|
||||
|
||||
@override
|
||||
State<RefreshFooter> createState() => _RefreshFooterState();
|
||||
|
@ -19,11 +17,6 @@ class _RefreshFooterState extends State<RefreshFooter>
|
|||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return buildBody();
|
||||
|
|
|
@ -1,42 +1,24 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:loading_animation_widget/loading_animation_widget.dart';
|
||||
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||
import 'package:sk_base_mobile/app_theme.dart';
|
||||
import 'package:sk_base_mobile/util/screen_adaper_util.dart';
|
||||
import 'package:sk_base_mobile/widgets/loading_indicator.dart';
|
||||
|
||||
class RefreshHeader extends RefreshIndicator {
|
||||
RefreshHeader()
|
||||
RefreshHeader({super.key})
|
||||
: super(
|
||||
height: ScreenAdaper.height(100),
|
||||
refreshStyle: RefreshStyle.Follow);
|
||||
@override
|
||||
State<StatefulWidget> createState() {
|
||||
// TODO: implement createState
|
||||
return RefreshHeaderState();
|
||||
}
|
||||
}
|
||||
|
||||
class RefreshHeaderState extends RefreshIndicatorState<RefreshHeader>
|
||||
with SingleTickerProviderStateMixin {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void onModeChange(RefreshStatus? mode) {
|
||||
super.onModeChange(mode);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> endRefresh() async {}
|
||||
|
||||
@override
|
||||
void resetValue() {
|
||||
super.resetValue();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget buildContent(BuildContext context, RefreshStatus mode) {
|
||||
TextStyle style = TextStyle(fontSize: ScreenAdaper.height(18));
|
||||
|
@ -59,9 +41,4 @@ class RefreshHeaderState extends RefreshIndicatorState<RefreshHeader>
|
|||
child: Center(child: body),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ import 'package:flutter/cupertino.dart';
|
|||
class WantKeepAlive extends StatefulWidget {
|
||||
final Widget child;
|
||||
|
||||
WantKeepAlive({required this.child});
|
||||
const WantKeepAlive({super.key, required this.child});
|
||||
|
||||
@override
|
||||
State<StatefulWidget> createState() {
|
||||
|
|
|
@ -335,7 +335,7 @@ packages:
|
|||
source: hosted
|
||||
version: "3.0.2"
|
||||
flutter_native_splash:
|
||||
dependency: "direct dev"
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_native_splash
|
||||
sha256: "45e2c0986d749c070509e03d6c7ad6c8bd1f7b1dad7d11dd8750a5e4fe3e2c0b"
|
||||
|
|
|
@ -60,7 +60,7 @@ dependencies:
|
|||
photo_view: ^0.14.0
|
||||
image_gallery_saver: ^2.0.3
|
||||
flutter_staggered_grid_view: ^0.7.0
|
||||
|
||||
flutter_native_splash: ^2.3.11
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
@ -72,7 +72,7 @@ dev_dependencies:
|
|||
# rules and activating additional ones.
|
||||
flutter_lints: ^3.0.2
|
||||
flutter_launcher_icons: ^0.13.1
|
||||
flutter_native_splash: ^2.3.11
|
||||
|
||||
# For information on the generic Dart part of this file, see the
|
||||
# following page: https://dart.dev/tools/pub/pubspec
|
||||
|
||||
|
|
|
@ -7,13 +7,12 @@
|
|||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
|
||||
import 'package:sk_base_mobile/main.dart';
|
||||
import 'package:sk_base_mobile/index.dart';
|
||||
|
||||
void main() {
|
||||
testWidgets('Counter increments smoke test', (WidgetTester tester) async {
|
||||
// Build our app and trigger a frame.
|
||||
await tester.pumpWidget(const MyApp());
|
||||
await tester.pumpWidget(const IndexPage());
|
||||
|
||||
// Verify that our counter starts at 0.
|
||||
expect(find.text('0'), findsOneWidget);
|
||||
|
|
Loading…
Reference in New Issue