Browse Source

添加员工的弹窗,接口,添加的逻辑

liukai 7 months ago
parent
commit
00f7235998

+ 28 - 5
packages/cpt_job/lib/modules/job_applied/job_applied_controller.dart

@@ -7,11 +7,11 @@ import 'package:plugin_platform/engine/notify/notify_engine.dart';
 import 'package:plugin_platform/engine/toast/toast_engine.dart';
 import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
 import 'package:shared/utils/date_time_utils.dart';
-import 'package:shared/utils/log_utils.dart';
 import 'package:widgets/dialog/app_default_dialog.dart';
 import 'package:widgets/load_state_layout.dart';
 import 'package:widgets/widget_export.dart';
 
+import '../../widget/applied_add_staff.dart';
 import '../../widget/applied_butch_modify.dart';
 import '../applied_workflow/applied_workflow_page.dart';
 import 'job_applied_state.dart';
@@ -160,7 +160,31 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
 
   /// 展示添加员工的弹窗
   void showAddStaffDialog() {
-    ToastEngine.show("展示添加员工的弹窗");
+    DialogEngine.show(
+      widget: AppliedAddStaff(
+        jobId: state.jobId!,
+        confirmAction: (selectedIds) {
+          //调用接口添加员工
+          _requestAddStaff2Applied(selectedIds);
+        },
+      ),
+    );
+  }
+
+  //调用接口添加员工
+  void _requestAddStaff2Applied(String selectedIds) async {
+    var result = await _jobRepository.addStaff2Job(state.jobId, selectedIds, cancelToken: cancelToken);
+
+    if (result.isSuccess) {
+      NotifyEngine.showSuccess("Successful".tr);
+
+      //添加成功之后刷新页面
+      refreshController.callRefresh();
+
+    } else {
+      ToastEngine.show(result.errorMsg ?? "Network Load Error".tr);
+      return;
+    }
   }
 
   /// 去编辑员工信息页面
