ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 커스텀 팝업 메뉴 샘플
    flutter 2023. 8. 1. 13:51
    //RightClickMenu or PopUp Menu
      PopupMenuItem _buildPopupMenuItem(
          {String value = 'func1',
          String name = 'untitled',
          IconData icon = Icons.abc,
          double width = 120,
          double height = 32}) {
        return PopupMenuItem(
            height: height,
            value: value,
            child: Row(
              children: [
                Container(width: width, child: Text(name)),
                Icon(
                  icon,
                  color: Colors.black,
                )
              ],
            ));
      }
    
      void _showPopupMenu(BuildContext context) async {
        // context의 상위에 존재하는 Overlay의 RenderBox를 가져옵니다.
        // 이는 화면 전체에 대한 렌더링 정보를 가지고 있습니다.
        final RenderBox overlay =
            Overlay.of(context).context.findRenderObject() as RenderBox;
    
        // context에 해당하는 위젯(여기서는 팝업을 띄울 버튼이라 가정)의 RenderBox를 가져옵니다.
        // 이는 버튼의 위치, 크기 등 렌더링 정보를 가지고 있습니다.
        final RenderBox button = context.findRenderObject() as RenderBox;
    
        // 팝업 메뉴에 표시될 항목들을 정의합니다.
        // 여기서는 '복사', '공유', '삭제' 세 가지 항목을 정의하였고, 각 항목에는 value, name, icon이 있습니다.
        final items = <PopupMenuEntry>[
          _buildPopupMenuItem(value: 'copy', name: '복사', icon: Icons.copy),
          _buildPopupMenuItem(value: 'share', name: '공유', icon: Icons.share),
          _buildPopupMenuItem(
              value: 'remove', name: '삭제', icon: Icons.delete_outline),
        ];
    
        // 팝업 메뉴가 표시될 위치를 정의합니다.
        // 이는 버튼의 위치를 기준으로 상대적인 위치를 계산하여 결정합니다.
        // button.localToGlobal는 버튼의 위치를 화면 좌표로 변환하고,
        // Offset.zero와 button.size.bottomRight(Offset.zero)는 각각 버튼의 왼쪽 상단과 오른쪽 하단의 위치입니다.
        // 이 두 점을 이어 사각형을 이루며, 이 사각형이 팝업 메뉴가 표시될 영역을 나타냅니다.
        final position = RelativeRect.fromRect(
          Rect.fromPoints(
            button.localToGlobal(Offset.zero, ancestor: overlay),
            button.localToGlobal(button.size.bottomRight(Offset.zero),
                ancestor: overlay),
          ),
          Offset.zero & overlay.size,
        );
    
        showMenu(
          context: context,
          position: position,
          items: items,
        ).then((value) {
          switch (value) {
            case 'copy':
              print('copy tap');
              _copyToClipboard();
              break;
    
            case 'share':
              print('share tap');
              _ShareToClipboard();
              break;
            case 'remove':
              print('remove tap');
              break;
            // 다른 메뉴 아이템들에 대한 처리를 여기에 추가...
          }
        });
      }
    
      void _copyToClipboard() {
        if (linkData.isNotEmpty) {
          /*
          //결과 linkData 포멧.. 
            {
              'title': title,
              'description': description,
              'url': url,
              'homepage': address,
              'thumbimage': thumbnailUrl
            };
        */
    
          var data = linkData![0];
          String url = '${data['url']!}';
    
          Clipboard.setData(ClipboardData(text: url));
        } else {
          Clipboard.setData(ClipboardData(text: message));
        }
      }
    
      void _ShareToClipboard() {
        if (linkData.isNotEmpty) {
          /*
          //결과 linkData 포멧.. 
            {
              'title': title,
              'description': description,
              'url': url,
              'homepage': address,
              'thumbimage': thumbnailUrl
            };
        */
          var data = linkData![0];
          String title = (data!['title'] != '') ? '제목: ${data['title']!}\n\n' : '';
          String description =
              (data!['description'] != '') ? '설명: ${data['description']!}\n\n' : '';
          String share_mention = '${title}${description}${data['url']!}';
    
          Clipboard.setData(ClipboardData(text: share_mention));
        } else {
          Clipboard.setData(ClipboardData(text: message));
        }
      }
Designed by Tistory.