Foggy day

[Flutter] PopupMenuButton - 사용법 본문

Flutter/Flutter widget

[Flutter] PopupMenuButton - 사용법

jinhan38 2023. 3. 21. 00:39

 

 

PopupMenuButton은 버튼을 클릭했을 때 팝업으로 여러 항목들을 보여줄 수 있는 위젯입니다. 위젯의 사용법이 약간 까다롭고, 디테일한 UI를 수정하는 부분에서 어려움이 있었습니다. 그래서 각각의 특성들을 한 번 자세히 알아보겠습니다. 

특성들에 대한 설명은 주석으로 상세히 달아놓았고, 아이템을 클릭할 때 splashColor설정이 안 돼서 Theme위젯을 사용했습니다. 

 

 

 

Full code

import 'package:flutter/material.dart';

class PopupMenuButtonScreen extends StatefulWidget {
  const PopupMenuButtonScreen({Key? key}) : super(key: key);

  @override
  State<PopupMenuButtonScreen> createState() => _PopupMenuButtonScreenState();
}

class _PopupMenuButtonScreenState extends State<PopupMenuButtonScreen> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("PopupMenuButton"),
      ),
      body: Center(child: _body()),
    );
  }

  Widget _body() {
    return Theme(
      data: Theme.of(context).copyWith(
        splashColor: Colors.yellow,
      ),
      child: PopupMenuButton<String>(
        /// 팝업 메뉴의 테두리와 round 처리
        shape: RoundedRectangleBorder(
          side: const BorderSide(width: 1, color: Colors.red),
          borderRadius: BorderRadius.circular(7),
        ),

        /// 팝업메뉴 펼쳐졌을 때 그림자 컬러
        shadowColor: Colors.red,

        /// z축 높이
        elevation: 30,

        /// 팝업메뉴의 배경 컬러
        /// icon이나 child 위젯을 선택하지 않을 때 나오는 기본 아이콘의 컬러
        color: Colors.green.shade700,

        /// LongPressed 일 때 나오는 툴팁
        /// "" 를 입력하면 안나옴
        tooltip: "",

        /// 팝업메뉴가 펼쳐질 때 위치설정
        /// over = 아이콘 위로 펼쳐짐
        /// under = 아이콘 아래에서 펼쳐짐
        position: PopupMenuPosition.under,

        /// itemBuilder에 들어간 String 값 중에
        /// initialValue와 동일하다면 선택된 효과
        initialValue: "팝업메뉴 2입니다",

        /// 펼쳤을 때 나오는 항목들 List<PopupMenuItem>
        itemBuilder: (context) {
          return [
            _menuItem("팝업메뉴 1입니다"),
            _menuItem("팝업메뉴 2입니다"),
            _menuItem("팝업메뉴 3입니다"),
          ];
        },

        /// 메뉴 아이템이 펼쳐졌을 때 호출
        onOpened: () {},

        /// 펼쳐진 항목 선택하지 않고, 배경 터치해서 취소한 경우
        onCanceled: () {},

        /// 선택한 값이 들어옴
        onSelected: (value) {},

        /// 펼쳐진 팝업메뉴의 사이즈 제한
        constraints: const BoxConstraints(minWidth: 50, maxWidth: 150),

        /// 메뉴아이템이 펼쳐지는 위치 변경
        /// Offset(20,20)이면 x축 오른쪽으로 20, y축 아래로 20 이동
        offset: const Offset(20, 20),

        /// child와 icon은 둘 중 한개만 사용 가능
        /// 둘 다 입력 안하면 기본 아이콘 출력
        // child: const Text("팝업메뉴 호출" ,style: TextStyle(fontSize: 30),),
        icon: const Icon(Icons.more_horiz),

        /// 아이콘 클릭했을 때 나오는 splash 물결 사이즈
        splashRadius: 60,

        /// 아이콘 사이즈
        iconSize: 50,

        /// padding은 아이콘 argument를 사용할 때만 적용
        /// child에는 적용 안됨
        padding: const EdgeInsets.all(50),

        /// true = 팝업메뉴 호출 가능
        /// false = 팝업메뉴 호출 불가능
        enabled: true,

        /// true = 클릭 사운드 on
        /// false = 클릭 사운드 off
        enableFeedback: true,
      ),
    );
  }

  PopupMenuItem<String> _menuItem(String text) {
    return PopupMenuItem<String>(
      enabled: true,

      /// 해당 항목 선택 시 호출
      onTap: () {},

      /// value = value에 입력한 값이 PopupMenuButton의 initialValue와 같다면
      /// 해당 아이템 선택된 UI 효과 나타남
      /// 만약 원하지 않는다면 Theme 에서 highlightColor: Colors.transparent 설정
      value: text,
      height: 70,
      child: Text(
        text,
        style: const TextStyle(color: Colors.white),
      ),
    );
  }
}

 

 

이미지

 

 

영상

 

 

 

 

'Flutter > Flutter widget' 카테고리의 다른 글

[Flutter] Image Widget - 사용법  (0) 2023.03.22
[Flutter] Text Widget - 사용법  (0) 2023.03.21
[Flutter] Row - 사용법  (0) 2023.03.20
[Flutter] Column - 사용법  (0) 2023.03.19
[Flutter] AppBar 사용법  (0) 2023.03.17