Browse Source

refactor : 使用清晰架构增加项目的可维护性与灵活性

dev
徐振升 18 hours ago
parent
commit
06688c6a93
  1. 22
      lib/app/bindings/initial_binding.dart
  2. 0
      lib/app/core/data/models/auth_model.dart
  3. 2
      lib/app/core/data/models/image_metadata_model.dart
  4. 0
      lib/app/core/data/models/image_status.dart
  5. 4
      lib/app/core/data/models/problem_model.dart
  6. 6
      lib/app/core/data/models/problem_sync_status.dart
  7. 0
      lib/app/core/data/models/server_problem.dart
  8. 0
      lib/app/core/data/models/server_problem.freezed.dart
  9. 0
      lib/app/core/data/models/server_problem.g.dart
  10. 0
      lib/app/core/data/models/user/organization.dart
  11. 0
      lib/app/core/data/models/user/page.dart
  12. 0
      lib/app/core/data/models/user/role.dart
  13. 0
      lib/app/core/data/models/user/user.dart
  14. 10
      lib/app/core/data/repositories/auth_repository.dart
  15. 6
      lib/app/core/data/repositories/file_repository.dart
  16. 0
      lib/app/core/data/repositories/image_repository.dart
  17. 4
      lib/app/core/data/repositories/image_repository_impl.dart
  18. 28
      lib/app/core/data/repositories/problem_repository.dart
  19. 4
      lib/app/core/data/services/http_provider.dart
  20. 0
      lib/app/core/data/services/network_status_service.dart
  21. 26
      lib/app/core/data/services/sqlite_service.dart
  22. 0
      lib/app/core/data/services/upgrader_service.dart
  23. 0
      lib/app/core/extensions/http_response_extension.dart
  24. 0
      lib/app/core/utils/constants/api_endpoints.dart
  25. 2
      lib/app/features/enterprise/data/model/enterprise_model.dart
  26. 21
      lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart
  27. 74
      lib/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart
  28. 36
      lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart
  29. 267
      lib/app/features/enterprise/presentation/views/enterprise_form_page.dart
  30. 121
      lib/app/features/enterprise/presentation/views/enterprise_list_page.dart
  31. 34
      lib/app/features/enterprise/presentation/widgets/enterprise_card.dart
  32. 7
      lib/app/routes/app_pages.dart
  33. 6
      lib/app/routes/app_routes.dart
  34. 4
      lib/main.dart
  35. 2
      lib/modules/auth/bindings/login_binding.dart
  36. 4
      lib/modules/auth/controllers/login_controller.dart
  37. 280
      lib/modules/enterprise_list/enterprise_list_page.dart
  38. 8
      lib/modules/home/bindings/home_binding.dart
  39. 2
      lib/modules/home/controllers/home_controller.dart
  40. 9
      lib/modules/home/views/home_page.dart
  41. 2
      lib/modules/my/bindings/change_password_binding.dart
  42. 2
      lib/modules/my/controllers/change_password_controller.dart
  43. 2
      lib/modules/my/controllers/my_controller.dart
  44. 4
      lib/modules/problem/bindings/problem_form_binding.dart
  45. 18
      lib/modules/problem/controllers/problem_controller.dart
  46. 10
      lib/modules/problem/controllers/problem_form_controller.dart
  47. 4
      lib/modules/problem/views/problem_list_page.dart
  48. 4
      lib/modules/problem/views/widgets/problem_card.dart

22
lib/app/bindings/initial_binding.dart

