Browse Source

feat : 导航页上传按钮

dev
徐振升 2 weeks ago
parent
commit
761ae03cdd
  1. 2
      lib/app/core/bindings/initial_binding.dart
  2. 7
      lib/app/features/navigation/presentation/bindings/navigation_binding.dart
  3. 77
      lib/app/features/navigation/presentation/controllers/navigation_controller.dart
  4. 44
      lib/app/features/navigation/presentation/pages/navigation_page.dart

2
lib/app/core/bindings/initial_binding.dart

@ -24,7 +24,7 @@ class InitialBinding implements Bindings {
Get.put<GetStorage>(GetStorage(), permanent: true); Get.put<GetStorage>(GetStorage(), permanent: true);
Get.put<Uuid>(Uuid(), permanent: true); Get.put<Uuid>(Uuid(), permanent: true);
Get.put<HttpProvider>(HttpProvider()); Get.put<HttpProvider>(HttpProvider());
// Get.put<SQLiteService>(SQLiteService()); Get.put<SQLiteService>(SQLiteService());
Get.put<DatabaseService>(DatabaseService()); Get.put<DatabaseService>(DatabaseService());
Get.put<NetworkStatusService>(NetworkStatusService()); Get.put<NetworkStatusService>(NetworkStatusService());
Get.put(UpgraderService()); Get.put(UpgraderService());

7
lib/app/features/navigation/presentation/bindings/navigation_binding.dart

@ -1,6 +1,7 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:problem_check_system/app/core/models/problem_sync_status.dart'; import 'package:problem_check_system/app/core/models/problem_sync_status.dart';
import 'package:problem_check_system/app/core/repositories/auth_repository.dart'; import 'package:problem_check_system/app/core/repositories/auth_repository.dart';
import 'package:problem_check_system/app/core/services/network_status_service.dart';
import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart'; import 'package:problem_check_system/app/features/problem/data/repositories/problem_repository.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart'; import 'package:problem_check_system/app/features/enterprise/presentation/controllers/enterprise_list_controller.dart';
import 'package:problem_check_system/app/features/navigation/presentation/controllers/navigation_controller.dart'; import 'package:problem_check_system/app/features/navigation/presentation/controllers/navigation_controller.dart';
@ -11,7 +12,11 @@ class NavigationBinding extends Bindings {
@override @override
void dependencies() { void dependencies() {
/// ///
Get.lazyPut<NavigationController>(() => NavigationController()); Get.lazyPut<NavigationController>(
() => NavigationController(
networkStatusService: Get.find<NetworkStatusService>(),
),
);
Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find())); Get.put(ProblemStateManager(uuid: Get.find(), authRepository: Get.find()));
Get.lazyPut<EnterpriseListController>(() => EnterpriseListController()); Get.lazyPut<EnterpriseListController>(() => EnterpriseListController());

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

@ -1,5 +1,8 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/routes/app_routes.dart';
import 'package:problem_check_system/app/core/services/network_status_service.dart';
import 'package:problem_check_system/app/features/enterprise/presentation/pages/enterprise_list_page.dart'; import 'package:problem_check_system/app/features/enterprise/presentation/pages/enterprise_list_page.dart';
import 'package:problem_check_system/app/features/home/views/home_page.dart'; import 'package:problem_check_system/app/features/home/views/home_page.dart';
import 'package:problem_check_system/app/features/my/views/my_page.dart'; import 'package:problem_check_system/app/features/my/views/my_page.dart';
@ -7,6 +10,17 @@ import 'package:problem_check_system/app/features/problem/presentation/views/pro
class NavigationController extends GetxController { class NavigationController extends GetxController {
var selectedIndex = 0.obs; var selectedIndex = 0.obs;
/// floatingButton
final double _fabSize = 56.0;
final double _edgePaddingX = 27.0.w;
final double _edgePaddingY = 111.0.h;
final fabUploadPosition = Offset(337.0, 703.7).obs;
final NetworkStatusService networkStatusService;
NavigationController({required this.networkStatusService});
/// get
RxBool get isOnline => networkStatusService.isOnline;
// //
final List<Widget> pages = [ final List<Widget> pages = [
const HomePage(), const HomePage(),
@ -20,4 +34,67 @@ class NavigationController extends GetxController {
void changePageIndex(int index) { void changePageIndex(int index) {
selectedIndex.value = index; selectedIndex.value = index;
} }
/// floatingButton更新位置
void updateFabUploadPosition(Offset delta) {
final screenWidth = ScreenUtil().screenWidth;
final screenHeight = ScreenUtil().screenHeight;
Offset newPosition = fabUploadPosition.value + delta;
//
double clampedDx = newPosition.dx.clamp(
_edgePaddingX,
screenWidth - _fabSize - _edgePaddingX,
);
//
double clampedDy = newPosition.dy.clamp(
_edgePaddingY,
screenHeight - _fabSize - _edgePaddingY,
);
fabUploadPosition.value = Offset(clampedDx, clampedDy);
}
/// floatingButton
void snapToEdge() {
final screenWidth = ScreenUtil().screenWidth;
//
final buttonCenterDx = fabUploadPosition.value.dx + _fabSize / 2;
double newDx;
//
if (buttonCenterDx < screenWidth / 2) {
// _edgePaddingX
newDx = _edgePaddingX;
} else {
// _edgePaddingX
newDx = screenWidth - _fabSize - _edgePaddingX;
}
//
fabUploadPosition.value = Offset(newDx, fabUploadPosition.value.dy);
}
void handleFabUploadTap() {
// 使 switch
switch (selectedIndex.value) {
case 1: //
Get.log("当前在企业页面,准备跳转到企业数据上传页...");
// 使
// Get.toNamed(AppRoutes.ENTERPRISE_UPLOAD);
break;
case 2: //
Get.log("当前在问题页面,准备跳转到问题上传页...");
// Get.toNamed(AppRoutes.PROBLEM_UPLOAD);
break;
default:
//
Get.snackbar("提示", "当前页面没有可上传的内容", snackPosition: SnackPosition.BOTTOM);
break;
}
}
} }

44
lib/app/features/navigation/presentation/pages/navigation_page.dart

@ -1,3 +1,5 @@
// lib/app/features/navigation/presentation/pages/navigation_page.dart
import 'package:curved_navigation_bar/curved_navigation_bar.dart'; import 'package:curved_navigation_bar/curved_navigation_bar.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -8,22 +10,58 @@ class NavigationPage extends GetView<NavigationController> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( // 1. Stack
return Stack(
children: [
// 2. Scaffold Stack
Scaffold(
// 3. Scaffold floatingActionButton
bottomNavigationBar: CurvedNavigationBar( bottomNavigationBar: CurvedNavigationBar(
backgroundColor: Colors.transparent, backgroundColor: Colors.transparent,
color: Colors.blueAccent, color: Colors.blueAccent,
items: <Widget>[ items: const <Widget>[
Icon(Icons.home, color: Colors.white, size: 30), Icon(Icons.home, color: Colors.white, size: 30),
Icon(Icons.business, color: Colors.white, size: 30), Icon(Icons.business, color: Colors.white, size: 30),
Icon(Icons.list, color: Colors.white, size: 30), Icon(Icons.list, color: Colors.white, size: 30),
Icon(Icons.person, color: Colors.white, size: 30), Icon(Icons.person, color: Colors.white, size: 30),
], ],
onTap: (index) { onTap: (index) {
//Handle button tap
controller.changePageIndex(index); controller.changePageIndex(index);
}, },
), ),
body: Obx(() => controller.currentPage), body: Obx(() => controller.currentPage),
),
// 4. Stack 使 Positioned
Obx(() {
final isOnline = controller.isOnline.value;
return Positioned(
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.handleFabUploadTap()
: null,
foregroundColor: Colors.white,
backgroundColor: isOnline ? Colors.red[300] : Colors.grey[400],
child: Icon(
isOnline
? Icons.file_upload_outlined
: Icons.cloud_off_outlined,
),
),
),
);
}),
],
); );
} }
} }

Loading…
Cancel
Save