반응형
이번주차는 의외로 더 오래거렸다. 위젯들 보니 provider등 내가 구현해 보고 싶은 위젯 및 기능들이였다. 강사님 말씀처럼 3번 이상 연습하고 이해하면 앞으로 구현해낼때 도움이 많이 될거 같다. 창업세션 말씀 처럼 나역시 어렵고 복잡하고 완성도 높은 것보다, 아이디어는 있고 빠르게 나가려고 한다. 가슴에 와닿는 말씀이였다..
main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'diary_service.dart';
import 'home_page.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
SharedPreferences prefs = await SharedPreferences.getInstance();
runApp(
MultiProvider(
providers: [
ChangeNotifierProvider(create: (context) => DiaryService(prefs)),
],
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
home_page.dart
import 'package:diary/diary_service.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import 'package:table_calendar/table_calendar.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
DateTime selectedDate = DateTime.now();
TextEditingController updateTextController = TextEditingController();
@override
Widget build(BuildContext context) {
return Consumer<DiaryService>(
builder: (context, diaryService, child) {
List<Diary> diaryList = diaryService.getByDate(selectedDate);
return Scaffold(
body: SafeArea(
child: Column(
children: [
TableCalendar(
firstDay: DateTime.utc(2010, 10, 16),
lastDay: DateTime.utc(2030, 3, 14),
focusedDay: DateTime.now(),
selectedDayPredicate: (day) {
return isSameDay(selectedDate, day);
},
onDaySelected: (_, focusedDay) {
setState(() {
selectedDate = focusedDay;
});
},
eventLoader: (date) {
return diaryService.getByDate(date);
}),
Divider(),
Expanded(
child: ListView.builder(
itemCount: diaryList.length,
itemBuilder: (context, index) {
Diary diary = diaryList[index];
return ListTile(
title: Text(diary.text),
trailing:
Text(DateFormat('kk:mm').format(diary.createdAt)),
onLongPress: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text("일기 삭제"),
content: Text("${diary.text}를 삭제하시겠습니까?"),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text("취소")),
TextButton(
onPressed: () {
diaryService.delete(diary.createdAt);
Navigator.pop(context);
}, child: Text("삭제")),
],
);
},
);
},
onTap: () {
showDialog(
context: context,
builder: (context) {
updateTextController.text = diary.text;
return AlertDialog(
title: Text("일기 수정"),
content: TextField(
controller: updateTextController,
onSubmitted: (text) {
if (text.isNotEmpty) {
diaryService.update(
diary.createdAt, text);
}
Navigator.pop(context);
},
),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text("취소")),
TextButton(
onPressed: () {}, child: Text("수정")),
],
);
},
);
},
);
},
),
)
],
),
),
floatingActionButton: FloatingActionButton(
child: Icon(Icons.create),
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text("일기 작성"),
content: TextField(
onSubmitted: (text) {
//작성하기 로직
if (text.isNotEmpty) {
diaryService.create(text, selectedDate);
}
Navigator.pop(context);
},
),
actions: [
TextButton(
onPressed: () {
Navigator.pop(context);
},
child: Text("취소")),
TextButton(onPressed: () {}, child: Text("작성")),
],
);
},
);
},
),
);
},
);
}
}
diary_service.dart
import 'dart:convert';
import 'dart:html';
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:table_calendar/table_calendar.dart';
class Diary {
String text; // 내용
DateTime createdAt; // 작성 시간
Diary({
required this.text,
required this.createdAt,
});
Map<String, dynamic> toJson(){
return{
"text": text,
"createdAt": createdAt.toString(),
};
}
factory Diary.fromJson(Map<String, dynamic> jsonMap){
return Diary(
text: jsonMap['text'],
createdAt: DateTime.parse(jsonMap['created']),
);
}
}
class DiaryService extends ChangeNotifier {
SharedPreferences prefs;
DiaryService(this.prefs){
List<String> stringDiaryList = prefs.getStringList("diaryList") ?? [];
for (String stringDiary in stringDiaryList){
Map<String, dynamic> jsonMap = jsonDecode(stringDiary);
Diary diary = Diary.fromJson(jsonMap);
diaryList.add(diary);
}
}
/// Diary 목록
List<Diary> diaryList = [
];
//DiaryService(SharedPreferences prefs);
/// 특정 날짜의 diary 조회
List<Diary> getByDate(DateTime date) {
// TODO : 아래 내용을 지우고 구현해주세요.
return diaryList
.where((diary) => isSameDay(date, diary.createdAt))
.toList();
}
/// Diary 작성
void create(String text, DateTime selectedDate) {
// TODO
DateTime now = DateTime.now();
DateTime createdAt = DateTime(
selectedDate.year,
selectedDate.month,
selectedDate.day,
now.hour,
now.minute,
now.second,
);
Diary diary = Diary(
text: text,
createdAt: createdAt,
);
diaryList.add(diary);
notifyListeners();
_saveDiaryList();
}
/// Diary 수정
void update
(DateTime createdAt, String newContent) {
Diary diary = diaryList.firstWhere((diary) =>
diary.createdAt == createdAt
);
diary.text = newContent;
notifyListeners();
_saveDiaryList();
// TODO
}
/// Diary 삭제
void delete (DateTime createdAt) {
diaryList.removeWhere((diary) =>
diary.createdAt == createdAt
);
notifyListeners();
_saveDiaryList();
// TODO
}
void _saveDiaryList(){
List<String> stringDiaryList = [];
for (Diary diary in diaryList){
Map<String, dynamic> jsonMap = diary.toJson();
String stringDiary = jsonEncode(jsonMap);
stringDiaryList.add(stringDiary);
}
prefs.setStringList("diaryList", stringDiaryList);
}
}
반응형
댓글