@ -1,14 +1,14 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:problem_check_system/data/providers/network_status_service.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/providers/sqlite_provider.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/data/repositories/file_repository.dart';
import 'package:problem_check_system/data/repositories/image_repository.dart';
import 'package:problem_check_system/data/repositories/image_repository_impl.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:problem_check_system/data/providers/upgrader_service.dart';
import 'package:problem_check_system/app/core/data/services/network_status_service.dart';
import 'package:problem_check_system/app/core/data/services/http_provider.dart';
import 'package:problem_check_system/app/core/data/services/sqlite_service.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/file_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/image_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/image_repository_impl.dart';
import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/core/data/services/upgrader_service.dart';
import 'package:uuid/uuid.dart';
class InitialBinding implements Bindings {
@ -23,7 +23,7 @@ class InitialBinding implements Bindings {
Get.put<GetStorage>(GetStorage(), permanent: true);
Get.put<Uuid>(Uuid(), permanent: true);
Get.put<HttpProvider>(HttpProvider());
Get.put<SQLiteProvider>(SQLiteProvider());
Get.put<SQLiteService>(SQLiteService());
Get.put<NetworkStatusService>(NetworkStatusService());
Get.put(UpgraderService());
}
@ -44,7 +44,7 @@ class InitialBinding implements Bindings {
);
Get.lazyPut<ProblemRepository>(
() => ProblemRepository(
sqliteProvider: Get.find<SQLiteProvider>(),
sqliteService: Get.find<SQLiteService>(),
httpProvider: Get.find<HttpProvider>(),
networkStatusService: Get.find<NetworkStatusService>(),
authRepository: Get.find(),

0
lib/data/models/auth_model.dart → lib/app/core/data/models/auth_model.dart

2
lib/data/models/image_metadata_model.dart → lib/app/core/data/models/image_metadata_model.dart

@ -1,5 +1,5 @@
// image_metadata_model.dart
import 'package:problem_check_system/data/models/image_status.dart';
import 'package:problem_check_system/app/core/data/models/image_status.dart';
class ImageMetadata {
final String localPath;

0
lib/data/models/image_status.dart → lib/app/core/data/models/image_status.dart

4
lib/data/models/problem_model.dart → lib/app/core/data/models/problem_model.dart

@ -1,7 +1,7 @@
import 'dart:convert';
import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
///
///

6
lib/data/models/problem_sync_status.dart → lib/app/core/data/models/problem_sync_status.dart

@ -1,7 +1,7 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
import 'package:uuid/uuid.dart';
enum ProblemSyncStatus {

0
lib/data/models/server_problem.dart → lib/app/core/data/models/server_problem.dart

0
lib/data/models/server_problem.freezed.dart → lib/app/core/data/models/server_problem.freezed.dart

0
lib/data/models/server_problem.g.dart → lib/app/core/data/models/server_problem.g.dart

0
lib/data/models/user/organization.dart → lib/app/core/data/models/user/organization.dart

0
lib/data/models/user/page.dart → lib/app/core/data/models/user/page.dart

0
lib/data/models/user/role.dart → lib/app/core/data/models/user/role.dart

0
lib/data/models/user/user.dart → lib/app/core/data/models/user/user.dart

10
lib/data/repositories/auth_repository.dart → lib/app/core/data/repositories/auth_repository.dart

@ -1,10 +1,10 @@
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:problem_check_system/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/data/models/auth_model.dart';
import 'package:problem_check_system/data/models/user/user.dart';
import 'package:problem_check_system/data/providers/network_status_service.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/app/core/data/models/auth_model.dart';
import 'package:problem_check_system/app/core/data/models/user/user.dart';
import 'package:problem_check_system/app/core/data/services/network_status_service.dart';
import 'package:problem_check_system/app/core/data/services/http_provider.dart';
class AuthRepository extends GetxService {
final HttpProvider httpProvider;

6
lib/data/repositories/file_repository.dart → lib/app/core/data/repositories/file_repository.dart

@ -2,9 +2,9 @@ import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart'; // kDebugMode debugPrint
import 'package:get/get.dart' hide FormData, MultipartFile;
import 'package:path/path.dart' as p;
import 'package:problem_check_system/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/app/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/app/core/data/services/http_provider.dart';
class FileRepository extends GetxService {
final HttpProvider _httpProvider = Get.find<HttpProvider>();

0
lib/data/repositories/image_repository.dart → lib/app/core/data/repositories/image_repository.dart

4
lib/data/repositories/image_repository_impl.dart → lib/app/core/data/repositories/image_repository_impl.dart

@ -4,8 +4,8 @@ import 'package:dio/dio.dart';
import 'package:get/get.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/repositories/image_repository.dart';
import 'package:problem_check_system/app/core/data/services/http_provider.dart';
import 'package:problem_check_system/app/core/data/repositories/image_repository.dart';
class ImageRepositoryImpl extends GetxService implements ImageRepository {
final HttpProvider httpProvider;

28
lib/data/repositories/problem_repository.dart → lib/app/core/data/repositories/problem_repository.dart

@ -1,18 +1,18 @@
import 'package:dio/dio.dart';
import 'package:get/get.dart' hide MultipartFile, FormData, Response;
import 'package:problem_check_system/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/models/server_problem.dart';
import 'package:problem_check_system/data/providers/network_status_service.dart';
import 'package:problem_check_system/data/providers/http_provider.dart';
import 'package:problem_check_system/data/providers/sqlite_provider.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/server_problem.dart';
import 'package:problem_check_system/app/core/data/services/network_status_service.dart';
import 'package:problem_check_system/app/core/data/services/http_provider.dart';
import 'package:problem_check_system/app/core/data/services/sqlite_service.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
///
///
class ProblemRepository extends GetxService {
final SQLiteProvider sqliteProvider;
final SQLiteService sqliteService;
final HttpProvider httpProvider;
final NetworkStatusService networkStatusService;
final AuthRepository authRepository;
@ -20,7 +20,7 @@ class ProblemRepository extends GetxService {
RxBool get isOnline => networkStatusService.isOnline;
ProblemRepository({
required this.sqliteProvider,
required this.sqliteService,
required this.httpProvider,
required this.networkStatusService,
required this.authRepository,
@ -28,7 +28,7 @@ class ProblemRepository extends GetxService {
///
Future<void> updateProblem(Problem problem) async {
await sqliteProvider.updateProblem(problem);
await sqliteService.updateProblem(problem);
}
///
@ -41,7 +41,7 @@ class ProblemRepository extends GetxService {
String? syncStatus,
String? bindStatus,
}) async {
return await sqliteProvider.getProblems(
return await sqliteService.getProblems(
startDate: startDate,
endDate: endDate,
syncStatus: syncStatus,
@ -50,11 +50,11 @@ class ProblemRepository extends GetxService {
}
Future<void> insertProblem(Problem problem) async {
await sqliteProvider.insertProblem(problem);
await sqliteService.insertProblem(problem);
}
Future<void> deleteProblem(String problemId) async {
await sqliteProvider.deleteProblem(problemId);
await sqliteService.deleteProblem(problemId);
}
// ProblemRepository中添加

4
lib/data/providers/http_provider.dart → lib/app/core/data/services/http_provider.dart

@ -4,8 +4,8 @@ import 'package:flutter/material.dart';
import 'package:get/get.dart' hide Response;
import 'package:pretty_dio_logger/pretty_dio_logger.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
import 'package:problem_check_system/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/utils/constants/api_endpoints.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
// DioProvider GetxService
// Dio

0
lib/data/providers/network_status_service.dart → lib/app/core/data/services/network_status_service.dart

26
lib/data/providers/sqlite_provider.dart → lib/app/core/data/services/sqlite_service.dart

@ -1,14 +1,14 @@
// sqlite_provider.dart
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:sqflite/sqflite.dart';
import 'package:path/path.dart';
/// `SQLiteProvider` GetxService SQLite
/// `SQLiteService` GetxService SQLite
///
class SQLiteProvider extends GetxService {
class SQLiteService extends GetxService {
static const String _dbName = 'problems.db';
static const String _tableName = 'problems';
static const int _dbVersion = 1;
@ -147,24 +147,6 @@ class SQLiteProvider extends GetxService {
}
}
// ///
// Future<List<Problem>> getProblemsForSync() async {
// try {
// final results = await _database.query(
// _tableName,
// where: 'syncStatus = ?',
// whereArgs: [SyncStatus.notSynced.index],
// orderBy: 'creationTime ASC',
// );
// Get.log('找到 ${results.length} 条需要同步的记录');
// return results.map((json) => Problem.fromMap(json)).toList();
// } catch (e) {
// Get.log('获取待同步问题失败:$e', isError: true);
// return [];
// }
// }
///
Future<int> markAsSynced(String id) async {
try {

0
lib/data/providers/upgrader_service.dart → lib/app/core/data/services/upgrader_service.dart

0
lib/core/extensions/http_response_extension.dart → lib/app/core/extensions/http_response_extension.dart

0
lib/core/utils/constants/api_endpoints.dart → lib/app/core/utils/constants/api_endpoints.dart

2
lib/modules/enterprise_list/model/enterprise_model.dart → lib/app/features/enterprise/data/model/enterprise_model.dart

@ -1,6 +1,7 @@
// lib/app/modules/enterprise_list/models/enterprise_model.dart
class Enterprise {
final int? id; // ID
final String companyName;
final String companyType;
final int totalIssues;
@ -9,6 +10,7 @@ class Enterprise {
final int notUploaded;
Enterprise({
this.id,
required this.companyName,
required this.companyType,
required this.totalIssues,

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

@ -0,0 +1,21 @@
// lib/app/features/enterprise/presentation/bindings/enterprise_form_binding.dart
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.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?;
// 2. null Controller
Get.lazyPut<EnterpriseFormController>(
() => EnterpriseFormController(initialData: enterpriseToEdit),
);
}
}

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

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
class EnterpriseFormController extends GetxController {
//
final Enterprise? initialData;
EnterpriseFormController({this.initialData});
// --- ---
var isEditMode = false.obs;
var pageTitle = '新增企业'.obs;
// --- ---
final enterpriseNameController = TextEditingController();
final enterpriseAddressController = TextEditingController();
final contactPersonController = TextEditingController();
final contactPhoneController = TextEditingController();
final hazardSourceController = TextEditingController();
//
final Rx<String?> selectedEnterpriseType = Rx<String?>(null);
final Rx<String?> selectedEnterpriseScale = Rx<String?>(null);
@override
void onInit() {
super.onInit();
//
if (initialData != null) {
isEditMode.value = true;
pageTitle.value = '修改信息';
//
enterpriseNameController.text = initialData!.companyName;
// ...
} else {
isEditMode.value = false;
pageTitle.value = '新增企业';
// ()
}
}
//
void submitForm() {
if (isEditMode.value) {
_updateEnterprise();
} else {
_createEnterprise();
}
}
void _createEnterprise() {
print('执行新增逻辑...');
// API
// Get.find<ApiService>().createEnterprise(...);
Get.back(result: true); //
}
void _updateEnterprise() {
print('执行修改逻辑, ID: ${initialData!.id}');
// API
// Get.find<ApiService>().updateEnterprise(initialData!.id, ...);
Get.back(result: true); //
}
@override
void onClose() {
enterpriseNameController.dispose();
enterpriseAddressController.dispose();
contactPersonController.dispose();
contactPhoneController.dispose();
hazardSourceController.dispose();
super.onClose();
}
}

36
lib/modules/enterprise_list/enterprise_list_controller.dart → lib/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart

@ -1,7 +1,8 @@
// lib/app/modules/enterprise_list/enterprise_list_controller.dart
import 'package:get/get.dart';
import 'package:problem_check_system/modules/enterprise_list/model/enterprise_model.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
class EnterpriseListController extends GetxController {
// 使 .obs 使UI会自动更新
@ -13,6 +14,10 @@ class EnterpriseListController extends GetxController {
fetchEnterprises(); //
}
void refreshList() {
fetchEnterprises(); //
}
// API获取数据的过程
void fetchEnterprises() {
//
@ -101,13 +106,30 @@ class EnterpriseListController extends GetxController {
//
}
void onAddNew() {
//
Get.snackbar('提示', '添加功能待实现');
///
Future<void> navigateToEditForm(Enterprise enterprise) async {
final result = await Get.toNamed(
AppRoutes.enterpriseForm,
arguments: enterprise, //
);
if (result == true) {
refreshList(); //
}
}
void onUpload() {
//
Get.snackbar('提示', '上传功能待实现');
///
Future<void> navigateToAddForm() async {
final result = await Get.toNamed(AppRoutes.enterpriseForm);
if (result == true) {
refreshList(); //
}
}
///
Future<void> navigateToUploadPage() async {
final result = await Get.toNamed(AppRoutes.test);
if (result == true) {
refreshList(); //
}
}
}

267
lib/app/features/enterprise/presentation/views/enterprise_form_page.dart

@ -0,0 +1,267 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_form_controller.dart';
// ------------------- (View) -------------------
// 使 GetView 便访
class EnterpriseFormPage extends GetView<EnterpriseFormController> {
const EnterpriseFormPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: const Color(0xFFF5F5F5),
appBar: _buildAppBar(),
body: SafeArea(
child: Column(
children: [
Expanded(
child: SingleChildScrollView(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h),
child: Column(
children: [
_buildInfoSection(
title: '必填信息',
children: [
_buildTextField(
label: '企业名称',
hint: '达拉特旗',
controller: controller.enterpriseNameController,
isRequired: true,
),
_buildDropdownField(
label: '企业类型',
hint: '请选择企业类型',
isRequired: true,
),
],
),
SizedBox(height: 12.h),
_buildInfoSection(
title: '选填信息',
children: [
_buildTextField(
label: '企业地址',
hint: '请输入企业地址',
controller: controller.enterpriseAddressController,
),
_buildDropdownField(label: '企业规模', hint: '请选择企业规模'),
_buildTextField(
label: '联系人',
hint: '请输入联系人姓名',
controller: controller.contactPersonController,
),
_buildTextField(
label: '联系电话',
hint: '请输入联系电话',
controller: controller.contactPhoneController,
),
_buildTextField(
label: '有无重大危险源;重大危险源情况',
hint: '请输入有无重大危险源;重大危险源情况',
controller: controller.hazardSourceController,
hasDivider: false,
),
],
),
],
),
),
),
_buildBottomButtons(),
],
),
),
);
}
// controller
PreferredSizeWidget _buildAppBar() {
return PreferredSize(
preferredSize: Size.fromHeight(56.h),
child: Container(
decoration: const BoxDecoration(
// ...
),
child: AppBar(
// ... AppBar
// 使 Obx pageTitle
title: Obx(
() => Text(
controller.pageTitle.value,
style: TextStyle(
fontSize: 18.sp,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
),
centerTitle: true,
),
),
);
}
// ( "必填信息")
Widget _buildInfoSection({
required String title,
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: [
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),
),
],
),
SizedBox(height: 10.h),
...children,
],
),
);
}
//
Widget _buildTextField({
required String label,
required String hint,
required TextEditingController controller,
bool isRequired = false,
bool hasDivider = true,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel(label, isRequired),
),
TextFormField(
controller: controller,
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 _buildDropdownField({
required String label,
required String hint,
bool isRequired = false,
}) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(vertical: 10.h),
child: _buildLabel(label, isRequired),
),
GestureDetector(
onTap: () {
//
Get.snackbar('提示', '这是一个下拉选择框');
},
child: Container(
color: Colors.transparent, // 使
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
hint,
style: TextStyle(color: Colors.grey[400], fontSize: 14.sp),
),
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(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h),
color: Colors.white,
child: Row(
children: [
Expanded(
child: OutlinedButton(
onPressed: () => Get.back(),
style: OutlinedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 12.h),
side: BorderSide(color: Colors.grey[300]!),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.r),
),
),
child: Text(
'取消',
style: TextStyle(fontSize: 16.sp, color: Colors.black54),
),
),
),
SizedBox(width: 16.w),
Expanded(
child: ElevatedButton(
onPressed: controller.submitForm,
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF2B8CFF),
padding: EdgeInsets.symmetric(vertical: 12.h),
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8.r),
),
),
child: Text(
'确定',
style: TextStyle(fontSize: 16.sp, color: Colors.white),
),
),
),
],
),
);
}
}

121
lib/app/features/enterprise/presentation/views/enterprise_list_page.dart

@ -0,0 +1,121 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_card.dart';
import '../controllers/enterprise_list_controller.dart';
class EnterpriseListPage extends GetView<EnterpriseListController> {
const EnterpriseListPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'企业列表',
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'MyFont',
fontSize: 18.sp,
color: Colors.white,
),
),
backgroundColor: const Color(0xFF3B82F6),
elevation: 0,
centerTitle: true,
actions: [
IconButton(
icon: Icon(Icons.add, color: Colors.white), // 使 .sp
onPressed: () {
controller.navigateToAddForm();
},
),
IconButton(
icon: Icon(Icons.upload, color: Colors.pink[300]), // 使 .sp
onPressed: () {
controller.navigateToUploadPage();
},
),
],
),
body: Stack(
children: [
Column(
children: [
_buildFilterBar(),
// 使 Obx Widget
Expanded(
child: Obx(() {
if (controller.enterpriseList.isEmpty) {
return const Center(child: CircularProgressIndicator());
}
return ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: 16.w, // 使 .w
vertical: 8.h, // 使 .h
),
itemCount: controller.enterpriseList.length,
itemBuilder: (context, index) {
final enterprise = controller.enterpriseList[index];
return Padding(
padding: EdgeInsets.only(bottom: 12.h), // 使 .h
// child: _EnterpriseCard(enterprise: enterprise),
child: EnterpriseCard(
enterprise: enterprise,
onEdit: () {
controller.navigateToEditForm(enterprise);
},
onViewProblems: () {},
),
);
},
);
}),
),
],
),
],
),
);
}
Widget _buildFilterBar() {
return Container(
padding: EdgeInsets.fromLTRB(16.w, 12.h, 16.w, 12.h), // 使 .w .h
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
const Text('企业名称', style: TextStyle(color: Colors.black54)),
SizedBox(width: 4.w), // 使 .w
Icon(
Icons.search,
size: 20.sp,
color: Colors.black54,
), // 使 .sp
],
),
),
_buildDropdown('选择日期'),
_buildDropdown('近一周'),
_buildDropdown('类型'),
],
),
);
}
Widget _buildDropdown(String text) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 8.w), // 使 .w
child: Row(
children: [
Text(text, style: const TextStyle(color: Colors.black54)),
const Icon(Icons.arrow_drop_down, color: Colors.black54),
],
),
);
}
}

