$ flutter pub add provider
import 'package:flutter/material.dart';
import 'main.dart';
// Memo는 데이터의 형식을 지정
class Memo {
Memo({
required this.content,
});
String content;
)
// Memo의 데이터를 관리하는 곳
class MemoService extends ChangeNotifier {
List<Memo> memoList = [
Memo(content: "장보기 목록: 사과, 양파"), // 더미(dummy) 데이터
Memo(content: "새 메모"), // 더미(dummy) 데이터
];
)
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => MemoService()),
],
child: const MyApp(),
),
);
return Consumer<MemoService>(
builder: (context, memoService, child) {
return Scaffold(
...
);
}
);
List<Memo> memoList = memoService.memoList;
context.read를 이용
DetailPage({super.key, required this.index});
final int index;
TextEditingController contentController = TextEditingController();
Widget build(BuildContext context) {
MemoService memoService = context.read<MemoService>();
Memo memo = memoService.memoList[index];
contentController.text = memo.content;
...
}
Navigator 수정
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => DetailPage(
index: index,
),
),
);
}
createMemo({required String content}) {
Memo memo = Memo(content: content);
memoList.add(memo);
notifyListeners(); // Consumer<MemoService>의 builder 부분을 호출해서 화면을 새로고침
}
floatingActionButton: FloatingActionButton(
child: Icon(Icons.add),
onPressed: () {
// + 버튼 클릭시 메모 생성 및 수정 페이지로 이동
memoService.createMemo(content: "");
Navigator.push(
context,
MaterialPageRoute(
builder: (_) =>
DetailPage(index: memoService.memoList.length - 1),
),
);
}
)
updateMemo({required int index, required String content}) {
Memo memo = memoList[index];
memo.content = content;
notifyListeners();
}
TextField(
...
onChanged: (value) {
memoService.updateMemo(index: index, content: value);
}
)
deleteMemo({required int index}) {
memoList.removeAt(index);
notifyListeners();
saveMemoList();
}
// 확인 버튼
TextButton(
onPressed: () {
memoService.deleteMemo(index: index);
Navigator.pop(context); // 팝업 닫기
Navigator.pop(context); // HomePage로 가기
},
...
)