|
@@ -0,0 +1,108 @@
|
|
|
+import 'package:calendar_view/popup_layer/popup_layer_controller.dart';
|
|
|
+import 'package:flutter/material.dart';
|
|
|
+import 'package:get/get.dart';
|
|
|
+
|
|
|
+class PopupLayer extends StatefulWidget {
|
|
|
+ const PopupLayer({super.key});
|
|
|
+
|
|
|
+ @override
|
|
|
+ State<PopupLayer> createState() => _PopupLayerState();
|
|
|
+}
|
|
|
+
|
|
|
+class _PopupLayerState extends State<PopupLayer> {
|
|
|
+ PopupLayerController popupLayerController = Get.find<PopupLayerController>();
|
|
|
+ GlobalKey moreSchedulePopupKey = GlobalKey();
|
|
|
+ @override
|
|
|
+ void initState() {
|
|
|
+ super.initState();
|
|
|
+ popupLayerController.onPopupMoreSchedule.addListener(_onPopupMoreSchedule);
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void dispose() {
|
|
|
+ super.dispose();
|
|
|
+ popupLayerController.onPopupMoreSchedule
|
|
|
+ .removeListener(_onPopupMoreSchedule);
|
|
|
+ }
|
|
|
+
|
|
|
+ void _onPopupMoreSchedule(e, GlobalKey key) {
|
|
|
+ print('onPopupMoreSchedule $key');
|
|
|
+ setState(() {
|
|
|
+ moreSchedulePopupKey = key;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ Widget build(BuildContext context) {
|
|
|
+ return _buildMoreSchedulePopup(moreSchedulePopupKey);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Widget _buildMoreSchedulePopup(GlobalKey trigger) {
|
|
|
+ print('触发了弹出显示更多 Key: $trigger');
|
|
|
+ final Size triggerSize = getWidgetSize(trigger);
|
|
|
+ final Offset triggerOffset = getWidgetOffset(trigger);
|
|
|
+ print('触发者尺寸: $triggerSize');
|
|
|
+ print('触发者位置: $triggerOffset');
|
|
|
+ final Offset popupOffset =
|
|
|
+ _calcPopupLayerOffset(triggerOffset, triggerSize);
|
|
|
+ print('计算得的弹出层位置: $popupOffset');
|
|
|
+ return Container(
|
|
|
+ decoration: BoxDecoration(
|
|
|
+ color: Colors.white,
|
|
|
+ borderRadius: BorderRadius.circular(8),
|
|
|
+ border: Border.all(color: Colors.black12, width: 1),
|
|
|
+
|
|
|
+
|
|
|
+ boxShadow: const [
|
|
|
+ BoxShadow(
|
|
|
+ color: Colors.black12,
|
|
|
+ offset: Offset(3, 3),
|
|
|
+ blurRadius: 25,
|
|
|
+ ),
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ width: 240,
|
|
|
+ height: 400,
|
|
|
+ child: Text(popupLayerController.currMoreScheduleData.toString()),
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Size getWidgetSize(GlobalKey key) {
|
|
|
+ try {
|
|
|
+ final RenderBox renderBox =
|
|
|
+ key.currentContext?.findRenderObject() as RenderBox;
|
|
|
+ return renderBox.size;
|
|
|
+ } catch (e) {
|
|
|
+ return Size.zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Offset getWidgetOffset(GlobalKey key) {
|
|
|
+ try {
|
|
|
+ final RenderBox renderBox =
|
|
|
+ key.currentContext?.findRenderObject() as RenderBox;
|
|
|
+ return renderBox.localToGlobal(Offset.zero);
|
|
|
+ } catch (e) {
|
|
|
+ return Offset.zero;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ Offset _calcPopupLayerOffset(Offset triggerOffset, Size triggerSize) {
|
|
|
+ final double triggerCenterX = triggerOffset.dx + triggerSize.width / 2;
|
|
|
+ final double triggerCenterY = triggerOffset.dy + triggerSize.height / 2;
|
|
|
+ final double popupLayerWidth = 240;
|
|
|
+ final double popupLayerHeight = 400;
|
|
|
+ final double popupLayerCenterX = triggerCenterX - popupLayerWidth / 2;
|
|
|
+ final double popupLayerCenterY = triggerCenterY - popupLayerHeight / 2;
|
|
|
+ return Offset(popupLayerCenterX, popupLayerCenterY);
|
|
|
+ }
|
|
|
+}
|