34
lib/modules/enterprise_list/widgets/enterprise_card.dart → lib/app/features/enterprise/presentation/widgets/enterprise_card.dart

@ -1,9 +1,21 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/features/enterprise/data/model/enterprise_model.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
//
class EnterpriseCard extends StatelessWidget {
const EnterpriseCard({super.key});
final Enterprise enterprise;
final VoidCallback onEdit;
final VoidCallback onViewProblems;
const EnterpriseCard({
super.key,
required this.enterprise,
required this.onEdit,
required this.onViewProblems,
});
@override
Widget build(BuildContext context) {
@ -54,9 +66,7 @@ class EnterpriseCard extends StatelessWidget {
children: [
// --- ---
TextButton.icon(
onPressed: () {
print('修改信息按钮被点击');
},
onPressed: onEdit,
icon: Icon(Icons.edit_outlined, size: 16.sp),
label: Text('修改信息', style: TextStyle(fontSize: 9.5.sp)),
style: TextButton.styleFrom(
@ -71,9 +81,7 @@ class EnterpriseCard extends StatelessWidget {
),
// --- ---
ElevatedButton(
onPressed: () {
print('查看问题按钮被点击');
},
onPressed: onViewProblems,
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF42A5F5),
foregroundColor: Colors.white,
@ -127,7 +135,7 @@ class EnterpriseCard extends StatelessWidget {
),
SizedBox(height: 4.h), // .h
Text(
'山东汇丰石化集团有限公司',
enterprise.companyName,
style: TextStyle(
fontSize: 12.5.sp,
fontWeight: FontWeight.w500,
@ -146,7 +154,7 @@ class EnterpriseCard extends StatelessWidget {
),
SizedBox(height: 4.h),
Text(
'危险化学品生产',
enterprise.companyType,
style: TextStyle(
fontSize: 12.5.sp,
fontWeight: FontWeight.w500,
@ -187,7 +195,7 @@ class EnterpriseCard extends StatelessWidget {
style: TextStyle(fontSize: 12.sp, color: Colors.grey),
),
Text(
'29',
enterprise.totalIssues.toString(),
style: TextStyle(
fontSize: 12.5.sp,
color: Colors.black87,
@ -201,7 +209,7 @@ class EnterpriseCard extends StatelessWidget {
children: [
Icon(Icons.access_time, color: Colors.grey, size: 16.sp),
Text(
'创建时间: 2025-07-31 15:30:29',
'创建时间: ${enterprise.creationTime}',
style: TextStyle(fontSize: 12.sp, color: Colors.grey),
),
],
@ -215,13 +223,13 @@ class EnterpriseCard extends StatelessWidget {
return Row(
children: [
_buildTag(
text: '已上传 15',
text: '已上传 ${enterprise.uploaded}',
textColor: Colors.blue.shade700,
backgroundColor: Colors.blue.shade50,
),
SizedBox(width: 8.w),
_buildTag(
text: '未上传 14',
text: '未上传 ${enterprise.notUploaded}',
textColor: Colors.red.shade600,
backgroundColor: Colors.red.shade50,
),

7
lib/app/routes/app_pages.dart

@ -1,4 +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/views/enterprise_form_page.dart';
import 'package:problem_check_system/modules/home/bindings/home_binding.dart';
import 'package:problem_check_system/modules/home/views/home_page.dart';
import 'package:problem_check_system/modules/auth/bindings/login_binding.dart';
@ -41,5 +43,10 @@ abstract class AppPages {
binding: ProblemFormBinding(),
),
GetPage(name: AppRoutes.test, page: () => const HealthApp()),
GetPage(
name: AppRoutes.enterpriseForm,
page: () => const EnterpriseFormPage(),
binding: EnterpriseFormBinding(),
),
];
}

6
lib/app/routes/app_routes.dart

@ -12,5 +12,11 @@ abstract class AppRoutes {
static const problemForm = '/problemForm';
// #endregion
// #region
static const enterprise = '/enterprise';
static const enterpriseList = '/enterpriseList';
static const enterpriseForm = '/enterpriseForm';
// #endregion
static const test = '/test';
}

4
lib/main.dart

@ -76,7 +76,7 @@ class MainApp extends StatelessWidget {
NavigationDestinationLabelBehavior.onlyShowSelected,
// backgroundColor: Colors.white,
//
indicatorColor: const Color.fromARGB(88, 19, 214, 12),
indicatorColor: Colors.deepOrange.shade200,
// 使 indicatorShape
// indicatorShape: const CustomIndicatorShape(
// //
@ -89,7 +89,7 @@ class MainApp extends StatelessWidget {
TextStyle(
fontSize: 12.sp,
fontWeight: FontWeight.w500,
color: Colors.blue,
color: Colors.deepOrange,
),
),
),

2
lib/modules/auth/bindings/login_binding.dart

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
import 'package:problem_check_system/modules/auth/controllers/login_controller.dart';
class LoginBinding implements Bindings {

4
lib/modules/auth/controllers/login_controller.dart

@ -1,9 +1,9 @@
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/auth_model.dart';
import 'package:problem_check_system/app/core/data/models/auth_model.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
class LoginController extends GetxController {
final AuthRepository _authRepository;

280
lib/modules/enterprise_list/enterprise_list_page.dart

@ -1,280 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/modules/enterprise_list/model/enterprise_model.dart';
import 'package:problem_check_system/modules/enterprise_list/widgets/enterprise_card.dart';
import 'enterprise_list_controller.dart';
class EnterpriseListPage extends GetView<EnterpriseListController> {
const EnterpriseListPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'企业列表',
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'MyFont',
fontSize: 18.sp,
color: Colors.white,
),
),
backgroundColor: const Color(0xFF3B82F6),
elevation: 0,
centerTitle: true,
actions: [
IconButton(
icon: Icon(Icons.add, color: Colors.white), // 使 .sp
onPressed: () {
//
},
),
IconButton(
icon: Icon(Icons.upload, color: Colors.pink[300]), // 使 .sp
onPressed: () {
//
},
),
],
),
body: Stack(
children: [
Column(
children: [
_buildFilterBar(),
// 使 Obx Widget
Expanded(
child: Obx(() {
if (controller.enterpriseList.isEmpty) {
return const Center(child: CircularProgressIndicator());
}
return ListView.builder(
padding: EdgeInsets.symmetric(
horizontal: 16.w, // 使 .w
vertical: 8.h, // 使 .h
),
itemCount: controller.enterpriseList.length,
itemBuilder: (context, index) {
final enterprise = controller.enterpriseList[index];
return Padding(
padding: EdgeInsets.only(bottom: 12.h), // 使 .h
// child: _EnterpriseCard(enterprise: enterprise),
child: EnterpriseCard(),
);
},
);
}),
),
],
),
],
),
);
}
Widget _buildFilterBar() {
return Container(
padding: EdgeInsets.fromLTRB(16.w, 12.h, 16.w, 12.h), // 使 .w .h
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
child: Row(
children: [
const Text('企业名称', style: TextStyle(color: Colors.black54)),
SizedBox(width: 4.w), // 使 .w
Icon(
Icons.search,
size: 20.sp,
color: Colors.black54,
), // 使 .sp
],
),
),
_buildDropdown('选择日期'),
_buildDropdown('近一周'),
_buildDropdown('类型'),
],
),
);
}
Widget _buildDropdown(String text) {
return Padding(
padding: EdgeInsets.symmetric(horizontal: 8.w), // 使 .w
child: Row(
children: [
Text(text, style: const TextStyle(color: Colors.black54)),
const Icon(Icons.arrow_drop_down, color: Colors.black54),
],
),
);
}
}
class _EnterpriseCard extends StatelessWidget {
final Enterprise enterprise;
const _EnterpriseCard({required this.enterprise});
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.all(16.r), // 使 .r padding
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(8.r), // 使 .r
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'企业名称',
style: TextStyle(fontSize: 9.sp, color: Colors.grey),
),
SizedBox(height: 4.h), // 使 .h
Text(
enterprise.companyName,
style: TextStyle(
fontSize: 12.5.sp,
fontWeight: FontWeight.w500,
),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
],
),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'企业类型',
style: TextStyle(fontSize: 9.sp, color: Colors.grey),
),
SizedBox(height: 4.h), // 使 .h
Text(
enterprise.companyType,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 12.5.sp,
fontWeight: FontWeight.w500,
),
),
],
),
Container(
padding: EdgeInsets.symmetric(
horizontal: 5.w,
vertical: 2.h,
), // 使 .w .h
decoration: BoxDecoration(
// color: Colors.orange[100],
borderRadius: BorderRadius.circular(10.r), // 使 .r
border: Border.all(color: Colors.red),
),
child: Text(
'信息未上传',
maxLines: 1,
style: TextStyle(fontSize: 9.sp, color: Colors.red), // 使 .sp
),
),
],
),
SizedBox(height: 16.h), // 使 .h
Row(
children: [
Icon(
Icons.description,
size: 16.sp,
color: Colors.grey,
), // 使 .sp
SizedBox(width: 4.w), // 使 .w
Text(
'问题总数: ${enterprise.totalIssues}',
style: TextStyle(fontSize: 12.sp, color: Colors.grey), // 使 .sp
),
SizedBox(width: 16.w), // 使 .w
Icon(
Icons.access_time,
size: 16.sp,
color: Colors.grey,
), // 使 .sp
SizedBox(width: 4.w), // 使 .w
Text(
'创建时间: ${enterprise.creationTime}',
style: TextStyle(fontSize: 12.sp, color: Colors.grey), // 使 .sp
),
],
),
// SizedBox(height: 16.h), // 使 .h
Row(
children: [
_buildTag('已上传 ${enterprise.uploaded}', Colors.blue),
SizedBox(width: 8.w), // 使 .w
_buildTag('未上传 ${enterprise.notUploaded}', Colors.red),
const Spacer(),
Icon(Icons.edit, size: 16.sp, color: Colors.grey), // 使 .sp
SizedBox(width: 4.w), // 使 .w
Text(
'修改信息',
style: TextStyle(
fontSize: 9.5.sp,
color: Colors.grey,
), // 使 .sp
),
SizedBox(width: 16.w), // 使 .w
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: const Color(0xFF3B82F6),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4.r), // 使 .r
),
// padding: EdgeInsets.symmetric(
// horizontal: 16.w, // 使 .w
// vertical: 8.h, // 使 .h
// ),
// tapTargetSize: MaterialTapTargetSize.shrinkWrap,
),
child: const Text(
'查看问题',
style: TextStyle(color: Colors.white),
),
),
],
),
],
),
);
}
Widget _buildTag(String text, Color color) {
return Container(
padding: EdgeInsets.symmetric(
horizontal: 6.w,
vertical: 2.h,
), // 使 .w .h
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(4.r), // 使 .r
),
child: Text(
text,
style: TextStyle(color: color, fontSize: 8.5.sp),
), // 使 .sp
);
}
}

