Commit 79bc250a by York

增加广告位,修改 bug

parent 05716b0f
File added
...@@ -7,13 +7,14 @@ import 'package:special_equipment_flutter/ui/examine/exam/exam_result_page.dart' ...@@ -7,13 +7,14 @@ import 'package:special_equipment_flutter/ui/examine/exam/exam_result_page.dart'
import 'package:special_equipment_flutter/ui/examine/test/test_page.dart'; import 'package:special_equipment_flutter/ui/examine/test/test_page.dart';
import 'package:special_equipment_flutter/ui/examine/test/test_result_page.dart'; import 'package:special_equipment_flutter/ui/examine/test/test_result_page.dart';
import 'package:special_equipment_flutter/ui/examine/test/test_setting_page.dart'; import 'package:special_equipment_flutter/ui/examine/test/test_setting_page.dart';
import 'package:special_equipment_flutter/ui/file/file_list_page.dart';
import 'package:special_equipment_flutter/ui/login/login_page.dart'; import 'package:special_equipment_flutter/ui/login/login_page.dart';
import 'package:special_equipment_flutter/ui/main/tab_home_page.dart'; import 'package:special_equipment_flutter/ui/main/tab_home_page.dart';
import 'package:special_equipment_flutter/ui/main/unit/equipment_personnel_page.dart'; import 'package:special_equipment_flutter/ui/main/unit/equipment_personnel_page.dart';
import 'package:special_equipment_flutter/ui/overseer/equipment_list_page.dart'; import 'package:special_equipment_flutter/ui/overseer/equipment_list_page1.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_history_details_page.dart'; import 'package:special_equipment_flutter/ui/overseer/overseer_history_details_page.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_history_list_page.dart'; import 'package:special_equipment_flutter/ui/overseer/overseer_history_list_page.dart';
import 'package:special_equipment_flutter/ui/overseer/overseer_settings_page.dart'; import 'package:special_equipment_flutter/ui/overseer/overseer_settings_pages.dart';
import 'package:special_equipment_flutter/ui/overseer/unit_list_page.dart'; import 'package:special_equipment_flutter/ui/overseer/unit_list_page.dart';
import 'package:special_equipment_flutter/ui/register/address_page.dart'; import 'package:special_equipment_flutter/ui/register/address_page.dart';
import 'package:special_equipment_flutter/ui/register/register_page1.dart'; import 'package:special_equipment_flutter/ui/register/register_page1.dart';
...@@ -142,6 +143,9 @@ class RouteString { ...@@ -142,6 +143,9 @@ class RouteString {
static const String OVERSEER_HISTROY_DETAILS_PAGE = static const String OVERSEER_HISTROY_DETAILS_PAGE =
"/OverseerHistroyDetailsPage"; "/OverseerHistroyDetailsPage";
///文件预览
static const String FILE_LIST_PAGE = "/FileListPage";
static final routes = [ static final routes = [
///登录 ///登录
GetPage(name: LOGIN, page: () => const LoginPage()), GetPage(name: LOGIN, page: () => const LoginPage()),
...@@ -222,7 +226,7 @@ class RouteString { ...@@ -222,7 +226,7 @@ class RouteString {
GetPage(name: EXAM_RESULT_PAGE, page: () => ExamResultPage()), GetPage(name: EXAM_RESULT_PAGE, page: () => ExamResultPage()),
///监察人设置考核 ///监察人设置考核
GetPage(name: OVERSEER_SETTINGS_PAGE, page: () => OverseerSettingsPage()), GetPage(name: OVERSEER_SETTINGS_PAGE, page: () => OverseerSettingsPages()),
///监察人选择单位 ///监察人选择单位
GetPage(name: UNIT_LIST_PAGE, page: () => UnitListPage()), GetPage(name: UNIT_LIST_PAGE, page: () => UnitListPage()),
...@@ -246,6 +250,9 @@ class RouteString { ...@@ -246,6 +250,9 @@ class RouteString {
name: OVERSEER_HISTROY_DETAILS_PAGE, name: OVERSEER_HISTROY_DETAILS_PAGE,
page: () => OverseerHistroyDetailsPage()), page: () => OverseerHistroyDetailsPage()),
///文件预览
GetPage(name: FILE_LIST_PAGE, page: () => FileListPage()),
// GetPage( // GetPage(
// name: "/shop", // name: "/shop",
// page: () => const ShopPage(), // page: () => const ShopPage(),
......
...@@ -3,15 +3,15 @@ ...@@ -3,15 +3,15 @@
class Api { class Api {
static var IS_DEBUG = true; static var IS_DEBUG = true;
static String URL = // static String URL =
IS_DEBUG ? "https://special.sxyztech.cn/" : "http://192.168.19.165:2212/"; // IS_DEBUG ? "https://special.sxyztech.cn/" : "http://192.168.19.165:2222/";
///演示 ip ///演示 ip
// static String URL = "http://47.92.138.92:8009/"; // static String URL = "http://47.92.138.92:8009/";
// static String URL = "http://192.168.19.164:8087/"; // static String URL = "http://192.168.19.164:8087/";
// static String URL = "http://192.168.19.165:2212/"; static String URL = "http://192.168.19.215:8181/";
static String START_URL = "special/a/", static String START_URL = "special/a/",
END_URL = "__ajax=true&mobileLogin=true"; END_URL = "__ajax=true&mobileLogin=true";
...@@ -239,6 +239,9 @@ class Api { ...@@ -239,6 +239,9 @@ class Api {
/// 监察记录 删除 /// 监察记录 删除
static String EXAM_SETUP_DELETE = "${URL + START_URL}exam/examSetup/delete"; static String EXAM_SETUP_DELETE = "${URL + START_URL}exam/examSetup/delete";
/// 首页广告 banner
static String BANNER = "${URL + START_URL}advertis/advertis/appAdvertisList";
/// 获取考核信息 /// 获取考核信息
// static String EXAMINE_PERSON = "${URL + START_URL}/exam/examPerson/checkHaveExam"; // static String EXAMINE_PERSON = "${URL + START_URL}/exam/examPerson/checkHaveExam";
} }
...@@ -8,6 +8,7 @@ import 'package:get/route_manager.dart'; ...@@ -8,6 +8,7 @@ import 'package:get/route_manager.dart';
import 'package:special_equipment_flutter/dio/dio/do_utils.dart'; import 'package:special_equipment_flutter/dio/dio/do_utils.dart';
import 'package:special_equipment_flutter/model/app_is_open.dart'; import 'package:special_equipment_flutter/model/app_is_open.dart';
import 'package:special_equipment_flutter/model/app_roles.dart'; import 'package:special_equipment_flutter/model/app_roles.dart';
import 'package:special_equipment_flutter/model/banner_list_bo.dart';
import 'package:special_equipment_flutter/model/base/base_model.dart'; import 'package:special_equipment_flutter/model/base/base_model.dart';
import 'package:special_equipment_flutter/model/base/result_obj_bo.dart'; import 'package:special_equipment_flutter/model/base/result_obj_bo.dart';
import 'package:special_equipment_flutter/model/city_address_bo.dart'; import 'package:special_equipment_flutter/model/city_address_bo.dart';
...@@ -1705,6 +1706,30 @@ class HttpUtils { ...@@ -1705,6 +1706,30 @@ class HttpUtils {
} }
} }
///首页广告 banner
static Future getBannerList(BuildContext context) async {
Map<String, dynamic> params = {};
var response = await NetUtils.get(
context,
'${Api.BANNER};JSESSIONID=${StorageUtil.getInstance().getJsessionId()}',
false,
params);
try {
BaseModel entity = BaseModel.fromJson(response);
Map<String, dynamic> resultData = entity.body;
BannerListBo mBannerListBo = BannerListBo.fromJson(resultData);
if (entity.errorCode == "-1") {
return mBannerListBo;
} else {
ToastUtils.showCenter(entity.msg!);
return;
}
} catch (e) {
log(e.toString());
return {"message": e.toString()};
}
}
// HttpUtils.getList(context, _page, 20).then((value) { // HttpUtils.getList(context, _page, 20).then((value) {
// ListBo listBo = value; // ListBo listBo = value;
// print(listBo); // print(listBo);
......
class BannerListBo {
BannerListBo({
this.data,
});
BannerListBo.fromJson(dynamic json) {
if (json['data'] != null) {
data = [];
json['data'].forEach((v) {
data?.add(Data.fromJson(v));
});
}
}
List<Data>? data;
BannerListBo copyWith({
List<Data>? data,
}) =>
BannerListBo(
data: data ?? this.data,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
if (data != null) {
map['data'] = data?.map((v) => v.toJson()).toList();
}
return map;
}
}
class Data {
Data({
this.id,
this.remarks,
this.createBy,
this.createDate,
this.updateBy,
this.updateDate,
this.businessName,
this.advertisUrl,
this.advertisPosition,
this.linkUrl,
this.isShow,
});
Data.fromJson(dynamic json) {
id = json['id'];
remarks = json['remarks'];
createBy =
json['createBy'] != null ? CreateBy.fromJson(json['createBy']) : null;
createDate = json['createDate'];
updateBy =
json['updateBy'] != null ? UpdateBy.fromJson(json['updateBy']) : null;
updateDate = json['updateDate'];
businessName = json['businessName'];
advertisUrl = json['advertisUrl'];
advertisPosition = json['advertisPosition'];
linkUrl = json['linkUrl'];
isShow = json['isShow'];
}
String? id;
String? remarks;
CreateBy? createBy;
String? createDate;
UpdateBy? updateBy;
String? updateDate;
String? businessName;
String? advertisUrl;
String? advertisPosition;
String? linkUrl;
String? isShow;
Data copyWith({
String? id,
String? remarks,
CreateBy? createBy,
String? createDate,
UpdateBy? updateBy,
String? updateDate,
String? businessName,
String? advertisUrl,
String? advertisPosition,
String? linkUrl,
String? isShow,
}) =>
Data(
id: id ?? this.id,
remarks: remarks ?? this.remarks,
createBy: createBy ?? this.createBy,
createDate: createDate ?? this.createDate,
updateBy: updateBy ?? this.updateBy,
updateDate: updateDate ?? this.updateDate,
businessName: businessName ?? this.businessName,
advertisUrl: advertisUrl ?? this.advertisUrl,
advertisPosition: advertisPosition ?? this.advertisPosition,
linkUrl: linkUrl ?? this.linkUrl,
isShow: isShow ?? this.isShow,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['remarks'] = remarks;
if (createBy != null) {
map['createBy'] = createBy?.toJson();
}
map['createDate'] = createDate;
if (updateBy != null) {
map['updateBy'] = updateBy?.toJson();
}
map['updateDate'] = updateDate;
map['businessName'] = businessName;
map['advertisUrl'] = advertisUrl;
map['advertisPosition'] = advertisPosition;
map['linkUrl'] = linkUrl;
map['isShow'] = isShow;
return map;
}
}
class UpdateBy {
UpdateBy({
this.id,
this.loginFlag,
this.roleNames,
this.admin,
});
UpdateBy.fromJson(dynamic json) {
id = json['id'];
loginFlag = json['loginFlag'];
roleNames = json['roleNames'];
admin = json['admin'];
}
String? id;
String? loginFlag;
String? roleNames;
bool? admin;
UpdateBy copyWith({
String? id,
String? loginFlag,
String? roleNames,
bool? admin,
}) =>
UpdateBy(
id: id ?? this.id,
loginFlag: loginFlag ?? this.loginFlag,
roleNames: roleNames ?? this.roleNames,
admin: admin ?? this.admin,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['loginFlag'] = loginFlag;
map['roleNames'] = roleNames;
map['admin'] = admin;
return map;
}
}
class CreateBy {
CreateBy({
this.id,
this.loginFlag,
this.roleNames,
this.admin,
});
CreateBy.fromJson(dynamic json) {
id = json['id'];
loginFlag = json['loginFlag'];
roleNames = json['roleNames'];
admin = json['admin'];
}
String? id;
String? loginFlag;
String? roleNames;
bool? admin;
CreateBy copyWith({
String? id,
String? loginFlag,
String? roleNames,
bool? admin,
}) =>
CreateBy(
id: id ?? this.id,
loginFlag: loginFlag ?? this.loginFlag,
roleNames: roleNames ?? this.roleNames,
admin: admin ?? this.admin,
);
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['loginFlag'] = loginFlag;
map['roleNames'] = roleNames;
map['admin'] = admin;
return map;
}
}
...@@ -43,6 +43,7 @@ class EquiList { ...@@ -43,6 +43,7 @@ class EquiList {
String? id; String? id;
String? name; String? name;
bool isChecked = false;
EquiList copyWith({ EquiList copyWith({
String? id, String? id,
......
class UserBo {
String? account;
String? password;
UserBo(this.account, this.password);
Map<String, dynamic> toJson() {
return {
'account': account,
'password': password,
};
}
}
import 'package:flutter/material.dart';
class FileListPage extends StatefulWidget {
const FileListPage({Key? key}) : super(key: key);
@override
State<FileListPage> createState() => _FileListPageState();
}
class _FileListPageState extends State<FileListPage> {
final String filePath = 'assets/name.pdf';
final sampleUrl = 'http://www.pdf995.com/samples/pdf.pdf';
// final pdfController = PdfController(
// document: PdfDocument.openAsset('assets/name.pdf'),
// );
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Builder(builder: (context) {
return Scaffold(
backgroundColor: Colors.black,
appBar: AppBar(
title: Text('Plugin example app'),
),
body: Container(),
);
}),
);
}
// dynamic buildPdfView() {
// return PdfView(
// controller: pdfController,
// );
// }
}
...@@ -42,6 +42,25 @@ class EquipmentPersonnelTable extends StatelessWidget { ...@@ -42,6 +42,25 @@ class EquipmentPersonnelTable extends StatelessWidget {
child: Column( child: Column(
children: [ children: [
buildTitle(Icons.compare, '设备人员对比'), buildTitle(Icons.compare, '设备人员对比'),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'设备人员对比表格,是对比每个设备是否配备了相关负责人员,请在【用户设置】内配置相关负责人员.',
style: TextStyle(color: Colors.orange, fontSize: 13),
),
),
const SizedBox(height: 10), const SizedBox(height: 10),
Table( Table(
border: TableBorder.all(color: ColorConst.blueColor), border: TableBorder.all(color: ColorConst.blueColor),
......
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:special_equipment_flutter/dio/http_utils.dart';
import 'package:special_equipment_flutter/model/exam/equipment_list_bo.dart';
import 'package:special_equipment_flutter/model/exam/exam_unit_list.dart';
import 'package:special_equipment_flutter/utils/storage_util.dart';
import 'package:special_equipment_flutter/widgets/app_bar/custom_app_bar.dart';
///设备选择
class EquipmentListPage extends StatefulWidget {
var arguments = Get.arguments;
EquipmentListPage({super.key});
@override
State<EquipmentListPage> createState() => _EquipmentListPageState();
}
class _EquipmentListPageState extends State<EquipmentListPage> {
List<EquiList>? officeLists = [];
List<EquiList>? filterOfficeLists = [];
var officeId = '';
@override
void initState() {
super.initState();
officeId = widget.arguments['officeId'];
getEquipmentList();
}
///获取设备类型
void getEquipmentList() {
HttpUtils.getEquipmentList(context, officeId).then((value) {
EquipmentListBo listBo = value;
if (mounted) {
setState(() {
officeLists = listBo.list;
filterOfficeLists = officeLists;
});
}
});
}
void _filterData(String query) {
setState(() {
filterOfficeLists = officeLists!.where((EquiList item) {
return item.name!.toLowerCase().contains(query.toLowerCase());
}).toList();
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBarCustom(text: '选择设备', height: 50),
body: Column(
children: [
const SizedBox(height: 10),
Container(
margin: const EdgeInsets.only(left: 10, right: 10),
decoration: BoxDecoration(
color: Colors.grey[200],
borderRadius: BorderRadius.circular(10),
),
child: Row(
children: [
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
// 处理搜索逻辑
},
),
Expanded(
child: TextField(
onChanged: (value) {
_filterData(value);
},
decoration: const InputDecoration(
hintText: '请输入搜索关键字',
border: InputBorder.none,
),
),
),
],
),
),
const SizedBox(height: 10),
Flexible(
child: ListView.builder(
shrinkWrap: true,
padding:
const EdgeInsets.only(top: 0, left: 0, bottom: 0, right: 0),
itemCount: filterOfficeLists!.length,
// 列表项数量
itemBuilder: (context, index) {
return GestureDetector(
onTap: () {
setState(() {
Get.back(result: filterOfficeLists![index]);
});
},
child: Container(
padding: const EdgeInsets.only(
left: 30, right: 15, top: 10, bottom: 10),
child: Text(
filterOfficeLists![index].name!,
style: const TextStyle(fontSize: 18),
),
),
);
},
),
),
],
),
);
}
}
...@@ -171,7 +171,7 @@ class _RegisterPage2State extends State<RegisterPage2> { ...@@ -171,7 +171,7 @@ class _RegisterPage2State extends State<RegisterPage2> {
), ),
child: const Text( child: const Text(
softWrap: true, softWrap: true,
'密码至少包含以下 3 种类别:大写字母、小写字母、数字、特殊符号( @#*. )、8-20位', '密码至少包含以下 5 种类别:大写字母、小写字母、数字、特殊符号( @#*. )、8-20位',
style: TextStyle(color: Colors.orange, fontSize: 12), style: TextStyle(color: Colors.orange, fontSize: 12),
), ),
), ),
......
...@@ -142,6 +142,31 @@ class _InspectListSyPageState extends State<InspectListSyPage> ...@@ -142,6 +142,31 @@ class _InspectListSyPageState extends State<InspectListSyPage>
backgroundColor: Colors.grey[100], backgroundColor: Colors.grey[100],
body: Column( body: Column(
children: [ children: [
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 10, right: 10, top: 10),
padding:
const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: Text(
softWrap: true,
type == '1'
? '小提示:当天新建的设备和用户,会在第二天生成【日管控】任务.'
: type == '2'
? '小提示:【周排查】可在 每周四-周日 完成任务.'
: type == '3'
? '小提示:【月调度】可在 每月25日-月底 完成任务.'
: '',
style: const TextStyle(color: Colors.orange, fontSize: 14),
),
),
Expanded( Expanded(
flex: 1, flex: 1,
child: EasyRefresh( child: EasyRefresh(
...@@ -282,7 +307,7 @@ class _InspectListSyPageState extends State<InspectListSyPage> ...@@ -282,7 +307,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildWeekCard(BuildContext context, int index) { Card buildWeekCard(BuildContext context, int index) {
return Card( return Card(
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0), margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
elevation: listWeek[index].allow == '0' ? 3 : 0, elevation: listWeek[index].allow == '0' ? 3 : 0,
color: listWeek[index].allow == '0' ? Colors.white : Colors.grey[300], color: listWeek[index].allow == '0' ? Colors.white : Colors.grey[300],
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
...@@ -310,7 +335,7 @@ class _InspectListSyPageState extends State<InspectListSyPage> ...@@ -310,7 +335,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildMonthsCard(BuildContext context, int index) { Card buildMonthsCard(BuildContext context, int index) {
return Card( return Card(
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0), margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
elevation: listMonth[index].allow == '0' ? 3 : 0, elevation: listMonth[index].allow == '0' ? 3 : 0,
color: listMonth[index].allow == '0' ? Colors.white : Colors.grey[300], color: listMonth[index].allow == '0' ? Colors.white : Colors.grey[300],
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
...@@ -340,7 +365,7 @@ class _InspectListSyPageState extends State<InspectListSyPage> ...@@ -340,7 +365,7 @@ class _InspectListSyPageState extends State<InspectListSyPage>
Card buildDaysCard(BuildContext context, int index) { Card buildDaysCard(BuildContext context, int index) {
return Card( return Card(
elevation: 3, elevation: 3,
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0), margin: const EdgeInsets.only(left: 0, right: 0, top: 10, bottom: 0),
color: Colors.white, color: Colors.white,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(5)), borderRadius: BorderRadius.all(Radius.circular(5)),
......
...@@ -104,8 +104,8 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -104,8 +104,8 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
children: [ children: [
Image.asset('assets/home/rigister_bg.png'), Image.asset('assets/home/rigister_bg.png'),
Container( Container(
margin: margin: EdgeInsets.only(
const EdgeInsets.only(left: 15, top: 130, right: 15, bottom: 0), left: 15, top: type == '1' ? 150 : 130, right: 15, bottom: 0),
decoration: const BoxDecoration( decoration: const BoxDecoration(
color: ColorConst.whiteColor, color: ColorConst.whiteColor,
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
...@@ -196,6 +196,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -196,6 +196,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
hintText: type == '3' ? '' : '请填写设备名称', hintText: type == '3' ? '' : '请填写设备名称',
controller: nameText, controller: nameText,
focusNode: nameFocusNode), focusNode: nameFocusNode),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'设备名称可识别对应设备即可,没有特殊要求;\n例如:曳引驱动乘客电梯-1;曳引驱动乘客电梯-2',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
const SizedBox(height: 10), const SizedBox(height: 10),
Row(children: [ Row(children: [
Icon( Icon(
...@@ -216,6 +235,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -216,6 +235,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
controller: codeText, controller: codeText,
focusNode: codeFocusNode, focusNode: codeFocusNode,
isNoChinese: true), isNoChinese: true),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'内部编码可识别对应设备即可,没有特殊要求;\n例如:DT-1;DT-2',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
const SizedBox(height: 8), const SizedBox(height: 8),
Row(children: [ Row(children: [
Icon(type == '3' ? Icons.assignment_ind : Icons.touch_app, Icon(type == '3' ? Icons.assignment_ind : Icons.touch_app,
...@@ -253,6 +291,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -253,6 +291,25 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
hintText: type == '3' ? '' : '请填写设备地址详细地址', hintText: type == '3' ? '' : '请填写设备地址详细地址',
controller: addressText, controller: addressText,
focusNode: addressFocusNode), focusNode: addressFocusNode),
Container(
alignment: Alignment.centerLeft,
margin: const EdgeInsets.only(left: 5, right: 5, top: 5),
padding: const EdgeInsets.only(
left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'当前设备的具体位置;例如:1号楼1单元左侧电梯',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
], ],
) )
], ],
...@@ -344,7 +401,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -344,7 +401,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
Container buildTopTitle(BuildContext context) { Container buildTopTitle(BuildContext context) {
return Container( return Container(
margin: const EdgeInsets.only(top: 50), margin: const EdgeInsets.only(top: 50, right: 30),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
...@@ -356,7 +413,8 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -356,7 +413,8 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
icon: const Icon(Icons.arrow_back, color: Colors.white), icon: const Icon(Icons.arrow_back, color: Colors.white),
iconSize: 30, iconSize: 30,
), ),
Column( Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
...@@ -384,6 +442,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -384,6 +442,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
), ),
], ],
), ),
),
], ],
), ),
); );
...@@ -401,7 +460,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> { ...@@ -401,7 +460,7 @@ class _EquipmentSettingsPageState extends State<EquipmentSettingsPage> {
String? subTitleText() { String? subTitleText() {
if (type == '1') { if (type == '1') {
return '我们将根据您填写的内容来为您【新建设备】'; return '我们将根据您填写的内容来为您【新建设备】\n注意:使用单位需【新建设备】,否则不会生成【日管控】【周排查】【月调度】任务';
} else if (type == '2') { } else if (type == '2') {
return '我们将根据您填写的内容来为您【修改设备】'; return '我们将根据您填写的内容来为您【修改设备】';
} else { } else {
......
...@@ -53,7 +53,11 @@ class _EquipmentListSCPageState extends State<EquipmentListSCPage> { ...@@ -53,7 +53,11 @@ class _EquipmentListSCPageState extends State<EquipmentListSCPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return EasyRefresh( return Stack(
children: [
Container(
margin: EdgeInsets.only(top: 20),
child: EasyRefresh(
firstRefresh: true, firstRefresh: true,
enableControlFinishRefresh: true, enableControlFinishRefresh: true,
// enableControlFinishLoad: true, // enableControlFinishLoad: true,
...@@ -76,6 +80,28 @@ class _EquipmentListSCPageState extends State<EquipmentListSCPage> { ...@@ -76,6 +80,28 @@ class _EquipmentListSCPageState extends State<EquipmentListSCPage> {
// getList(); // getList();
// }, // },
child: buildBody(), child: buildBody(),
),
),
Container(
alignment: Alignment.centerLeft,
height: 25,
margin: const EdgeInsets.only(left: 10, right: 10, top: 5),
padding: const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'小提示:生产单位无需【新建设备】.',
style: TextStyle(color: Colors.orange, fontSize: 12),
),
),
],
); );
} }
......
...@@ -50,7 +50,9 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> { ...@@ -50,7 +50,9 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
children: [ children: [
EasyRefresh( Container(
margin: const EdgeInsets.only(top: 20),
child: EasyRefresh(
firstRefresh: true, firstRefresh: true,
enableControlFinishRefresh: true, enableControlFinishRefresh: true,
// enableControlFinishLoad: true, // enableControlFinishLoad: true,
...@@ -73,6 +75,7 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> { ...@@ -73,6 +75,7 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> {
// }, // },
child: buildBody(), child: buildBody(),
), ),
),
if (isUnitRoles(StorageUtil.getInstance().getRoleNames())!) ...[ if (isUnitRoles(StorageUtil.getInstance().getRoleNames())!) ...[
Positioned( Positioned(
right: 20, right: 20,
...@@ -92,17 +95,40 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> { ...@@ -92,17 +95,40 @@ class _EquipmentListSYPageState extends State<EquipmentListSYPage> {
} }
}); });
}, },
width: 60, width: 70,
height: 60, height: 70,
borderRadius: const BorderRadius.all(Radius.circular(360)), borderRadius: const BorderRadius.all(Radius.circular(360)),
disable: false, disable: false,
colors: const [ColorConst.blueColor, ColorConst.blue1Color], colors: const [
ColorConst.orangeColor,
ColorConst.orange2Color
],
child: const Text( child: const Text(
"新建\n设备", "新建\n设备",
style: style:
TextStyle(fontSize: 14, color: ColorConst.whiteColor), TextStyle(fontSize: 16, color: ColorConst.whiteColor),
))), ))),
), ),
Container(
alignment: Alignment.centerLeft,
height: 25,
margin: const EdgeInsets.only(left: 10, right: 10, top: 5),
padding:
const EdgeInsets.only(left: 5, right: 5, top: 3, bottom: 3),
decoration: BoxDecoration(
color: Colors.orange[50],
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(5),
topRight: Radius.circular(5),
bottomLeft: Radius.circular(5),
bottomRight: Radius.circular(5)),
),
child: const Text(
softWrap: true,
'小提示:使用单位需要【新建设备】.',
style: TextStyle(color: Colors.orange, fontSize: 14),
),
),
] ]
], ],
); );
......
...@@ -95,19 +95,19 @@ class _UserListPageState extends State<UserListPage> { ...@@ -95,19 +95,19 @@ class _UserListPageState extends State<UserListPage> {
} }
}); });
}, },
width: 60, width: 70,
height: 60, height: 70,
borderRadius: borderRadius:
const BorderRadius.all(Radius.circular(360)), const BorderRadius.all(Radius.circular(360)),
disable: false, disable: false,
colors: const [ colors: const [
ColorConst.blueColor, ColorConst.orangeColor,
ColorConst.blue1Color ColorConst.orange2Color
], ],
child: const Text( child: const Text(
"新建\n用户", "新建\n用户",
style: TextStyle( style: TextStyle(
fontSize: 14, color: ColorConst.whiteColor), fontSize: 16, color: ColorConst.whiteColor),
))), ))),
), ),
] ]
...@@ -140,9 +140,9 @@ class _UserListPageState extends State<UserListPage> { ...@@ -140,9 +140,9 @@ class _UserListPageState extends State<UserListPage> {
// Get.toNamed(RouteString.USER_SETTINGS, arguments: '3'); // Get.toNamed(RouteString.USER_SETTINGS, arguments: '3');
}, },
child: Card( child: Card(
elevation: 2, elevation: 5,
margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0), margin: const EdgeInsets.only(left: 0, right: 0, top: 15, bottom: 0),
color: Colors.white, color: isItemRoleNames(roleNames(index))?ColorConst.orange1Color :Colors.white ,
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(10)), borderRadius: BorderRadius.all(Radius.circular(10)),
), ),
...@@ -211,8 +211,9 @@ class _UserListPageState extends State<UserListPage> { ...@@ -211,8 +211,9 @@ class _UserListPageState extends State<UserListPage> {
TextSpan( TextSpan(
text: roleNames(index), text: roleNames(index),
style: const TextStyle( style: const TextStyle(
fontSize: 13, fontWeight: FontWeight.bold,
color: Colors.black54)), fontSize: 14,
color: Colors.black87)),
])), ])),
), ),
], ],
......
import 'package:shared_preferences/shared_preferences.dart';
import 'package:special_equipment_flutter/model/user_bo.dart';
///数据库相关的工具
class SPAccountUtil {
static const String ACCOUNT_NUMBER = "account_number";
static const String USERNAME = "username";
static const String PASSWORD = "password";
///删掉单个账号
static void delUser(UserBo user, index) async {
SharedPreferences sp = await SharedPreferences.getInstance();
List<UserBo> list = await getUsers();
// list.remove(user);
list.removeAt(index);
saveUsers(list, sp);
}
///保存账号,如果重复,就将最近登录账号放在第一个
static void saveUser(UserBo user) async {
SharedPreferences sp = await SharedPreferences.getInstance();
List<UserBo> list = await getUsers();
addNoRepeat(list, user);
saveUsers(list, sp);
}
///去重并维持次序
static void addNoRepeat(List<UserBo> users, UserBo user) {
for (int i = 0; i < users.length; i++) {
if (users[i].account == user.account) {
users.removeAt(i);
}
}
users.insert(0, user);
}
///获取已经登录的账号列表
static Future<List<UserBo>> getUsers() async {
List<UserBo> list = [];
SharedPreferences sp = await SharedPreferences.getInstance();
int num = sp.getInt(ACCOUNT_NUMBER) ?? 0;
for (int i = 0; i < num; i++) {
String? username = sp.getString("$USERNAME$i");
String? password = sp.getString("$PASSWORD$i");
list.add(UserBo(username, password));
}
return list;
}
///保存账号列表
static saveUsers(List<UserBo> users, SharedPreferences sp) {
sp.clear();
int size = users.length;
for (int i = 0; i < size; i++) {
sp.setString("$USERNAME$i", users[i].account!);
sp.setString("$PASSWORD$i", users[i].password!);
}
sp.setInt(ACCOUNT_NUMBER, size);
}
}
import 'dart:convert';
import 'package:get_storage/get_storage.dart'; import 'package:get_storage/get_storage.dart';
import 'package:special_equipment_flutter/ui/common/data.dart'; import 'package:special_equipment_flutter/model/user_bo.dart';
import 'package:special_equipment_flutter/utils/string_utils.dart'; import 'package:special_equipment_flutter/utils/string_utils.dart';
class SpKeys { class SpKeys {
static const USER_NAME = "spUserName"; static const USER_NAME = "spUserName";
static const PASSWORD = "spPassword";
static const NAME = "spName"; static const NAME = "spName";
static const JSESSION_ID = "spJsessionId"; static const JSESSION_ID = "spJsessionId";
static const USER_ID = "spUserId"; static const USER_ID = "spUserId";
...@@ -19,6 +22,10 @@ class SpKeys { ...@@ -19,6 +22,10 @@ class SpKeys {
///拍照位置 ///拍照位置
static const CAMERA_ADDRESS = "camera_address"; static const CAMERA_ADDRESS = "camera_address";
static const ACCOUNT_NUMBER = "account_number";
static const ACCOUNT = "account";
static const PASSWORDS = "password";
} }
class StorageUtil { class StorageUtil {
...@@ -77,6 +84,11 @@ class StorageUtil { ...@@ -77,6 +84,11 @@ class StorageUtil {
return userId; return userId;
} }
T getPassword<T>() {
var password = get(SpKeys.PASSWORD);
return password;
}
T getName<T>() { T getName<T>() {
var nickName = get(SpKeys.NAME); var nickName = get(SpKeys.NAME);
return nickName; return nickName;
...@@ -134,4 +146,37 @@ class StorageUtil { ...@@ -134,4 +146,37 @@ class StorageUtil {
return false; return false;
} }
} }
///删掉单个账号
// delUser(UserBo user) {
// List<UserBo> list = getUsers();
// list.remove(user);
// saveUsers(list);
// }
///保存账号,如果重复,就将最近登录账号放在第一个
saveUser(UserBo user) {
List<UserBo>? userList = get(SpKeys.ACCOUNT_NUMBER);
userList ??= [];
bool isFlag = true;
for (int i = 0; i < userList.length; i++) {
if (userList[i].account == user.account) {
userList.removeAt(i);
isFlag = false;
}
}
if (isFlag) {
userList.add(user);
} else {
userList.insert(0, user);
}
set(SpKeys.ACCOUNT_NUMBER, userList);
}
getUserList<T>() {
List<UserBo>? userList = get(SpKeys.ACCOUNT_NUMBER);
userList ??= [];
return userList;
}
} }
//// ignore_for_file: non_constant_identifier_names, library_private_types_in_public_api, import_of_legacy_library_into_null_safe // ignore_for_file: non_constant_identifier_names, library_private_types_in_public_api, import_of_legacy_library_into_null_safe
//
//import 'package:flutter/material.dart'; import 'package:card_swiper/card_swiper.dart';
//import 'package:flutter_swiper/flutter_swiper.dart'; import 'package:flutter/material.dart';
// import 'package:special_equipment_flutter/dio/api.dart';
//class SlideBanner extends StatefulWidget {
// const SlideBanner({super.key}); import '../model/banner_list_bo.dart';
//
// @override class SlideBanner extends StatefulWidget {
// _SwiperPageState createState() => _SwiperPageState(); const SlideBanner({super.key, required this.bannerList});
//}
// final List<Data>? bannerList;
//class _SwiperPageState extends State<SlideBanner> {
@override
_SwiperPageState createState() => _SwiperPageState();
}
class _SwiperPageState extends State<SlideBanner> {
List<Map> imgList = [
{"url": "assets/images/image0.png"},
{"url": "assets/images/image1.png"},
{"url": "assets/images/image2.png"},
{"url": "assets/images/image3.png"},
{"url": "assets/images/image4.png"},
{"url": "assets/images/image5.png"},
];
// List<Map> imgList = [ // List<Map> imgList = [
// {"url": "assets/images/image0.png"}, // {
// {"url": "assets/images/image1.png"}, // "url":
// {"url": "assets/images/image2.png"}, // "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.aitecar.com%2Fwp-content%2Fuploads%2F2014%2F11%2F20141119113831dc84baa9b3e7d0c7a37a.jpg&refer=http%3A%2F%2Fcdn.aitecar.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264681&t=d919a7187f42bd7c0ac775ce08fc63bd"
// {"url": "assets/images/image3.png"}, // },
// {"url": "assets/images/image4.png"}, // {
// {"url": "assets/images/image5.png"}, // "url":
// ]; // "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8f57"
// // },
//// List<Map> imgList = [ // {
//// { // "url":
//// "url": // "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp4.itc.cn%2Fimages01%2F20211023%2F55209e5c4f324f2ba3a0a27e51c7486a.jpeg&refer=http%3A%2F%2Fp4.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264668&t=c0395ee14ae1b7674d3283c4ba4bb4bc"
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcdn.aitecar.com%2Fwp-content%2Fuploads%2F2014%2F11%2F20141119113831dc84baa9b3e7d0c7a37a.jpg&refer=http%3A%2F%2Fcdn.aitecar.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264681&t=d919a7187f42bd7c0ac775ce08fc63bd"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8f57"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fp4.itc.cn%2Fimages01%2F20211023%2F55209e5c4f324f2ba3a0a27e51c7486a.jpeg&refer=http%3A%2F%2Fp4.itc.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264668&t=c0395ee14ae1b7674d3283c4ba4bb4bc"
//// },
//// {
//// "url":
//// "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8Qf57"
//// },
//// ];
//
// @override
// Widget build(BuildContext context) {
// var MySwiperWidget = Swiper(
// itemBuilder: (BuildContext context, int index) {
// //每次循环遍历时,将i赋值给index
// return Image.asset(
// imgList[index]['url'],
// fit: BoxFit.fill,
// );
//// return Image.network(
//// imgList[index]['url'],
//// fit: BoxFit.fill,
//// );
// }, // },
// autoplay: true, // {
// duration: 300, // "url":
// itemCount: imgList.length, // "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fwww2.autoimg.cn%2Fchejiahaodfs%2Fg8%2FM12%2FA3%2F22%2Fautohomecar__ChwEmmDmZhSAUiI3AAHEf6vp_kw118.png&refer=http%3A%2F%2Fwww2.autoimg.cn&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1671264664&t=0a7d80e389aab22d6e724df0183e8Qf57"
//// layout: SwiperLayout.DEFAULT, // },
//// scale: 0.93, // ];
//// viewportFraction: 0.9,
// //指示器样式 @override
// pagination: const SwiperPagination( Widget build(BuildContext context) {
// alignment: Alignment.bottomRight, var MySwiperWidget = Swiper(
// builder: DotSwiperPaginationBuilder( itemBuilder: (BuildContext context, int index) {
// color: Colors.black54, //每次循环遍历时,将i赋值给index
// activeColor: Colors.white, // return Image.asset(
// size: 10, // imgList[index]['url'],
// activeSize: 12, // fit: BoxFit.fill,
// )), // );
// ); return Image.network(
// return Scaffold( '${Api.URL}special${widget.bannerList![index].advertisUrl!}',
// body: SizedBox( fit: BoxFit.fill,
// height: 200, );
// width: double.infinity, },
// child: MySwiperWidget, autoplay: true,
// )); duration: 2000,
// } autoplayDelay: 5000,
//} itemCount: widget.bannerList!.length,
// pagination: const SwiperPagination(
// builder: DotSwiperPaginationBuilder(
// color: Color(0xFFD39C7F), activeColor: Color(0xFFFF4646))),
// layout: SwiperLayout.DEFAULT,
// scale: 0.93,
// viewportFraction: 0.9,
//指示器样式
// pagination: const SwiperPagination(
// alignment: Alignment.bottomRight,
// builder: DotSwiperPaginationBuilder(
// color: Colors.black54,
// activeColor: Colors.white,
// size: 10,
// activeSize: 12,
// )),
);
return Scaffold(
body: SizedBox(
height: 200,
width: double.infinity,
child: MySwiperWidget,
));
}
}
import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';
import 'package:special_equipment_flutter/dio/api.dart';
import '../model/banner_list_bo.dart';
//layouts swiper
class CardSwiper extends StatefulWidget {
const CardSwiper({super.key, required this.bannerList});
final List<Data>? bannerList;
@override
_CardSwiperState createState() => _CardSwiperState();
}
class _CardSwiperState extends State<CardSwiper> {
// List<Map> banner = [
// {"url": "assets/banner/banner1.jpg"},
// {"url": "assets/banner/banner2.jpg"},
// {"url": "assets/banner/banner1.jpg"}
// ];
@override
Widget build(BuildContext context) {
return SizedBox(
height: 230,
child: Swiper(
itemBuilder: (BuildContext context, int index) {
// return Image.asset(
// widget.bannerList[index].advertisUrl,
// fit: BoxFit.fill,
// );
return Image.network(
'${Api.URL}special${widget.bannerList![index].advertisUrl!}',
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) {
return Image.asset('assets/day/no_data_icon.png');
},
);
},
onTap: (index) {
print(index);
},
itemCount: widget.bannerList!.length,
pagination: const SwiperPagination(
builder: DotSwiperPaginationBuilder(
color: Color(0xFFD39C7F), activeColor: Color(0xFFFF4646))),
// loop: false,
autoplay: true,
duration: 2000,
autoplayDelay: 5000
// viewportFraction: 0.8,
// scale: 0.9,
),
);
}
}
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class NumChangeWidget extends StatefulWidget {
final double height;
int num;
final ValueChanged<int> onValueChanged;
final bool disabled;
NumChangeWidget(
{Key? key,
this.height = 25.0,
this.num = 0,
this.disabled = false,
required this.onValueChanged})
: super(key: key);
@override
_NumChangeWidgetState createState() {
return _NumChangeWidgetState();
}
}
class _NumChangeWidgetState extends State<NumChangeWidget> {
TextEditingController _numcontroller = TextEditingController();
@override
void initState() {
super.initState();
_numcontroller.addListener(_onNumChange);
}
void _onNumChange() {
String text = _numcontroller.text;
if (text.isNotEmpty) {
String result = text.replaceAll(RegExp(r'^[0]+'), ''); // 去掉首位0的正则替换
if (result != '') {
widget.num = int.parse(result);
widget.onValueChanged(widget.num);
}
if (result != text) {
_numcontroller.selection =
TextSelection.fromPosition(TextPosition(offset: result.length));
}
}
}
@override
Widget build(BuildContext context) {
_numcontroller.text = widget.num.toString();
return Container(
height: widget.height,
decoration: const BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(2.0)),
color: Colors.black54),
child: Row(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
GestureDetector(
onTap: _minusNum,
child: Container(
width: 25.0,
alignment: Alignment.center,
child: Icon(Icons.horizontal_rule_outlined,
color: widget.num == 0 || widget.disabled
? Color.fromRGBO(255, 255, 255, .4)
: Colors.white),
),
),
Container(
width: 0.5,
color: Colors.black54,
),
Container(
width: 32.0,
alignment: Alignment.center,
child: TextField(
controller: _numcontroller,
//TextEditingController,用于获取文本值
keyboardType: TextInputType.number,
//设置键盘为数字
textAlign: TextAlign.center,
// 内容左右居中
maxLines: 1,
decoration: const InputDecoration(
border: InputBorder.none,
contentPadding: EdgeInsets.only(bottom: 10),
),
inputFormatters: [
FilteringTextInputFormatter.digitsOnly, //设置只允许输入整数
],
style: TextStyle(fontSize: 16, color: Colors.white),
readOnly: widget.disabled),
),
Container(
width: 0.5,
color: Colors.black54,
),
GestureDetector(
onTap: _addNum,
child: Container(
width: 25.0,
alignment: Alignment.center,
child: Icon(
Icons.add_outlined,
color: widget.disabled
? const Color.fromRGBO(255, 255, 255, .4)
: Colors.white,
), // 设计图
),
),
],
),
);
}
void _minusNum() {
if (widget.num == 0 || widget.disabled) {
return;
}
setState(() {
widget.num -= 1;
if (widget.onValueChanged != null) {
widget.onValueChanged(widget.num);
}
});
}
void _addNum() {
if (widget.disabled) {
return;
}
setState(() {
widget.num += 1;
if (widget.onValueChanged != null) {
widget.onValueChanged(widget.num);
}
});
}
}
...@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev ...@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 1.0.6+6 version: 1.0.7+7
environment: environment:
sdk: '>=3.1.3 <4.0.0' sdk: '>=3.1.3 <4.0.0'
...@@ -57,7 +57,10 @@ dependencies: ...@@ -57,7 +57,10 @@ dependencies:
flutter_bmflocation: ^3.5.0 flutter_bmflocation: ^3.5.0
sliding_up_panel: ^2.0.0+1 sliding_up_panel: ^2.0.0+1
event_bus: ^2.0.0 event_bus: ^2.0.0
card_swiper: ^3.0.1
# pdf: ^3.11.0
# printing: ^5.12.0
# pdfx: ^2.6.0
# geolocator: ^7.1.0 # geolocator: ^7.1.0
# geocoding: ^2.1.1 # geocoding: ^2.1.1
...@@ -73,7 +76,7 @@ dependencies: ...@@ -73,7 +76,7 @@ dependencies:
# event_bus: ^2.0.0 # event_bus: ^2.0.0
# provider: ^6.0.5 # provider: ^6.0.5
# shake_animation_widget: ^3.0.3 # shake_animation_widget: ^3.0.3
# flutter_xupdate: ^2.0.0 # flutter_xupdate: ^0.0.2
dev_dependencies: dev_dependencies:
...@@ -100,7 +103,6 @@ flutter: ...@@ -100,7 +103,6 @@ flutter:
# To add assets to your application, add an assets section, like this: # To add assets to your application, add an assets section, like this:
assets: assets:
- assets/home/top_bg_icon.png
- assets/home/day_control_white_icon.png - assets/home/day_control_white_icon.png
- assets/home/monthly_scheduling_white_icon.png - assets/home/monthly_scheduling_white_icon.png
- assets/home/weekly_survey_white_icon.png - assets/home/weekly_survey_white_icon.png
...@@ -136,6 +138,9 @@ flutter: ...@@ -136,6 +138,9 @@ flutter:
- assets/examine/no_pass_icon.png - assets/examine/no_pass_icon.png
- assets/examine/examine_gary_icon.png - assets/examine/examine_gary_icon.png
- assets/examine/history_icon.png - assets/examine/history_icon.png
- assets/name.pdf
# An image asset can refer to one or more resolution-specific "variants", see # An image asset can refer to one or more resolution-specific "variants", see
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment