Browse Source

refactor : app_bar_add,app_bar_upload

dev
徐振升 2 weeks ago
parent
commit
3d9d3e9042
  1. 7
      lib/app/core/routes/app_pages.dart
  2. 1
      lib/app/core/routes/app_routes.dart
  3. 44
      lib/app/core/widgets/app_bar_add.dart
  4. 67
      lib/app/core/widgets/upload_app_bar.dart
  5. 8
      lib/app/features/enterprise/presentation/bindings/enterprise_upload_binding.dart
  6. 2
      lib/app/features/enterprise/presentation/pages/enterprise_form_page.dart
  7. 2
      lib/app/features/enterprise/presentation/pages/enterprise_info_page.dart
  8. 50
      lib/app/features/enterprise/presentation/pages/enterprise_list_page.dart
  9. 20
      lib/app/features/enterprise/presentation/pages/enterprise_upload_page.dart
  10. 0
      lib/app/features/enterprise/presentation/pages/widgets/enterprise_card.dart
  11. 0
      lib/app/features/enterprise/presentation/pages/widgets/enterprise_form_view.dart
  12. 11
      lib/app/features/navigation/presentation/controllers/navigation_controller.dart
  13. 155
      lib/app/features/problem/presentation/views/problem_page.dart
  14. 10
      lib/app/features/problem/presentation/views/problem_upload_page.dart
  15. 0
      lib/app/features/problem/presentation/views/widgets/problem_list_page.dart

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

@ -1,7 +1,9 @@
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/bindings/enterprise_upload_binding.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/enterprise_form_page.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/enterprise_upload_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';
import 'package:problem_check_system/app/features/home/bindings/home_binding.dart';
@ -60,5 +62,10 @@ abstract class AppPages {
page: () => const EnterpriseFormPage(),
binding: EnterpriseFormBinding(),
),
GetPage(
name: AppRoutes.enterpriseUpload,
page: () => const EnterpriseUploadPage(),
binding: EnterpriseUploadBinding(),
),
];
}

1
lib/app/core/routes/app_routes.dart

@ -17,5 +17,6 @@ abstract class AppRoutes {
static const enterpriseInfo = '/enterpriseInfo';
static const enterpriseList = '/enterpriseList';
static const enterpriseForm = '/enterpriseForm';
static const enterpriseUpload = '/enterpriseUpload';
// #endregion
}

44
lib/app/core/widgets/app_bar_add.dart

@ -0,0 +1,44 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
class AppBarAdd extends StatelessWidget implements PreferredSizeWidget {
const AppBarAdd({super.key, required this.titleName, this.onAddPressed});
final String titleName;
final VoidCallback? onAddPressed;
@override
Widget build(BuildContext context) {
return AppBar(
title: Text(
titleName,
style: TextStyle(
fontWeight: FontWeight.bold,
fontFamily: 'MyFont',
fontSize: 18.sp,
color: Colors.white,
),
),
backgroundColor: Colors.transparent,
flexibleSpace: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFF418CFC), Color(0xFF3DBFFC)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
elevation: 0,
centerTitle: true,
actions: [
IconButton(
icon: Icon(Icons.add, color: Colors.white), // 使 .sp
onPressed: onAddPressed,
),
],
);
}
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
}

67
lib/app/core/widgets/upload_app_bar.dart

@ -0,0 +1,67 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
class UploadAppBar extends StatelessWidget implements PreferredSizeWidget {
const UploadAppBar({
super.key,
required this.selectedAll,
required this.selectedCount,
required this.buttonVisible,
this.onButtonPressed,
});
final int selectedCount;
final bool selectedAll;
final bool buttonVisible;
final VoidCallback? onButtonPressed;
@override
Widget build(BuildContext context) {
return AppBar(
title: Text(
"已选择$selectedCount项",
style: TextStyle(
fontFamily: 'MyFont',
fontSize: 17.5.sp,
color: Colors.white,
),
),
centerTitle: true,
backgroundColor: Colors.transparent,
flexibleSpace: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFF418CFC), Color(0xFF3DBFFC)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle.dark,
leading: IconButton(
icon: const Icon(Icons.arrow_back_ios, color: Colors.white, size: 20),
onPressed: () {
Get.back();
},
),
actions: [
TextButton(
onPressed: buttonVisible ? onButtonPressed : null,
child: Text(
selectedAll ? "全选" : "取消全选",
style: TextStyle(
color: buttonVisible ? Colors.white : Colors.grey[300],
fontSize: 15.sp,
fontFamily: "MyFont",
),
),
),
],
);
}
@override
Size get preferredSize => const Size.fromHeight(kToolbarHeight);
}

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

