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: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_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_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_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/bindings/navigation_binding.dart';
import 'package:problem_check_system/app/features/navigation/presentation/pages/navigation_page.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'; import 'package:problem_check_system/app/features/home/bindings/home_binding.dart';
@ -60,5 +62,10 @@ abstract class AppPages {
page: () => const EnterpriseFormPage(), page: () => const EnterpriseFormPage(),
binding: EnterpriseFormBinding(), 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 enterpriseInfo = '/enterpriseInfo';
static const enterpriseList = '/enterpriseList'; static const enterpriseList = '/enterpriseList';
static const enterpriseForm = '/enterpriseForm'; static const enterpriseForm = '/enterpriseForm';
static const enterpriseUpload = '/enterpriseUpload';
// #endregion // #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:get/get.dart';
import 'package:flutter_screenutil/flutter_screenutil.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/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) ------------------- // ------------------- (View) -------------------
// 使 GetView 便访 // 使 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/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.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 { 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:get/get.dart';
import 'package:problem_check_system/app/core/extensions/datetime_extension.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/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'; import '../controllers/enterprise_list_controller.dart';
class EnterpriseListPage extends GetView<EnterpriseListController> { class EnterpriseListPage extends GetView<EnterpriseListController> {
@ -12,42 +13,9 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBarAdd(
title: Text( titleName: '企业列表',
'企业列表', onAddPressed: () => controller.navigateToAddForm(),
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();
// },
// ),
],
), ),
body: Stack( body: Stack(
children: [ children: [
@ -71,7 +39,7 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
initiallyExpanded: false, // initiallyExpanded: false, //
children: [ children: [
Padding( Padding(
padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 1.h), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 4.h),
child: Column( child: Column(
children: [ children: [
// 1. // 1.
@ -170,8 +138,8 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
final pickedDate = await showDatePicker( final pickedDate = await showDatePicker(
context: Get.context!, context: Get.context!,
initialDate: date.value ?? DateTime.now(), initialDate: date.value ?? DateTime.now(),
firstDate: DateTime(2020), firstDate: DateTime(2025),
lastDate: DateTime(2101), lastDate: DateTime(2125),
); );
if (pickedDate != null) { if (pickedDate != null) {
date.value = pickedDate; date.value = pickedDate;
@ -186,7 +154,7 @@ class EnterpriseListPage extends GetView<EnterpriseListController> {
), ),
child: Obx( child: Obx(
() => Text( () => Text(
date.value == null ? '请选择日期' : date.value!.toDateTimeString(), date.value == null ? '请选择日期' : date.value!.toDateString(),
style: TextStyle( style: TextStyle(
color: date.value == null ? Colors.grey[600] : Colors.black87, 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]; get currentPage => pages[selectedIndex.value];
@override
void onInit() {
super.onInit();
updateFabUploadPosition(Offset.infinite);
snapToEdge();
}
void changePageIndex(int index) { void changePageIndex(int index) {
selectedIndex.value = index; selectedIndex.value = index;
} }
@ -85,11 +92,11 @@ class NavigationController extends GetxController {
case 1: // case 1: //
Get.log("当前在企业页面,准备跳转到企业数据上传页..."); Get.log("当前在企业页面,准备跳转到企业数据上传页...");
// 使 // 使
// Get.toNamed(AppRoutes.ENTERPRISE_UPLOAD); Get.toNamed(AppRoutes.enterpriseUpload);
break; break;
case 2: // case 2: //
Get.log("当前在问题页面,准备跳转到问题上传页..."); Get.log("当前在问题页面,准备跳转到问题上传页...");
// Get.toNamed(AppRoutes.PROBLEM_UPLOAD); Get.toNamed(AppRoutes.problemUpload);
break; break;
default: default:
// //

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

@ -1,11 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.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/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/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> { class ProblemPage extends GetView<ProblemController> {
const ProblemPage({super.key}); const ProblemPage({super.key});
@ -13,38 +13,9 @@ class ProblemPage extends GetView<ProblemController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBarAdd(
title: Text( titleName: '问题列表',
'问题列表', onAddPressed: () => controller.toProblemFormPageAndRefresh(),
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: () {},
),
],
), ),
body: Column( body: Column(
children: [ children: [
@ -59,65 +30,65 @@ class ProblemPage extends GetView<ProblemController> {
], ],
), ),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked, // floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,
// 使 Stack // 使 Stack
floatingActionButton: Stack( // floatingActionButton: Stack(
children: [ // children: [
// "添加" // // "添加"
// 使 Align Positioned // // 使 Align Positioned
Align( // Align(
alignment: Alignment.bottomCenter, // alignment: Alignment.bottomCenter,
child: Padding( // child: Padding(
padding: EdgeInsets.only(bottom: 24.h), // // padding: EdgeInsets.only(bottom: 24.h), //
child: FloatingActionButton( // child: FloatingActionButton(
heroTag: "btn_add", // heroTag: "btn_add",
onPressed: () { // onPressed: () {
controller.toProblemFormPageAndRefresh(); // controller.toProblemFormPageAndRefresh();
}, // },
shape: const CircleBorder(), // shape: const CircleBorder(),
backgroundColor: Colors.blue[300], // backgroundColor: Colors.blue[300],
foregroundColor: Colors.white, // foregroundColor: Colors.white,
child: const Icon(Icons.add), // child: const Icon(Icons.add),
), // ),
), // ),
), // ),
// "上传" // // "上传"
Obx(() { // Obx(() {
final isOnline = controller.isOnline.value; // final isOnline = controller.isOnline.value;
return Positioned( // return Positioned(
// 使left/right dxtop/bottom dy // // 使left/right dxtop/bottom dy
left: controller.fabUploadPosition.value.dx, // left: controller.fabUploadPosition.value.dx,
top: controller.fabUploadPosition.value.dy, // top: controller.fabUploadPosition.value.dy,
child: GestureDetector( // child: GestureDetector(
onPanUpdate: (details) { // onPanUpdate: (details) {
// // //
controller.updateFabUploadPosition(details.delta); // controller.updateFabUploadPosition(details.delta);
}, // },
onPanEnd: (details) { // onPanEnd: (details) {
// // //
controller.snapToEdge(); // controller.snapToEdge();
}, // },
child: FloatingActionButton( // child: FloatingActionButton(
heroTag: "btn_upload", // heroTag: "btn_upload",
onPressed: isOnline // onPressed: isOnline
? () => controller.showUploadPage() // ? () => controller.showUploadPage()
: null, // : null,
foregroundColor: Colors.white, // foregroundColor: Colors.white,
backgroundColor: isOnline // backgroundColor: isOnline
? Colors.red[300] // ? Colors.red[300]
: Colors.grey[400], // : Colors.grey[400],
child: Icon( // child: Icon(
isOnline // isOnline
? Icons.file_upload_outlined // ? Icons.file_upload_outlined
: Icons.cloud_off_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/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.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/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'; import 'package:problem_check_system/app/features/problem/presentation/views/widgets/problem_card.dart';
class ProblemUploadPage extends GetView<ProblemController> { class ProblemUploadPage extends GetView<ProblemController> {
@ -11,7 +12,12 @@ class ProblemUploadPage extends GetView<ProblemController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: _buildAppBar(), appBar: UploadAppBar(
selectedCount: controller.selectedCount,
selectedAll: controller.allSelected.value,
buttonVisible: controller.unUploadedProblems.isNotEmpty,
onButtonPressed: controller.selectAll,
),
body: _buildBody(), body: _buildBody(),
bottomNavigationBar: _buildBottomBar(), 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