@@ -179,7 +203,6 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
         widget: AppliedStaffReviews(
           appliedReviews: result.data!,
           confirmAction: (attitudeRate, performanceRate, experienceRate, groomingRate, content) async {
-
             //请求接口,提交评论
             var submitResult = await _jobRepository.remarkAppliedSingleStaffSubmit(
               data.appliedId.toString(),
@@ -232,7 +255,7 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
               selectedStartDate: DateTimeUtils.getDateTime(state.jobInfo?.startTime ?? ""),
               selectedEndDate: DateTimeUtils.getDateTime(state.jobInfo?.endTime ?? ""),
               confirmAction: (start, end) {
-                requestBatchModify(start, end, separatedIds);
+                _requestBatchModify(start, end, separatedIds);
               }));
     } else {
       ToastEngine.show("Please select the applied record".tr);
@@ -240,7 +263,7 @@ class JobAppliedController extends GetxController with DioCancelableMixin {
   }
 
   /// 执行批量修改的请求
-  void requestBatchModify(DateTime start, DateTime end, String separatedIds) async {
+  void _requestBatchModify(DateTime start, DateTime end, String separatedIds) async {
     //执行请求
     var result = await _jobRepository.batchEditStaffCheckTime(
       state.jobId,

+ 2 - 2
packages/cpt_job/lib/modules/job_applied/job_applied_page.dart

@@ -174,7 +174,7 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                       fontSize: 17,
                       isFontMedium: true,
                       boxHeight: 48,
-                      onClick: (){
+                      onClick: () {
                         controller.operationApprove();
                       },
                       alignment: Alignment.center,
@@ -189,7 +189,7 @@ class _JobAppliedState extends BaseState<JobAppliedPage, JobAppliedController> {
                       fontSize: 17,
                       isFontMedium: true,
                       boxHeight: 48,
-                      onClick: (){
+                      onClick: () {
                         controller.showBatchModifyDialog();
                       },
                       alignment: Alignment.center,

+ 347 - 0
packages/cpt_job/lib/widget/applied_add_staff.dart

@@ -0,0 +1,347 @@
+import 'dart:ui';
+
+import 'package:cs_resources/generated/assets.dart';
+import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
+import 'package:domain/entity/response/job_list_remark_view_entity.dart';
+import 'package:flutter/cupertino.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/widgets.dart';
+import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
+import 'package:get/get.dart';
+import 'package:plugin_platform/engine/toast/toast_engine.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:shared/utils/util.dart';
+import 'package:widgets/ext/ex_widget.dart';
+import 'package:cs_resources/constants/color_constants.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/my_load_image.dart';
+import 'package:widgets/my_text_view.dart';
+import 'package:widgets/search_app_bar.dart';
+import 'package:widgets/shatter/rating_widget.dart';
+import 'package:widgets/widget_export.dart';
+
+import 'applied_add_staff_controller.dart';
+
+/**
+ * 添加员工的弹窗
+ */
+class AppliedAddStaff extends StatefulWidget {
+  String jobId;
+  void Function(String selectIds)? confirmAction;
+
+  AppliedAddStaff({required this.jobId, this.confirmAction});
+
+  @override
+  State<AppliedAddStaff> createState() => _AppliedAddStaffState();
+}
+
+class _AppliedAddStaffState extends State<AppliedAddStaff> {
+  @override
+  void initState() {
+    super.initState();
+    Get.put(AppliedAddStaffController());
+  }
+
+  @override
+  void dispose() {
+    super.dispose();
+    Get.delete<AppliedAddStaffController>();
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return GetBuilder<AppliedAddStaffController>(
+      assignId: true,
+      builder: (controller) {
+        return Container(
+          width: 300,
+          height: 555,
+          decoration: BoxDecoration(
+            color: Color(0XFFF7F7F7),
+            borderRadius: const BorderRadius.all(Radius.circular(15)),
+          ),
+          child: Column(
+            crossAxisAlignment: CrossAxisAlignment.start,
+            children: [
+              Center(
+                child: MyTextView(
+                  "Choose Staff".tr,
+                  fontSize: 19,
+                  isFontMedium: true,
+                  textColor: ColorConstants.black,
+                  marginTop: 22,
+                  marginBottom: 15,
+                  marginLeft: 22,
+                  marginRight: 22,
+                ),
+              ),
+
+              SearchAppBar(
+                value: controller.keyword,
+                searchBarHeight: 38,
+                searchBarBgColor: Colors.white,
+                searchBarBorderRadius: 15,
+                searchBarBorder: Border.all(
+                  color: Color(0XFFC3C3C3), // 设置边框颜色为灰色
+                  width: 0.5, // 设置边框宽度
+                ),
+                textHintColor: Color(0XFFAFB3B7),
+                textColor: ColorConstants.black33,
+                onSearch: (keyword) {
+                  controller.doSearch(keyword);
+                },
+                hintText: "Staff Name".tr,
+                controller: controller.searchController,
+              ).marginOnly(left: 16.5, right: 1.5, bottom: 15.5),
+
+              Container(
+                color: Colors.white,
+                child: EasyRefresh(
+                  header: ClassicHeader(
+                    dragText: 'Pull to refresh'.tr,
+                    armedText: 'Release ready'.tr,
+                    readyText: 'Refreshing...'.tr,
+                    processingText: 'Refreshing...'.tr,
+                    processedText: 'Succeeded'.tr,
+                    noMoreText: 'No more'.tr,
+                    failedText: 'Failed'.tr,
+                    messageText: 'Last updated at %T'.tr,
+                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                    iconTheme: const IconThemeData(color: ColorConstants.black66),
+                    backgroundColor: Colors.transparent,
+                  ),
+                  footer: ClassicFooter(
+                    dragText: 'Pull to load'.tr,
+                    armedText: 'Release ready'.tr,
+                    readyText: 'Loading...'.tr,
+                    processingText: 'Loading...'.tr,
+                    processedText: 'Succeeded'.tr,
+                    noMoreText: 'No more'.tr,
+                    failedText: 'Failed'.tr,
+                    showMessage: false,
+                    triggerOffset: 50,
+                    iconDimension: 22,
+                    textStyle: const TextStyle(color: ColorConstants.black66, fontSize: 14),
+                    messageStyle: const TextStyle(color: ColorConstants.black66, fontSize: 12),
+                    iconTheme: const IconThemeData(color: ColorConstants.black66),
+                    backgroundColor: Colors.transparent,
+                  ),
+                  controller: controller.refreshController,
+                  onRefresh: controller.onRefresh,
+                  onLoad: controller.loadMore,
+                  child: LoadStateLayout(
+                    themeColor: ColorConstants.black66,
+                    state: controller.loadingState,
+                    errorMessage: controller.errorMessage,
+                    errorRetry: () {
+                      controller.retryRequest();
+                    },
+                    successSliverWidget: [
+                      SliverList(
+                          delegate: SliverChildBuilderDelegate(
+                        (context, index) {
+                          return _buildStaffItem(controller.datas[index], () {
+                            /// Item选中与未选中设置
+                            controller.datas[index].isSelected = !controller.datas[index].isSelected;
+                            controller.update();
+                          });
+                        },
+                        childCount: controller.datas.length,
+                      ))
+                    ],
+                  ),
+                ),
+              ).expanded(),
+
+              //按钮组
+              Row(
+                children: [
+                  //取消按钮
+                  Expanded(
+                      flex: 1,
+                      child: InkWell(
+                        onTap: () {
+                          onCancel();
+                        },
+                        child: MyTextView(
+                          "Cancel".tr,
+                          fontSize: 17.5,
+                          isFontMedium: true,
+                          textAlign: TextAlign.center,
+                          textColor: Color(0XFF0085C4),
+                          cornerRadius: 3,
+                          borderWidth: 1,
+                        ),
+                      )),
+
+                  //垂直分割线
+                  Container(
+                    color: Color(0xff09141F).withOpacity(0.13),
+                    width: 0.5,
+                  ),
+
+                  //同意按钮
+                  Expanded(
+                      flex: 1,
+                      child: InkWell(
+                        onTap: () {
+                          doCallbackAction(controller);
+                        },
+                        child: MyTextView(
+                          "Submit".tr,
+                          marginLeft: 10,
+                          fontSize: 17.5,
+                          isFontMedium: true,
+                          textAlign: TextAlign.center,
+                          textColor: Color(0XFF0085C4),
+                          cornerRadius: 3,
+                        ),
+                      )),
+                ],
+              ).constrained(height: 46),
+            ],
+          ),
+        );
+      },
+    );
+  }
+
+  //取消弹框
+  void onCancel() async {
+    SmartDialog.dismiss();
+  }
+
+  //执行回调
+  void doCallbackAction(AppliedAddStaffController controller) {
+    onCancel();
+
+    //找到当前选中的
+    var selectedList = controller.datas.where((element) => element.isSelected).toList(growable: false);
+    if (selectedList.isNotEmpty) {
+      var ids = selectedList.map((e) => e.id.toString()).toList(growable: false);
+      String separatedIds = ids.join(',');
+
+      widget.confirmAction?.call(separatedIds);
+    }
+
+  }
+
+  Widget _buildStaffItem(JobListAppliedStaffSearchRows item, VoidCallback callback) {
+    return Stack(
+      children: [
+        Column(
+          children: [
+            //姓名
+            Row(
+              children: [
+                MyTextView(
+                  "Staff:",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  marginRight: 3,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.name ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+              ],
+            ),
+
+            //头像
+            Row(
+              children: [
+                MyTextView(
+                  "Avatar:",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  marginRight: 3,
+                  isFontRegular: true,
+                ),
+                MyLoadImage(
+                  item.avatar ?? "",
+                  width: 25,
+                  height: 25,
+                ),
+              ],
+            ).marginOnly(top: 5),
+
+            //性别
+            Row(
+              children: [
+                MyTextView(
+                  "Gender:",
+                  marginRight: 3,
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.sex ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+              ],
+            ).marginOnly(top: 5),
+
+            //身份证
+            Row(
+              children: [
+                MyTextView(
+                  "NRIC:",
+                  marginRight: 3,
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.nric ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+              ],
+            ).marginOnly(top: 5),
+
+            //电话
+            Row(
+              children: [
+                MyTextView(
+                  "Phone:",
+                  marginRight: 3,
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+                MyTextView(
+                  item.phone ?? "-",
+                  textColor: ColorConstants.black66,
+                  fontSize: 13,
+                  isFontRegular: true,
+                ),
+              ],
+            ).marginOnly(top: 5),
+
+            Container(
+              margin: EdgeInsets.only(top: 19),
+              width: double.infinity,
+              height: 1,
+              color: Color(0XFFF7F7F7),
+            )
+          ],
+        ).paddingOnly(left: 19, right: 20, top: 17),
+
+        //是否勾选
+        MyAssetImage(
+          item.isSelected ? Assets.baseServiceItemSelectedIcon : Assets.baseServiceItemUnselectedGrayIcon,
+          width: 20.5,
+          height: 20.5,
+        ).alignRight().marginOnly(right: 20, top: 17.5),
+      ],
+    ).onTap(callback);
+  }
+}

+ 131 - 0
packages/cpt_job/lib/widget/applied_add_staff_controller.dart

@@ -0,0 +1,131 @@
+import 'package:domain/entity/response/job_list_applied_staff_search_entity.dart';
+import 'package:domain/repository/job_repository.dart';
+import 'package:flutter/material.dart';
+import 'package:plugin_basic/basic_export.dart';
+import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
+import 'package:shared/utils/log_utils.dart';
+import 'package:widgets/load_state_layout.dart';
+import 'package:widgets/widget_export.dart';
+
+class AppliedAddStaffController extends GetxController with DioCancelableMixin {
+  final JobRepository _jobRepository = Get.find();
+
+  TextEditingController searchController = TextEditingController();
+
+  var _curPage = 1;
+  var _needShowPlaceholder = true;
+
+  //页面PlaceHolder的展示
+  LoadState loadingState = LoadState.State_Success;
+  String? errorMessage;
+
+  String keyword = "";
+  String? jobId = null;
+  List<JobListAppliedStaffSearchRows> datas = [];
+
+  //刷新页面状态
+  void changeLoadingState(LoadState state) {
+    loadingState = state;
+    update();
+  }
+
+  // Refresh 控制器
+  final EasyRefreshController refreshController = EasyRefreshController(
+    controlFinishRefresh: true,
+    controlFinishLoad: true,
+  );
+
+  // Refresh 刷新事件
+  Future onRefresh() async {
+    _curPage = 1;
+    fetchAllStaffList();
+  }
+
+  // Refresh 加载事件
+  Future loadMore() async {
+    _curPage++;
+    fetchAllStaffList();
+  }
+
+  // 重试请求
+  Future retryRequest() async {
+    _curPage = 1;
+    _needShowPlaceholder = true;
+    fetchAllStaffList();
+  }
+
+  /// 获取列表数据
+  Future fetchAllStaffList() async {
+    if (_needShowPlaceholder) {
+      changeLoadingState(LoadState.State_Loading);
+    }
+
+    // 获取 Staff 列表
+    var listResult = await _jobRepository.searchStaffList(
+      jobId,
+      keyword,
+      curPage: _curPage,
+      cancelToken: cancelToken,
+    );
+
+    // 处理数据
+    if (listResult.isSuccess) {
+      handleList(listResult.data?.rows);
+    } else {
+      errorMessage = listResult.errorMsg;
+      changeLoadingState(LoadState.State_Error);
+    }
+
+    // 最后赋值
+    _needShowPlaceholder = false;
+  }
+
+  // 处理数据与展示的逻辑
+  void handleList(List<JobListAppliedStaffSearchRows>? list) {
+    if (list != null && list.isNotEmpty) {
+      //有数据,判断是刷新还是加载更多的数据
+      if (_curPage == 1) {
+        //刷新的方式
+        datas.clear();
+        datas.addAll(list);
+        refreshController.finishRefresh();
+
+        //更新展示的状态
+        changeLoadingState(LoadState.State_Success);
+      } else {
+        //加载更多
+        datas.addAll(list);
+        refreshController.finishLoad();
+        update();
+      }
+    } else {
+      if (_curPage == 1) {
+        //展示无数据的布局
+        datas.clear();
+        changeLoadingState(LoadState.State_Empty);
+        refreshController.finishRefresh();
+      } else {
+        //展示加载完成,没有更多数据了
+        refreshController.finishLoad(IndicatorResult.noMore);
+      }
+    }
+  }
+
+  //搜索
+  void doSearch(String keyword) {
+    this.keyword = keyword;
+    refreshController.callRefresh();
+  }
+
+  @override
+  void onReady() {
+    super.onReady();
+    fetchAllStaffList();
+  }
+
+  @override
+  void onClose() {
+    datas.clear();
+    super.onClose();
+  }
+}

+ 1 - 0
packages/cs_domain/lib/entity/response/job_list_applied_staff_search_entity.dart

@@ -30,6 +30,7 @@ class JobListAppliedStaffSearchRows {
 	String? avatar = null;
 	@JSONField(name: "apply_state")
 	int applyState = 0;
+	bool isSelected = false;
 
 	JobListAppliedStaffSearchRows();
 

+ 8 - 1
packages/cs_domain/lib/generated/json/job_list_applied_staff_search_entity.g.dart

@@ -63,6 +63,10 @@ JobListAppliedStaffSearchRows $JobListAppliedStaffSearchRowsFromJson(Map<String,
   if (applyState != null) {
     jobListAppliedStaffSearchRows.applyState = applyState;
   }
+  final bool? isSelected = jsonConvert.convert<bool>(json['isSelected']);
+  if (isSelected != null) {
+    jobListAppliedStaffSearchRows.isSelected = isSelected;
+  }
   return jobListAppliedStaffSearchRows;
 }
 
@@ -75,6 +79,7 @@ Map<String, dynamic> $JobListAppliedStaffSearchRowsToJson(JobListAppliedStaffSea
   data['nric'] = entity.nric;
   data['avatar'] = entity.avatar;
   data['apply_state'] = entity.applyState;
+  data['isSelected'] = entity.isSelected;
   return data;
 }
 
@@ -87,6 +92,7 @@ extension JobListAppliedStaffSearchRowsExtension on JobListAppliedStaffSearchRow
     String? nric,
     String? avatar,
     int? applyState,
+    bool? isSelected,
   }) {
     return JobListAppliedStaffSearchRows()
       ..id = id ?? this.id
@@ -95,6 +101,7 @@ extension JobListAppliedStaffSearchRowsExtension on JobListAppliedStaffSearchRow
       ..phone = phone ?? this.phone
       ..nric = nric ?? this.nric
       ..avatar = avatar ?? this.avatar
-      ..applyState = applyState ?? this.applyState;
+      ..applyState = applyState ?? this.applyState
+      ..isSelected = isSelected ?? this.isSelected;
   }
 }

+ 1 - 1
packages/cs_domain/lib/repository/job_repository.dart

@@ -308,7 +308,7 @@ class JobRepository extends GetxService {
     //参数
     Map<String, String> params = {};
     params["cur_page"] = curPage.toString();
-    params["page_size"] = "20";
+    params["page_size"] = "10";
 
     if (!Utils.isEmpty(jobId)) {
       params["job_id"] = jobId!;

BIN
packages/cs_resources/assets/base_service/item_unselected_gray_icon.webp


+ 1 - 0
packages/cs_resources/lib/generated/assets.dart

@@ -10,6 +10,7 @@ class Assets {
   static const String baseLibWhiteBack = 'assets/base_lib/white_back.webp';
   static const String baseServiceDialogDeleteIcon = 'assets/base_service/dialog_delete_icon.webp';
   static const String baseServiceItemSelectedIcon = 'assets/base_service/item_selected_icon.webp';
+  static const String baseServiceItemUnselectedGrayIcon = 'assets/base_service/item_unselected_gray_icon.webp';
   static const String baseServiceItemUnselectedIcon = 'assets/base_service/item_unselected_icon.webp';
   static const String baseServicePageLoadError = 'assets/base_service/page_load_error.webp';
   static const String baseServicePageNoData = 'assets/base_service/page_no_data.webp';

+ 1 - 0
packages/cs_resources/lib/local/language/en_US.dart

@@ -125,6 +125,7 @@ const Map<String, String> en_US = {
   'Grooming': 'Grooming',
   'Enter...': 'Enter...',
   'Please Enter Remark': 'Please Enter Remark',
+  'Choose Staff': 'Choose Staff',
 
   //插件的国际化
   'Pull to refresh': 'Pull to refresh',

+ 1 - 0
packages/cs_resources/lib/local/language/zh_CN.dart

@@ -125,6 +125,7 @@ const Map<String, String> zh_CN = {
   'Grooming': '着装',
   'Enter...': '请输入...',
   'Please Enter Remark': '请输入评论内容',
+  'Choose Staff': '选择员工',
 
   //插件的国际化
   'Pull to refresh': '下拉刷新',

+ 6 - 4
packages/cs_widgets/lib/load_state_layout.dart

@@ -14,6 +14,7 @@ class LoadStateLayout extends StatefulWidget {
   final Widget? successWidget; //成功视图
   final List<SliverMultiBoxAdaptorWidget>? successSliverWidget; //成功的滚动视图
   final VoidCallback? errorRetry; //错误事件处理
+  final Color? themeColor;
   String? errorMessage;
 
   LoadStateLayout({
@@ -23,6 +24,7 @@ class LoadStateLayout extends StatefulWidget {
     this.successSliverWidget, //成功的滚动布局(二选一)
     this.errorMessage, //错误的信息展示
     this.errorRetry, //错误重试的事件
+    this.themeColor, //主题颜色,Loading,文本颜色
   }) : super(key: key);
 
   @override
@@ -115,13 +117,13 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
         children: [
           CircularProgressIndicator(
             strokeWidth: 3,
-            valueColor: AlwaysStoppedAnimation(Color(0XFFD6E9F1)),
+            valueColor: AlwaysStoppedAnimation(widget.themeColor ?? Color(0XFFD6E9F1)),
           ),
           MyTextView(
             'Loading...'.tr,
             marginTop: 15,
             fontSize: 14,
-            textColor: Color(0XFFD6E9F1),
+            textColor: widget.themeColor ?? Color(0XFFD6E9F1),
           )
         ],
       ),
@@ -147,7 +149,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
                   widget.errorMessage ?? 'Data loading failed! Please refresh and try again'.tr,
                   marginTop: 18,
                   fontSize: 14,
-                  textColor: Color(0XFFD6E9F1),
+                  textColor: widget.themeColor ?? Color(0XFFD6E9F1),
                 ),
               ],
             )));
@@ -170,7 +172,7 @@ class _LoadStateLayoutState extends State<LoadStateLayout> {
             'There is currently no content available'.tr,
             marginTop: 18,
             fontSize: 14,
-            textColor: Color(0XFFD6E9F1),
+            textColor: widget.themeColor ?? Color(0XFFD6E9F1),
           ),
         ],
       ),

+ 26 - 6
packages/cs_widgets/lib/search_app_bar.dart

@@ -1,3 +1,4 @@
+import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
 import 'package:get/get.dart';
@@ -17,6 +18,12 @@ class SearchAppBar extends StatefulWidget {
     this.actions = const [],
     this.hintText,
     this.onTap,
+    this.searchBarHeight = 35,
+    this.searchBarBorderRadius = 17.25,
+    this.searchBarBgColor,
+    this.textHintColor,
+    this.searchBarBorder,
+    this.textColor = Colors.white,
     this.onChanged,
     this.onSearch,
   }) : super(key: key);
@@ -34,6 +41,18 @@ class SearchAppBar extends StatefulWidget {
   // 输入框点击回调
   final VoidCallback? onTap;
 
+  double searchBarHeight;
+
+  double searchBarBorderRadius;
+
+  Color? searchBarBgColor;
+
+  Color? textHintColor;
+
+  Color textColor;
+
+  BoxBorder? searchBarBorder;
+
   String? value;
 
   // 输入框内容改变
@@ -93,12 +112,13 @@ class _SearchAppBarState extends State<SearchAppBar> {
   @override
   Widget build(BuildContext context) {
     return Container(
-      height: 35,
+      height: widget.searchBarHeight,
       padding: EdgeInsets.only(left: 15, right: 11),
       margin: EdgeInsets.only(right: 15),
       decoration: BoxDecoration(
-        color: Color(0xFF4DCFF6).withOpacity(0.2), // 设置背景颜色和不透明度
-        borderRadius: BorderRadius.circular(17.25), // 设置圆角
+        color: widget.searchBarBgColor ?? Color(0xFF4DCFF6).withOpacity(0.2), // 设置// 背景颜色和不透明度
+        borderRadius: BorderRadius.circular(widget.searchBarBorderRadius), // 设置圆角
+        border: widget.searchBarBorder,
       ),
       child: Row(
         mainAxisSize: MainAxisSize.max,
@@ -107,7 +127,7 @@ class _SearchAppBarState extends State<SearchAppBar> {
           //输入框
           IgnoreKeyboardDismiss(
             child: TextField(
-              cursorColor: ColorConstants.white,
+              cursorColor: widget.textColor,
               cursorWidth: 1.5,
               autofocus: false,
               maxLines: 1,
@@ -126,13 +146,13 @@ class _SearchAppBarState extends State<SearchAppBar> {
                 border: InputBorder.none,
                 hintText: widget.hintText,
                 hintStyle: TextStyle(
-                  color: hexToColor("#AECAE5"),
+                  color: widget.textHintColor ?? Color(0xFFAECAE5),
                   fontSize: 15.0,
                   fontWeight: FontWeight.w400,
                 ),
               ),
               style: TextStyle(
-                color: ColorConstants.white,
+                color: widget.textColor,
                 fontSize: 15.0,
                 fontWeight: FontWeight.w400,
               ),