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

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

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



memo_service.dart 에서

Memo(content: '새 메모 22'), 라고 적어도 반영이 안됩니다.

main.dart에 알수 없는 애러가 나와


: Error: The getter 'memoService' isn't defined for the class '_HomePageState'.

package:mymemo/main.dart:48

- '_HomePageState' is from 'package:mymemo/main.dart' ('lib/main.dart').

package:mymemo/main.dart:1

Try correcting the name to the name of an existing getter, or defining a getter or field named 'memoService'.

List<Memo> memoList = memoService.memoList;

^^^^^^^^^^^

수정하려고 했더니 더 많은 애러가 나옵니다





스파르타 즉문즉답




작성한 코드 및 에러 메세지

//main.dart

import 'package:flutter/cupertino.dart';

import 'package:flutter/material.dart';

import 'package:provider/provider.dart';




import 'memo_service.dart';




void main() {

  runApp(

    MultiProvider(

      providers: [

        // app 최상단에 provider

        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> {

  // List<String> memoList = ['장보기 목록: 사과, 양파', 'new memo']; // 전체 메모 목록

  // memoService로 부터 memoList 가져오기 List<Memo> memoList = memoService.memoList;

  // 예가 아래 삽입 되면서 main 에서 List 를 가져오지 않고 memo_Service.dart 에서 momoList 를 가지고 온다




  @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: Center(child: Text("메모를 작성해주세요")),

        body: memoList.isEmpty

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

            // : 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: () {

                      // 아이템 클릭시

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

                      // Navigator.push(

                      //   context,

                      //   MaterialPageRoute(

                      //     builder: (_) => DetailPage(

                      //       index: index,

                      //       memoList: memoList,

                      //     ),

                      //   ),

                      // );

                    },

                  );

                },

              ),

        floatingActionButton: FloatingActionButton(

          child: Icon(Icons.add),

          onPressed: () {

            // + 버튼 클릭시 메모 생성 및 수정 페이지로 이동

            // String memo = ''; // 빈 메모 내용 추가

            // setState(() {

            //   memoList.add(memo);

            // }); // 누ㄹ를때 마다 메모 추가 화면 새로 고침

            // // 1. memoList 에 memo 추가 2. setState 를 통한 화면 갱신 3. 화면에 추가된 메모 표시

            // Navigator.push(

            //   context,

            //   MaterialPageRoute(

            //     builder: (_) => DetailPage(

            //       index: memoList.indexOf(memo),

            //       memoList: memoList,

            //     ),

            //   ),

            // );

          },

        ),

      );

    });

  }

}




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

class DetailPage extends StatelessWidget {

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




  final List<String> memoList;

  final int index;




  TextEditingController contentController = TextEditingController();




  @override

  Widget build(BuildContext context) {

    contentController.text = memoList[index]; // memoList 의 index 번째 데이터를 넘겨받는 것

    // 메모 클릭해서 들어갈때 내용을 보여주는 액션

    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: () {

                          // Navigator.pop(context);

                          memoList.removeAt(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) {

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

            // print(value);

            memoList[index] = value;

          },

        ),

      ),

    );

  }

}


//memo_service.dart

import 'package:flutter/material.dart';




// ignore: unused_import

import 'main.dart';




// Memo 데이터의 형식을 정해줍니다. 추후 isPinned, updatedAt 등의 정보도 저장할 수 있습니다.

class Memo {

  Memo({

    required this.content,

  });




  String content;

}




// Memo 데이터는 모두 여기서 관리

class MemoService extends ChangeNotifier {

  List<Memo> memoList = [

    Memo(content: '장보기 목록: 사과, 양파'), // 더미(dummy) 데이터

    Memo(content: '새 메모 22'), // 더미(dummy) 데이터

  ];

}






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