freezed를 통해
import 'package:freezed_annotation/freezed_annotation.dart';
part 'timetable_model.freezed.dart';
part 'timetable_model.g.dart';
class Timetable with _$Timetable {
const factory Timetable({
required String title,
required String subTitle,
required String professor,
required int color, // 0 = color1, 1 = color2 --- 3 = color4
required int startHr,
required int startMin,
required int endHr,
required int endMin,
required int day, // position
}) = _Timetable;
factory Timetable.fromJson(Map<String, dynamic> json) => _$TimetableFromJson(json);
}
이러한 모델을 만들어놨다. 가장 아래 코드는 json을 파싱하는 코드이다
직접 만즐 수 있으나 아마 다 freezed를 많이 이용할 거라 생각한다
Future<void> addTimetable(Timetable timetable) async {
await db.collection("test").doc().set(Timetable(
title : timetable.title,
professor: timetable.professor,
subTitle : timetable.subTitle,
color : timetable.color,
startHr : timetable.startHr,
startMin : timetable.startMin,
endHr : timetable.endHr,
endMin : timetable.endMin,
day : timetable.day,
).toJson());
}
아까 작성한 table 모델을 firestore에 넣으려면 db를 선언해야하는데
FirebaseFirestore db = FirebaseFirestore.instance;
이런 식으로 작성한다.
나는 Provider(di)쪽에 해당 라인을 작성했다
만일 Provider를 사용하지 않는다면 알맞은 방법으로 참고해서 바꿔주면 된다

또한 doc을 비워두면 임의로 난수를 설정하므로 원하는 쿼리가 있다면 해당 공란에 작성하면 된다
Future<void> addTimetable(Timetable timetable) async {
await db.collection("test").doc().set(Timetable({
title : timetable.title,
professor: timetable.professor,
subTitle : timetable.subTitle,
color : timetable.color,
startHr : timetable.startHr,
startMin : timetable.startMin,
endHr : timetable.endHr,
endMin : timetable.endMin,
day : timetable.day,
})
);
이런식으로 넣어버리면 Firestore에는 똑같이 보이지만 Json으로 파싱할 수 없기 때문에 오류가 발생한다.
데이터를 읽어오기 위해서는
Future<List<Timetable>> getTimetables() async {
QuerySnapshot<Map<String, dynamic>> snapshot = await db.collection("test").get();
List<Timetable> result = snapshot.docs.map((e) => Timetable.fromJson(e.data())).toList();
print(result);
return result;
}
test라는 collection의 스냅샷을 저장하고 Json을 파싱해준다. 그리고 list 형태로 리턴해서 사용하면 된다
이번 글은 클린아키텍처에서 Firestore에 데이터를 넣은 방법을 정리하였다 Update와 Delete는 더 쉬운 기능이니 기회가 있다면 다음 포스팅에 작성해보도록 할 것이다