123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- import 'dart:math';
- import 'package:calendar_view/calendar_page/month_calendar/more_schedule_popup.dart';
- 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>();
- bool _isShowPopup = false;
- 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) {
- setState(() {
- _isShowPopup = true;
- moreSchedulePopupKey = key;
- });
- }
- @override
- Widget build(BuildContext context) {
- return _isShowPopup
- ? Listener(
- behavior: HitTestBehavior.translucent,
- onPointerUp: (event) {
- setState(() {
- _isShowPopup = false;
- });
- },
- child: _buildMoreSchedulePopup(moreSchedulePopupKey),
- )
- : Container();
- }
- /// 只做容器而无需负责内容
- /// [trigger] 触发器的 key
- Widget _buildMoreSchedulePopup(GlobalKey trigger) {
- final Size triggerSize = getWidgetSize(trigger);
- final Offset triggerOffset = getWidgetOffset(trigger);
- return Flow(
- delegate: AutoAlignFlowDelegate(triggerOffset),
- children: [
- 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: max(triggerSize.width, 220),
- child: MoreSchedulePopup(
- scheduleData: popupLayerController.currMoreScheduleData,
- ),
- ),
- ],
- );
- }
- static const double _popupLayerMarginTop = 70;
- static const double _popupLayerMarginLeft = 240;
- /// 通过组件的 key 获取对应的组件的大小信息
- /// [key] 组件的 key
- Size getWidgetSize(GlobalKey key) {
- try {
- final RenderBox renderBox =
- key.currentContext?.findRenderObject() as RenderBox;
- return renderBox.size;
- } catch (e) {
- print('获取大小信息失败: $e');
- return Size.zero;
- }
- }
- /// 通过组件的 key 获取对应的组件在弹出层的位置
- /// [key] 组件的 key
- Offset getWidgetOffset(GlobalKey key) {
- try {
- final RenderBox renderBox =
- key.currentContext?.findRenderObject() as RenderBox;
- return renderBox
- .localToGlobal(Offset.zero)
- .translate(-_popupLayerMarginLeft, -_popupLayerMarginTop);
- } catch (e) {
- print('获取位置信息失败: $e');
- return Offset.zero;
- }
- }
- }
- /// 自动对齐委托
- class AutoAlignFlowDelegate extends FlowDelegate {
- final Offset triggerOffset;
- AutoAlignFlowDelegate(this.triggerOffset);
- @override
- void paintChildren(FlowPaintingContext context) {
- final Size containerSize = context.size;
- for (int i = 0; i < context.childCount; i++) {
- final Size childSize = context.getChildSize(i) ?? Size.zero;
- double x = triggerOffset.dx;
- double y = triggerOffset.dy;
- if (containerSize.height - y < childSize.height) {
- y = containerSize.height - childSize.height;
- }
- if (containerSize.width - x < childSize.width) {
- x = containerSize.width - childSize.width;
- }
- context.paintChild(i, transform: Matrix4.translationValues(x, y, 0));
- }
- }
- @override
- bool shouldRepaint(FlowDelegate oldDelegate) {
- return oldDelegate != this;
- }
- }
|