8
lib/modules/home/bindings/home_binding.dart

@ -1,8 +1,8 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:problem_check_system/modules/enterprise_list/enterprise_list_controller.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart';
import 'package:problem_check_system/modules/home/controllers/home_controller.dart';
import 'package:problem_check_system/modules/my/controllers/my_controller.dart';
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart';

2
lib/modules/home/controllers/home_controller.dart

@ -1,6 +1,6 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/modules/enterprise_list/enterprise_list_page.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/views/enterprise_list_page.dart';
import 'package:problem_check_system/modules/my/views/my_page.dart';
import 'package:problem_check_system/modules/problem/views/problem_page.dart';

9
lib/modules/home/views/home_page.dart

@ -20,7 +20,6 @@ class HomePage extends GetView<HomeController> {
// 3. 'onTap' 'onDestinationSelected'
onDestinationSelected: controller.changeIndex,
// M3 (, )
//
animationDuration: const Duration(milliseconds: 800),
@ -34,13 +33,13 @@ class HomePage extends GetView<HomeController> {
label: '企业',
),
NavigationDestination(
icon: Icon(Icons.now_widgets_outlined, color: Colors.orange),
selectedIcon: Icon(Icons.now_widgets, color: Colors.orange),
icon: Icon(Icons.now_widgets_outlined, color: Colors.blue),
selectedIcon: Icon(Icons.now_widgets, color: Colors.blue),
label: '全部问题',
),
NavigationDestination(
icon: Icon(Icons.person_outline, color: Colors.cyan),
selectedIcon: Icon(Icons.person, color: Colors.cyan),
icon: Icon(Icons.person_outline, color: Colors.blue),
selectedIcon: Icon(Icons.person, color: Colors.blue),
label: '我的',
),
],

