Browse Source

refactor : 企业表单

dev
徐振升 2 weeks ago
parent
commit
6260db845c
  1. 2
      lib/app/core/routes/app_pages.dart
  2. 8
      lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart
  3. 10
      lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart
  4. 121
      lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart
  5. 8
      lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart
  6. 15
      lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart
  7. 246
      lib/app/features/enterprise/presentation/pages/enterprise_form_page.dart
  8. 5
      lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart
  9. 2
      lib/app/features/enterprise/presentation/pages/enterprise_list_page.dart
  10. 1
      lib/app/features/enterprise/presentation/widgets/enterprise_card.dart
  11. 257
      lib/app/features/enterprise/presentation/widgets/enterprise_form_view.dart

2
lib/app/core/routes/app_pages.dart

@ -1,5 +1,6 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/enterprise_form_page.dart';
import 'package:problem_check_system/app/features/navigation/presentation/bindings/navigation_binding.dart';
import 'package:problem_check_system/app/features/navigation/presentation/pages/navigation_page.dart';
@ -52,6 +53,7 @@ abstract class AppPages {
GetPage(
name: AppRoutes.enterpriseInfo,
page: () => const EnterpriseInfoPage(),
binding: EnterpriseInfoBinding(),
),
GetPage(
name: AppRoutes.enterpriseForm,

8
lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart

@ -5,7 +5,6 @@ import 'package:problem_check_system/app/core/services/database_service.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_local_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/datasources/enterprise_remote_data_source.dart';
import 'package:problem_check_system/app/features/enterprise/data/repositories_impl/enterprise_repository_impl.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/repositories/enterprise_repository.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart';
@ -15,12 +14,6 @@ import 'package:uuid/uuid.dart'; // 确保导入您的模型
class EnterpriseFormBinding extends Bindings {
@override
void dependencies() {
// 1. Enterprise
// - Get.arguments Enterprise
// - Get.arguments null
// - 使 as Enterprise?
final Enterprise? enterpriseToEdit = Get.arguments as Enterprise?;
Get.lazyPut<EnterpriseLocalDataSource>(
() => EnterpriseLocalDataSourceImpl(
databaseService: Get.find<DatabaseService>(),
@ -48,7 +41,6 @@ class EnterpriseFormBinding extends Bindings {
// 2. null Controller
Get.lazyPut<EnterpriseFormController>(
() => EnterpriseFormController(
initialData: enterpriseToEdit,
addEnterpriseUsecase: Get.find<AddEnterpriseUsecase>(),
editEnterpriseUsecase: Get.find<EditEnterpriseUsecase>(),
),

10
lib/app/features/enterprise/presentation/bindings/enterprise_info_binding.dart

@ -0,0 +1,10 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
class EnterpriseInfoBinding extends Bindings {
@override
void dependencies() {
// 2. null Controller
Get.lazyPut<EnterpriseFormController>(() => EnterpriseFormController());
}
}

121
lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart

@ -5,22 +5,38 @@ import 'package:problem_check_system/app/features/enterprise/domain/entities/ent
import 'package:problem_check_system/app/features/enterprise/domain/usecases/add_enterprise_usecase.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/editor_enterprise_usecase.dart';
enum FormMode {
///
add,
///
edit,
///
view,
}
class EnterpriseFormController extends GetxController {
//
final Enterprise? initialData;
final AddEnterpriseUsecase addEnterpriseUsecase;
final EditEnterpriseUsecase editEnterpriseUsecase;
final AddEnterpriseUsecase? addEnterpriseUsecase;
final EditEnterpriseUsecase? editEnterpriseUsecase;
final formKey = GlobalKey<FormState>();
Enterprise? enterprise;
///
final Rx<FormMode> formMode = FormMode.add.obs;
bool get isReadOnly {
return formMode.value == FormMode.view;
}
EnterpriseFormController({
this.initialData,
required this.addEnterpriseUsecase,
required this.editEnterpriseUsecase,
this.addEnterpriseUsecase,
this.editEnterpriseUsecase,
});
// --- ---
var isSubmitting = false.obs;
var isEditMode = false.obs;
var pageTitle = '新增企业'.obs;
final Rx<CompanyType?> selectedType = Rx<CompanyType?>(null);
final Rx<CompanyScope?> selectedScope = Rx<CompanyScope?>(null);
@ -39,44 +55,75 @@ class EnterpriseFormController extends GetxController {
@override
void onInit() {
super.onInit();
//
if (initialData != null) {
isEditMode.value = true;
pageTitle.value = '修改信息';
//
enterpriseNameController.text = initialData!.name;
enterpriseAddressController.text = initialData!.address ?? '';
contactPersonController.text = initialData!.contactPerson ?? '';
contactPhoneController.text = initialData!.contactPhone ?? '';
hazardSourceController.text = initialData!.majorHazardsDescription ?? '';
selectedType.value = CompanyType.values.firstWhereOrNull(
(e) => e.displayText == initialData!.type,
);
selectedScope.value = CompanyScope.values.firstWhereOrNull(
(e) => e.displayText == initialData!.scale,
);
} else {
isEditMode.value = false;
pageTitle.value = '新增企业';
// ()
if (Get.arguments is Map) {
final arguments = Get.arguments as Map;
//
if (arguments.containsKey('mode')) {
formMode.value = arguments['mode'];
}
//
if (arguments.containsKey('data')) {
enterprise = arguments['data'] as Enterprise;
populateForm();
}
updatePageTitle();
}
}
void updatePageTitle() {
switch (formMode.value) {
case FormMode.add:
pageTitle.value = '新增企业';
break;
case FormMode.edit:
pageTitle.value = '修改企业信息';
break;
case FormMode.view:
pageTitle.value = '查看企业信息';
break;
}
}
//
void populateForm() {
pageTitle.value = '修改信息';
//
enterpriseNameController.text = enterprise!.name;
enterpriseAddressController.text = enterprise!.address ?? '';
contactPersonController.text = enterprise!.contactPerson ?? '';
contactPhoneController.text = enterprise!.contactPhone ?? '';
hazardSourceController.text = enterprise!.majorHazardsDescription ?? '';
selectedType.value = CompanyType.values.firstWhereOrNull(
(e) => e.displayText == enterprise!.type,
);
selectedScope.value = CompanyScope.values.firstWhereOrNull(
(e) => e.displayText == enterprise!.scale,
);
}
//
void submitForm() {
if (formKey.currentState?.validate() ?? false) {
if (isEditMode.value) {
_updateEnterprise();
} else {
_createEnterprise();
switch (formMode.value) {
case FormMode.add:
_createEnterprise();
break;
case FormMode.edit:
_updateEnterprise();
break;
case FormMode.view:
return;
}
}
}
void _createEnterprise() async {
try {
if (addEnterpriseUsecase == null) return;
isSubmitting.value = true; //
await addEnterpriseUsecase(
await addEnterpriseUsecase!(
name: enterpriseNameController.text,
type: selectedType.value!.displayText,
address: enterpriseAddressController.text,
@ -99,8 +146,8 @@ class EnterpriseFormController extends GetxController {
}
void _updateEnterprise() async {
// initialData null
if (initialData == null) return;
// enterprise null
if (enterprise == null || editEnterpriseUsecase == null) return;
try {
// 1. UI ()
@ -109,7 +156,7 @@ class EnterpriseFormController extends GetxController {
// 2. UI
// 使 Usecase copyWith 便
// id, creationTime
final updatedEnterprise = initialData!.copyWith(
final updatedEnterprise = enterprise!.copyWith(
name: enterpriseNameController.text,
type: selectedType.value!.displayText,
address: enterpriseAddressController.text,
@ -120,7 +167,7 @@ class EnterpriseFormController extends GetxController {
);
// 3. EditEnterpriseUsecase
await editEnterpriseUsecase(updatedEnterprise);
await editEnterpriseUsecase!(updatedEnterprise);
// 4.
Get.back(result: true);

8
lib/app/features/enterprise/presentation/controllers/enterprise_info_controller.dart

@ -0,0 +1,8 @@
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
class EnterpriseInfoController extends GetxController {
EnterpriseInfoController({required this.enterpriseFormController});
final EnterpriseFormController enterpriseFormController;
}

15
lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart

@ -7,6 +7,7 @@ import 'package:problem_check_system/app/core/routes/app_routes.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';
import 'package:problem_check_system/app/features/enterprise/domain/usecases/get_enterprise_list_usecase.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
class EnterpriseListController extends GetxController {
// --- ---
@ -75,7 +76,7 @@ class EnterpriseListController extends GetxController {
Future<void> navigateToEditForm(Enterprise enterprise) async {
final result = await Get.toNamed(
AppRoutes.enterpriseForm,
arguments: enterprise, //
arguments: {'data': enterprise, 'mode': FormMode.edit}, //
);
if (result == true) {
refreshList(); //
@ -84,7 +85,10 @@ class EnterpriseListController extends GetxController {
///
Future<void> navigateToAddForm() async {
final result = await Get.toNamed(AppRoutes.enterpriseForm);
final result = await Get.toNamed(
AppRoutes.enterpriseForm,
arguments: {'mode': FormMode.add},
);
if (result == true) {
refreshList(); //
}
@ -99,8 +103,11 @@ class EnterpriseListController extends GetxController {
}
///
Future<void> navigateToEnterpriseInfoPage() async {
final result = await Get.toNamed(AppRoutes.enterpriseInfo);
Future<void> navigateToEnterpriseInfoPage(Enterprise enterprise) async {
final result = await Get.toNamed(
AppRoutes.enterpriseInfo,
arguments: {'data': enterprise, 'mode': FormMode.view},
);
if (result == true) {
refreshList(); //
}

246
lib/app/features/enterprise/presentation/pages/enterprise_form_page.dart

@ -1,8 +1,8 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_form_view.dart';
// ------------------- (View) -------------------
// 使 GetView 便访
@ -15,74 +15,11 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
backgroundColor: const Color(0xFFF5F5F5),
appBar: _buildAppBar(),
body: SafeArea(
child: Form(
key: controller.formKey,
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(
horizontal: 16.w,
vertical: 12.h,
),
child: Column(
children: [
buildTitleSection(title: '必填信息'),
SizedBox(height: 12.h),
_buildInfoSection(
children: [
_buildTextField(
label: '企业名称',
hint: '达拉特旗',
textController: controller.enterpriseNameController,
validator: (value) {
if (value == null || value.isEmpty) {
return '企业名称不能为空';
}
return null;
},
isRequired: true,
),
_buildCompanyTypeDropdown(),
],
),
SizedBox(height: 12.h),
buildTitleSection(title: '选填信息'),
SizedBox(height: 12.h),
_buildInfoSection(
children: [
_buildTextField(
label: '企业地址',
hint: '请输入企业地址',
textController:
controller.enterpriseAddressController,
),
_buildCompanyScopeDropdown(),
_buildTextField(
label: '联系人',
hint: '请输入联系人姓名',
textController: controller.contactPersonController,
),
_buildTextField(
label: '联系电话',
hint: '请输入联系电话',
textController: controller.contactPhoneController,
),
_buildTextField(
label: '有无重大危险源;重大危险源情况',
hint: '请输入有无重大危险源;重大危险源情况',
textController: controller.hazardSourceController,
hasDivider: false,
),
],
),
],
),
),
),
_buildBottomButtons(),
],
),
child: Column(
children: [
Expanded(child: EnterpriseFormView()),
_buildBottomButtons(),
],
),
),
);
@ -126,177 +63,6 @@ class EnterpriseFormPage extends GetView<EnterpriseFormController> {
);
}
Widget buildTitleSection({required String title}) {
return Row(
children: [
Container(width: 4.w, height: 16.h, color: Colors.blue),
SizedBox(width: 8.w),
Text(
title,
style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
),
],
);
}
// ( "必填信息")
Widget _buildInfoSection({required List<Widget> children}) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [...children],
),
);
}
//
Widget _buildTextField({
required String label,
required String hint,
required TextEditingController textController,
bool isRequired = false,
bool hasDivider = true,
String? Function(String?)? validator,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel(label, isRequired),
),
TextFormField(
controller: textController,
validator: validator,
decoration: InputDecoration(
hintText: hint,
hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
),
style: TextStyle(fontSize: 14.sp, color: Colors.black87),
),
if (hasDivider) const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
//
// []
Widget _buildCompanyTypeDropdown() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel('企业类型', true), // isRequired = true
),
// 使 Obx controller selectedType
Obx(
() => DropdownButtonFormField<CompanyType>(
initialValue: controller.selectedType.value,
validator: (value) {
if (value == null) {
return '请选择企业类型';
}
return null;
},
hint: Text(
'请选择企业类型',
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
),
isExpanded: true, //
decoration: const InputDecoration(
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
),
items: CompanyType.values.map((CompanyType type) {
return DropdownMenuItem<CompanyType>(
value: type,
child: Text(
type.displayText,
style: TextStyle(fontSize: 14.sp),
),
);
}).toList(),
onChanged: (CompanyType? newValue) {
controller.selectedType.value = newValue;
},
//
icon: const Icon(Icons.arrow_drop_down, color: Colors.grey),
),
),
const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
// []
Widget _buildCompanyScopeDropdown() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel('企业规模', false), // isRequired = false
),
Obx(
() => DropdownButtonFormField<CompanyScope>(
initialValue: controller.selectedScope.value,
hint: Text(
'请选择企业规模',
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
),
isExpanded: true,
decoration: const InputDecoration(
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
),
items: CompanyScope.values.map((CompanyScope scope) {
return DropdownMenuItem<CompanyScope>(
value: scope,
child: Text(
scope.displayText,
style: TextStyle(fontSize: 14.sp),
),
);
}).toList(),
onChanged: (CompanyScope? newValue) {
controller.selectedScope.value = newValue;
},
icon: const Icon(Icons.arrow_drop_down, color: Colors.grey),
),
),
const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
// ()
Widget _buildLabel(String label, bool isRequired) {
return RichText(
text: TextSpan(
style: TextStyle(fontSize: 14.sp, color: Colors.black87),
children: [
if (isRequired)
const TextSpan(
text: '* ',
style: TextStyle(color: Colors.red),
),
TextSpan(text: label),
],
),
);
}
//
Widget _buildBottomButtons() {
return Container(

5
lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart

@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_form_view.dart';
//
class EnterpriseInfoPage extends StatelessWidget {
@ -21,7 +22,7 @@ class EnterpriseInfoPage extends StatelessWidget {
body: const TabBarView(
children: [
Center(child: Text('企业问题列表')),
Center(child: Text('企业基本信息')),
EnterpriseFormView(),
],
),
),
@ -56,7 +57,7 @@ class EnterpriseInfoPage extends StatelessWidget {
title: TabBar(
isScrollable: false, // true: Tab的宽度由内容决定; false:
labelColor: Colors.white, // Tab
unselectedLabelColor: Colors.grey, // Tab
unselectedLabelColor: Colors.grey[300], // Tab
// labelStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.bold),
// unselectedLabelStyle: const TextStyle(fontSize: 17),
overlayColor: WidgetStateProperty.all(Colors.transparent),

2
lib/app/features/enterprise/presentation/pages/enterprise_list_page.dart

@ -218,7 +218,7 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
controller.navigateToEditForm(item.enterprise);
},
onViewProblems: () {
controller.navigateToEnterpriseInfoPage();
controller.navigateToEnterpriseInfoPage(item.enterprise);
},
),
);

1
lib/app/features/enterprise/presentation/widgets/enterprise_card.dart

@ -1,6 +1,5 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:intl/intl.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/sync_status.dart';
import 'package:problem_check_system/app/features/enterprise/domain/entities/enterprise_list_item.dart';

257
lib/app/features/enterprise/presentation/widgets/enterprise_form_view.dart

@ -0,0 +1,257 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
// "视图" Scaffold
class EnterpriseFormView extends GetView<EnterpriseFormController> {
const EnterpriseFormView({super.key});
@override
Widget build(BuildContext context) {
// Widget Form
return Form(
key: controller.formKey,
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h),
child: Column(
children: [
// --- ---
buildTitleSection(title: '必填信息'),
SizedBox(height: 12.h),
_buildInfoSection(
children: [
_buildTextField(
label: '企业名称',
hint: '达拉特旗',
textController: controller.enterpriseNameController,
validator: (value) {
if (value == null || value.isEmpty) {
return '企业名称不能为空';
}
return null;
},
isRequired: true,
),
_buildCompanyTypeDropdown(),
],
),
SizedBox(height: 12.h),
buildTitleSection(title: '选填信息'),
SizedBox(height: 12.h),
_buildInfoSection(
children: [
_buildTextField(
label: '企业地址',
hint: '请输入企业地址',
textController: controller.enterpriseAddressController,
),
_buildCompanyScopeDropdown(),
_buildTextField(
label: '联系人',
hint: '请输入联系人姓名',
textController: controller.contactPersonController,
),
_buildTextField(
label: '联系电话',
hint: '请输入联系电话',
textController: controller.contactPhoneController,
),
_buildTextField(
label: '有无重大危险源;重大危险源情况',
hint: '请输入有无重大危险源;重大危险源情况',
textController: controller.hazardSourceController,
hasDivider: false,
),
],
),
],
),
),
);
}
// --- UI的辅助方法都移到这里 ---
Widget buildTitleSection({required String title}) {
return Row(
children: [
Container(width: 4.w, height: 16.h, color: Colors.blue),
SizedBox(width: 8.w),
Text(
title,
style: TextStyle(fontSize: 16.sp, fontWeight: FontWeight.bold),
),
],
);
}
// ( "必填信息")
Widget _buildInfoSection({required List<Widget> children}) {
return Container(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [...children],
),
);
}
//
Widget _buildTextField({
required String label,
required String hint,
required TextEditingController textController,
bool isRequired = false,
bool hasDivider = true,
String? Function(String?)? validator,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel(label, isRequired),
),
TextFormField(
controller: textController,
readOnly: controller.isReadOnly,
validator: validator,
decoration: InputDecoration(
hintText: hint,
hintStyle: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
enabledBorder: controller.isReadOnly ? InputBorder.none : null,
focusedBorder: controller.isReadOnly ? InputBorder.none : null,
),
style: TextStyle(fontSize: 14.sp, color: Colors.black87),
),
if (hasDivider) const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
//
// []
Widget _buildCompanyTypeDropdown() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel('企业类型', true), // isRequired = true
),
// 使 Obx controller selectedType
Obx(
() => DropdownButtonFormField<CompanyType>(
initialValue: controller.selectedType.value,
validator: (value) {
if (value == null) {
return '请选择企业类型';
}
return null;
},
hint: Text(
'请选择企业类型',
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
),
isExpanded: true, //
decoration: const InputDecoration(
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
),
items: CompanyType.values.map((CompanyType type) {
return DropdownMenuItem<CompanyType>(
value: type,
child: Text(
type.displayText,
style: TextStyle(fontSize: 14.sp),
),
);
}).toList(),
onChanged: controller.isReadOnly
? null // null
: (CompanyType? newValue) {
controller.selectedType.value = newValue;
},
//
icon: controller.isReadOnly
? const SizedBox.shrink()
: const Icon(Icons.arrow_drop_down, color: Colors.grey),
),
),
const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
// []
Widget _buildCompanyScopeDropdown() {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel('企业规模', false), // isRequired = false
),
Obx(
() => DropdownButtonFormField<CompanyScope>(
initialValue: controller.selectedScope.value,
hint: Text(
'请选择企业规模',
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
),
isExpanded: true,
decoration: const InputDecoration(
border: InputBorder.none,
isDense: true,
contentPadding: EdgeInsets.zero,
),
items: CompanyScope.values.map((CompanyScope scope) {
return DropdownMenuItem<CompanyScope>(
value: scope,
child: Text(
scope.displayText,
style: TextStyle(fontSize: 14.sp),
),
);
}).toList(),
onChanged: controller.isReadOnly
? null // null
: (CompanyScope? newValue) {
controller.selectedScope.value = newValue;
},
icon: controller.isReadOnly
? const SizedBox.shrink()
: const Icon(Icons.arrow_drop_down, color: Colors.grey),
),
),
const Divider(height: 1, color: Color(0xFFF0F0F0)),
],
);
}
// ()
Widget _buildLabel(String label, bool isRequired) {
return RichText(
text: TextSpan(
style: TextStyle(fontSize: 14.sp, color: Colors.black87),
children: [
if (isRequired)
const TextSpan(
text: '* ',
style: TextStyle(color: Colors.red),
),
TextSpan(text: label),
],
),
);
}
}
Loading…
Cancel
Save