
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
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) 데이터
];
}