2
lib/modules/my/bindings/change_password_binding.dart

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
import 'package:problem_check_system/modules/my/controllers/change_password_controller.dart';
class ChangePasswordBinding implements Bindings {

2
lib/modules/my/controllers/change_password_controller.dart

@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
class ChangePasswordController extends GetxController {
//

2
lib/modules/my/controllers/my_controller.dart

@ -1,7 +1,7 @@
import 'package:dio/dio.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
import 'package:problem_check_system/data/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/auth_repository.dart';
class MyController extends GetxController {
final AuthRepository authRepository;

4
lib/modules/problem/bindings/problem_form_binding.dart

@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/modules/problem/controllers/problem_form_controller.dart';
class ProblemFormBinding extends Bindings {

18
lib/modules/problem/controllers/problem_controller.dart

@ -7,15 +7,15 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart' hide MultipartFile, FormData, Response;
import 'package:flutter/material.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
import 'package:problem_check_system/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/data/models/image_status.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/models/server_problem.dart';
import 'package:problem_check_system/data/repositories/file_repository.dart';
import 'package:problem_check_system/data/repositories/image_repository.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/extensions/http_response_extension.dart';
import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart';
import 'package:problem_check_system/app/core/data/models/image_status.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/server_problem.dart';
import 'package:problem_check_system/app/core/data/repositories/file_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/image_repository.dart';
import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/modules/problem/controllers/sync_progress_state.dart';
import 'package:problem_check_system/modules/problem/views/widgets/models/date_range_enum.dart';
import 'package:problem_check_system/modules/problem/views/widgets/models/dropdown_option.dart';

10
lib/modules/problem/controllers/problem_form_controller.dart

@ -6,12 +6,12 @@ import 'package:image_picker/image_picker.dart';
import 'package:path/path.dart' as path;
import 'package:permission_handler/permission_handler.dart';
import 'package:path_provider/path_provider.dart';
import 'package:problem_check_system/data/models/image_status.dart';
import 'package:problem_check_system/data/models/image_metadata_model.dart';
import 'package:problem_check_system/app/core/data/models/image_status.dart';
import 'package:problem_check_system/app/core/data/models/image_metadata_model.dart';
import 'dart:io';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/repositories/problem_repository.dart';
import 'package:uuid/uuid.dart';
class ProblemFormController extends GetxController {

4
lib/modules/problem/views/problem_list_page.dart

@ -2,9 +2,9 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:easy_refresh/easy_refresh.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/modules/problem/views/widgets/problem_card.dart';
class ProblemListPage extends GetView<ProblemController> {

4
lib/modules/problem/views/widgets/problem_card.dart

@ -3,8 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:intl/intl.dart';
import 'package:problem_check_system/app/routes/app_routes.dart';
import 'package:problem_check_system/data/models/problem_sync_status.dart';
import 'package:problem_check_system/data/models/problem_model.dart';
import 'package:problem_check_system/app/core/data/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/data/models/problem_model.dart';
import 'package:problem_check_system/modules/problem/controllers/problem_controller.dart';
import 'package:problem_check_system/modules/problem/views/widgets/custom_button.dart';
import 'package:tdesign_flutter/tdesign_flutter.dart';

Loading…
Cancel
Save