본문 바로가기
카테고리 없음

창2 부트캠프 3주차

by 땡칠이 2022. 6. 18.
반응형

이번주차는 의외로 더 오래거렸다. 위젯들 보니 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); 
}
  
}
반응형

댓글