fix: all code issue

This commit is contained in:
louis 2024-03-31 17:13:29 +08:00
parent 89e7a575a8
commit d78a2598ac
76 changed files with 199 additions and 596 deletions

View File

@ -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
}

View File

@ -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';

View File

@ -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);
},
),
),

View File

@ -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/";

View File

@ -1,5 +1,3 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:sk_base_mobile/constants/bg_color.dart';

View File

@ -1,3 +1,4 @@
//ignore_for_file: constant_identifier_names
class DictTypeEnum {
static const String InventoryRoom = "inventory_room";
static const String InventoryLine = 'inventory_line';

View File

@ -1,3 +1,4 @@
//ignore_for_file: constant_identifier_names
enum BackActionEnum {
refresh,
}

View File

@ -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()),
];
}

View File

@ -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';

View File

@ -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!));
})));
}

View File

@ -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';

View File

@ -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;

View File

@ -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;
}

View File

@ -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;
}
}

View File

@ -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(),
};
}

View File

@ -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({

View File

@ -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(),
};

View File

@ -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(),
};
}

View File

@ -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';

View File

@ -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(),
)
],
),

View File

@ -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) {

View File

@ -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 {

View File

@ -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;

View File

@ -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]),
))
]),
);
}

View File

@ -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() {

View File

@ -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,
),
)),
);
}
}

View File

@ -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;

View File

@ -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,

View File

@ -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();
}
}

View File

@ -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) {

View File

@ -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: '');

View File

@ -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';

View File

@ -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,

View File

@ -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),

View File

@ -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:

View File

@ -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);

View File

@ -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),

View File

@ -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),
),
),
);

View File

@ -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 =

View File

@ -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),
),
),
);

View File

@ -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),

View File

@ -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';

View File

@ -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)
],

View File

@ -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();

View File

@ -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();

View File

@ -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);

View File

@ -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) {

View File

@ -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';

View File

@ -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;

View File

@ -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;
}

View File

@ -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),

View File

@ -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"]);
}

View File

@ -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();

View File

@ -1,5 +1,3 @@
import 'dart:io';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:image_picker/image_picker.dart';

View File

@ -42,7 +42,7 @@ class ScreenAdaper {
/// Text
static overflowByChar(String? text) {
return '${text ?? ''}'.replaceAll('', '\u200B');
return (text ?? '').replaceAll('', '\u200B');
}
static isLandspace() {

View File

@ -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);

View File

@ -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;
}

View File

@ -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';
}
}

View File

@ -150,7 +150,7 @@ class BackColors extends StatelessWidget {
filter: ImageFilter.blur(
sigmaY: ScreenAdaper.height(30),
sigmaX: ScreenAdaper.width(30)),
child: SizedBox(),
child: const SizedBox(),
)),
],
),

View File

@ -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;
},

View File

@ -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 {

View File

@ -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}'));
}),
),
),
],
))
],
),
);
}
}

View File

@ -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;

View File

@ -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,

View File

@ -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 {

View File

@ -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,

View File

@ -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 {

View File

@ -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();
}

View File

@ -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,

View File

@ -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';

View File

@ -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();

View File

@ -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();
}
}

View File

@ -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() {

View File

@ -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"

View File

@ -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

View File

@ -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);