@ -0,0 +1,8 @@
import 'package:get/get.dart';
class EnterpriseUploadBinding extends Bindings {
@override
void dependencies() {
// TODO: implement dependencies
}
}

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

@ -2,7 +2,7 @@ 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';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_form_view.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/widgets/enterprise_form_view.dart';
// ------------------- (View) -------------------
// 使 GetView 便访

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

@ -2,7 +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';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/widgets/enterprise_form_view.dart';
//
class EnterpriseInfoPage extends StatelessWidget {

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

@ -3,7 +3,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.dart';
import 'package:problem_check_system/app/core/models/company_enum.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/widgets/enterprise_card.dart';
import 'package:problem_check_system/app/core/widgets/app_bar_add.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/widgets/enterprise_card.dart';
import '../controllers/enterprise_list_controller.dart';
class EnterpriseListPage extends GetView<EnterpriseListController> {
@ -12,42 +13,9 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
@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: Colors.transparent,
flexibleSpace: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFF418CFC), Color(0xFF3DBFFC)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
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();
// },
// ),
],
appBar: AppBarAdd(
titleName: '企业列表',
onAddPressed: () => controller.navigateToAddForm(),
),
body: Stack(
children: [
@ -71,7 +39,7 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
initiallyExpanded: false, //
children: [
Padding(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 1.h),
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 4.h),
child: Column(
children: [
// 1.
@ -170,8 +138,8 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
final pickedDate = await showDatePicker(
context: Get.context!,
initialDate: date.value ?? DateTime.now(),
firstDate: DateTime(2020),
lastDate: DateTime(2101),
firstDate: DateTime(2025),
lastDate: DateTime(2125),
);
if (pickedDate != null) {
date.value = pickedDate;
@ -186,7 +154,7 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
),
child: Obx(
() => Text(
date.value == null ? '请选择日期' : date.value!.toDateTimeString(),
date.value == null ? '请选择日期' : date.value!.toDateString(),
style: TextStyle(
color: date.value == null ? Colors.grey[600] : Colors.black87,
),

20
lib/app/features/enterprise/presentation/pages/enterprise_upload_page.dart

@ -0,0 +1,20 @@
import 'package:flutter/material.dart';
import 'package:problem_check_system/app/core/widgets/upload_app_bar.dart';
class EnterpriseUploadPage extends StatelessWidget {
const EnterpriseUploadPage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: UploadAppBar(
selectedCount: 10,
selectedAll: true,
buttonVisible: false,
onButtonPressed: () {
print("object");
},
),
);
}
}

0
lib/app/features/enterprise/presentation/widgets/enterprise_card.dart → lib/app/features/enterprise/presentation/pages/widgets/enterprise_card.dart

0
lib/app/features/enterprise/presentation/widgets/enterprise_form_view.dart → lib/app/features/enterprise/presentation/pages/widgets/enterprise_form_view.dart

11
lib/app/features/navigation/presentation/controllers/navigation_controller.dart

@ -31,6 +31,13 @@ class NavigationController extends GetxController {
get currentPage => pages[selectedIndex.value];
@override
void onInit() {
super.onInit();
updateFabUploadPosition(Offset.infinite);
snapToEdge();
}
void changePageIndex(int index) {
selectedIndex.value = index;
}
@ -85,11 +92,11 @@ class NavigationController extends GetxController {
case 1: //
Get.log("当前在企业页面,准备跳转到企业数据上传页...");
// 使
// Get.toNamed(AppRoutes.ENTERPRISE_UPLOAD);
Get.toNamed(AppRoutes.enterpriseUpload);
break;
case 2: //
Get.log("当前在问题页面,准备跳转到问题上传页...");
// Get.toNamed(AppRoutes.PROBLEM_UPLOAD);
Get.toNamed(AppRoutes.problemUpload);
break;
default:
//

155
lib/app/features/problem/presentation/views/problem_page.dart

@ -1,11 +1,11 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/widgets/app_bar_add.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/problem_list_page.dart'; // ProblemListPage
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_list_page.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/current_filter_bar.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/history_filter_bar.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart'; //
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart';
class ProblemPage extends GetView<ProblemController> {
const ProblemPage({super.key});
@ -13,38 +13,9 @@ class ProblemPage extends GetView<ProblemController> {
@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: Colors.transparent,
flexibleSpace: Container(
decoration: const BoxDecoration(
gradient: LinearGradient(
colors: [Color(0xFF418CFC), Color(0xFF3DBFFC)],
begin: Alignment.centerLeft,
end: Alignment.centerRight,
),
),
),
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: () {},
),
],
appBar: AppBarAdd(
titleName: '问题列表',
onAddPressed: () => controller.toProblemFormPageAndRefresh(),
),
body: Column(
children: [
@ -59,65 +30,65 @@ class ProblemPage extends GetView<ProblemController> {
],
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
// floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
// 使 Stack
floatingActionButton: Stack(
children: [
// "添加"
// 使 Align Positioned
Align(
alignment: Alignment.bottomCenter,
child: Padding(
padding: EdgeInsets.only(bottom: 24.h), //
child: FloatingActionButton(
heroTag: "btn_add",
onPressed: () {
controller.toProblemFormPageAndRefresh();
},
shape: const CircleBorder(),
backgroundColor: Colors.blue[300],
foregroundColor: Colors.white,
child: const Icon(Icons.add),
),
),
),
// floatingActionButton: Stack(
// children: [
// // "添加"
// // 使 Align Positioned
// Align(
// alignment: Alignment.bottomCenter,
// child: Padding(
// padding: EdgeInsets.only(bottom: 24.h), //
// child: FloatingActionButton(
// heroTag: "btn_add",
// onPressed: () {
// controller.toProblemFormPageAndRefresh();
// },
// shape: const CircleBorder(),
// backgroundColor: Colors.blue[300],
// foregroundColor: Colors.white,
// child: const Icon(Icons.add),
// ),
// ),
// ),
// "上传"
Obx(() {
final isOnline = controller.isOnline.value;
return Positioned(
// 使left/right dxtop/bottom dy
left: controller.fabUploadPosition.value.dx,
top: controller.fabUploadPosition.value.dy,
child: GestureDetector(
onPanUpdate: (details) {
//
controller.updateFabUploadPosition(details.delta);
},
onPanEnd: (details) {
//
controller.snapToEdge();
},
child: FloatingActionButton(
heroTag: "btn_upload",
onPressed: isOnline
? () => controller.showUploadPage()
: null,
foregroundColor: Colors.white,
backgroundColor: isOnline
? Colors.red[300]
: Colors.grey[400],
child: Icon(
isOnline
? Icons.file_upload_outlined
: Icons.cloud_off_outlined,
),
),
),
);
}),
],
),
// // "上传"
// Obx(() {
// final isOnline = controller.isOnline.value;
// return Positioned(
// // 使left/right dxtop/bottom dy
// left: controller.fabUploadPosition.value.dx,
// top: controller.fabUploadPosition.value.dy,
// child: GestureDetector(
// onPanUpdate: (details) {
// //
// controller.updateFabUploadPosition(details.delta);
// },
// onPanEnd: (details) {
// //
// controller.snapToEdge();
// },
// child: FloatingActionButton(
// heroTag: "btn_upload",
// onPressed: isOnline
// ? () => controller.showUploadPage()
// : null,
// foregroundColor: Colors.white,
// backgroundColor: isOnline
// ? Colors.red[300]
// : Colors.grey[400],
// child: Icon(
// isOnline
// ? Icons.file_upload_outlined
// : Icons.cloud_off_outlined,
// ),
// ),
// ),
// );
// }),
// ],
// ),
);
}
}

10
lib/app/features/problem/presentation/views/problem_upload_page.dart

@ -1,8 +1,9 @@
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:problem_check_system/app/core/widgets/upload_app_bar.dart';
import 'package:problem_check_system/app/features/problem/presentation/controllers/problem_controller.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/problem_list_page.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_list_page.dart';
import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart';
class ProblemUploadPage extends GetView<ProblemController> {
@ -11,7 +12,12 @@ class ProblemUploadPage extends GetView<ProblemController> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: _buildAppBar(),
appBar: UploadAppBar(
selectedCount: controller.selectedCount,
selectedAll: controller.allSelected.value,
buttonVisible: controller.unUploadedProblems.isNotEmpty,
onButtonPressed: controller.selectAll,
),
body: _buildBody(),
bottomNavigationBar: _buildBottomBar(),
);

0
lib/app/features/problem/presentation/views/problem_list_page.dart → lib/app/features/problem/presentation/views/widgets/problem_list_page.dart

Loading…
Cancel
Save