커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
showDialog 리팩터링 관련
앱개발 종합반 - 플러터 v8
3주차
북마크
송*호
댓글
10
추천
0
조회수
56
조회수
56
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.


질문 내문

매소드 함수 분리를 위해 showDialog 클릭하면 Extract Method 선택하려고 하는데 안뜹니다.

같은 문제로 질문한 내용이 있었더라고요. 근데 해결책은 나오지 않습니다.

참고 : 이진선 -2023년 8워15일 오후 2:12 " showDialog >> Extract Method"


스파르타 즉문즉답




작성한 코드 및 에러 메세지

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!

import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';

import 'package:provider/provider.dart';


import 'memo_service.dart';


void main() {

  runApp(

    MultiProvider(

      providers: [

        ChangeNotifierProvider(create: (context) => MemoService()),

      ],

      child: const MyApp(),

    ),

  );

}


class MyApp extends StatelessWidget {

  const MyApp({super.key});


  @override

  Widget build(BuildContext context) {

    return MaterialApp(

      debugShowCheckedModeBanner: false,

      home: HomePage(),

    );

  }

}


// 홈 페이지

class HomePage extends StatefulWidget {

  const HomePage({super.key});


  @override

  State<HomePage> createState() => _HomePageState();

}


class _HomePageState extends State<HomePage> {

  @override

  Widget build(BuildContext context) {

    return Consumer<MemoService>(

      builder: (context, memoService, child) {

        // memoService로 부터 memoList 가져오기

        List<Memo> memoList = memoService.memoList;


        return Scaffold(

          appBar: AppBar(

            title: Text("mymemo"),

          ),

          body: memoList.isEmpty

              ? Center(child: Text("메모를 작성해 주세요"))

              : ListView.builder(

                  itemCount: memoList.length, // memoList 개수 만큼 보여주기

                  itemBuilder: (context, index) {

                    Memo memo = memoList[index]; // index에 해당하는 memo 가져오기

                    return ListTile(

                      // 메모 고정 아이콘

                      leading: IconButton(

                        icon: Icon(CupertinoIcons.pin),

                        onPressed: () {

                          print('$memo : pin 클릭 됨');

                        },

                      ),

                      // 메모 내용 (최대 3줄까지만 보여주도록)

                      title: Text(

                        memo.content,

                        maxLines: 3,

                        overflow: TextOverflow.ellipsis,

                      ),

                      onTap: () {

                        // 아이템 클릭시

                        Navigator.push(

                          context,

                          MaterialPageRoute(

                            builder: (_) => DetailPage(

                              index: index,

                            ),

                          ),

                        );

                      },

                    );

                  },

                ),

          floatingActionButton: FloatingActionButton(

            child: Icon(Icons.add),

            onPressed: () {

              memoService.createMemo(content: '');

              Navigator.push(

                context,

                MaterialPageRoute(

                  builder: (_) => DetailPage(

                    index: memoService.memoList.length - 1,

                  ),

                ),

              );

            },

          ),

        );

      },

    );

  }

}


// 메모 생성 및 수정 페이지

class DetailPage extends StatelessWidget {

  DetailPage({super.key, required this.index});


  final int index;


  TextEditingController contentController = TextEditingController();


  @override

  Widget build(BuildContext context) {

    MemoService memoService = context.read<MemoService>();

    Memo memo = memoService.memoList[index];


    contentController.text = memo.content;


    return Scaffold(

      appBar: AppBar(

        actions: [

          IconButton(

            onPressed: () {

              //삭제버튼

              showDialog(

                context: context,

                builder: (context) {

                  return AlertDialog(

                    title: Text("정말로 삭제하시겠습니까?"),

                    actions: [

                      // 취소 버튼

                      TextButton(

                        onPressed: () {

                          Navigator.pop(context);

                        },

                        child: Text("취소"),

                      ),

                      // 확인 버튼

                      TextButton(

                        onPressed: () {

                          memoService.deleteMemo(index: index);

                          Navigator.pop(context); // 팝업 닫기

                          Navigator.pop(context); // HomePage 로 가기

                        },

                        child: Text(

                          "확인",

                          style: TextStyle(color: Colors.pink),

                        ),

                      ),

                    ],

                  );

                },

              );

            },

            icon: Icon(Icons.delete),

          )

        ],

      ),

      body: Padding(

        padding: const EdgeInsets.all(16),

        child: TextField(

          controller: contentController,

          decoration: InputDecoration(

            hintText: "메모를 입력하세요",

            border: InputBorder.none,

          ),

          autofocus: true,

          maxLines: null,

          expands: true,

          keyboardType: TextInputType.multiline,

          onChanged: (value) {

            // 텍스트필드 안의 값이 변할 때

            memoService.updateMemo(index: index, content: value);

          },

        ),

      ),

    );

  }

}




취소
 공유
취소
댓글 0
댓글 알림
나의얼굴