Contents

Flutter의 PopupMenuButton 위젯

컨텍스트 메뉴를 추가로 보여주기 위한 PopupMenuButton 사용법을 알아보자.



리스트로 여러 아이템을 보여줄 때, 각 아이템들에 대해 삭제 등의 기능을 추가하고 싶었다. (more 느낌의 버튼)
Flutter 에는 PopupMenuButton이 해당 역할을 한다.



위 스크린 샷은 아래 코드의 결과이다.

import 'package:flutter/material.dart';

void main() => runApp(const PopupMenuButtonDemo());

class PopupMenuButtonDemo extends StatelessWidget {
  const PopupMenuButtonDemo({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'PopupMenuButton Demo',
      home: Scaffold(
        appBar: AppBar(
          title: const Text('PopupMenuButton Demo'),
        ),
        body: const PopupMenuButtonPage(),
      ),
    );
  }
}

// 추가 기능 여러개 일때, enum 으로 관리하는 게 좋아 보임
enum MenuType {
  first,
  second,
  third,
}

class PopupMenuButtonPage extends StatelessWidget {
  const PopupMenuButtonPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Center(
      child: ListTile(
        title: const Text("Test Item"),
        trailing: PopupMenuButton<MenuType>(  // 오늘의 주인공, PopupMenuButton. 뒤에 <>안에 type 적어주는 게 깔끔해 보임
          // 선택된 버튼에 따라 원하는 로직 수행. (여기서는 SnackBar 표시)
          onSelected: (MenuType result) {             
            final snackBar = SnackBar(
              content: Text("$result is selected."),
            );
            ScaffoldMessenger.of(context).showSnackBar(snackBar);
          },
          // itemBuilder 에서 PopMenuItem 리스트 리턴해줘야 함.
          itemBuilder: (BuildContext buildContext) {
            return [              
              for (final value in MenuType.values)
                PopupMenuItem(
                  value: value,
                  child: Text(value.toString()),
                )
            ];
          },
        ),
      ),
    );
  }
}


Flutter Gallery 의 아래 항목에서 예제를 확인해 볼 수 있다.


App bar 에서도 사용된다.



적당히 바꿔서 테스트도 해보자.





Related Content