Building an Android To-Do App with Jetpack Compose, Room, Retrofit, Clean Architecture, & More

preview_player
Показать описание
This video is one of the SkyFish Mini-Project walkthroughs.

Topics: Jetpack Compose, Clean Architecture, Firebase, Dagger-Hilt, Room, Retrofit

YouTube Chapters / Checkpoints:
0:00 - Intro
1:28 - Hire SkyFish
4:29 - Project Setup, Dependency, Package Structure, and Theme Setup
22:23 - Room DB, Entity, DAO, Dagger-Hilt DI Module
35:20 - Retrofit, API, DI Module functions, Domain Model, Mappers
1:07:24 - Repository & Repository Implementation
1:30:17 - Domain Layer Use Cases
1:57:29 - State, Event, and View Model for the Main Todo List Screen
2:24:10 - UI & Composables for the Main Todo List Screen
4:08:05 - Composables, State, Event, and View Model for the Add/Edit Todo Page
5:18:13 - Conclusion

Initial Commit - New Project

Checkpoint 1 - Dependency, Package Structure, and Theme Setup

Checkpoint 2 - Room DB, Entity, DAO, Dagger-Hilt DI Module

Checkpoint 3 - Retrofit, API, DI Module functions, Domain Model

Checkpoint 4 - Repository & Repository Implementation

Checkpoint 5 - Domain Layer Use Cases

Checkpoint 6 - State, Event, and View Model for the Main Todo List Screen

Checkpoint 7 - UI & Composables for the Main Todo List Screen

Checkpoint 8 - Composables, State, Event, and View Model for the Add/Edit Todo Page

Our Website:

Please leave a comment below with your feedback or questions. I would be happy to answer any questions and also look forward to hearing what project tutorials you would be interested in seeing next.
Рекомендации по теме
Комментарии
Автор

I always love to hear him say "This is gonna be... fun... todo..."😄

TsumitaTenshi
Автор

I learnt a lot in my budding Android dev career! Thanks for the great tutorial..Looking forward to more projects

lordfelix
Автор

This seems like an excellent tutorial so far (at Checkpoint 1). Smooth presentation and you do a good explanation of why you are doing things instead of just typing. I like that you included M3 theme builder. Subscribed and liked -- let's see how the remainder of the course goes 🙂

ubersticks
Автор

I am really enjoying this video. FYI, at 2:55:25 I think the general guidance is to use the passed-in "modifier" parameter only in the outermost container of the screen, not all of the sub-containers. This would be the Card() for our case.

ubersticks
Автор

That intro though! Talk about complicated. I like the "I Give Up" alternative you offer 😅

kristenfischer
Автор

I searched on Google Gemini
To do app
And found this video
Very nice

kgadgets
Автор

nice tutorial, I learn a lot of from it, thank you

nqmgaming
Автор

Thanks for the great tutorial... Thank sir

MasterMystic-Firefly
Автор

I'm at checkpoint 4. I would do somethings differently. But I don't know everything so I might be wrong. All I'm saying is I would've at least toasted "no internet* somewhere.

dansylvester
Автор

Great work up to Checkpoint #7! Notes for your editing.

At 04:08:33 You are not sharing the screen that you are demonstrating.
At 04:00:04 (and earlier) your Project view is not visible on the left pane, so whatever you click over there is a guess for us.

ubersticks
Автор

At 3:43:31 the top padding you are manually adding is not needed if you used the scaffold padding in the enclosing Column:
Column(
modifier = Modifier
.fillMaxSize()
*.padding(paddingValues = scaffoldPadding)*
) {
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(horizontal = 12.sdp)
) {

ubersticks
Автор

Thanks! Event and State are from the FlutterBloc?

funnymoment
Автор

Why do you save text into constants but not into resource file R?

funnymoment
Автор

What were your thoughts on NOT making the Dao a @Singleton in the DI module? It seems fine, since the Dao is stateless, but most times I see that marked with @Singleton.

ubersticks
Автор

At 1:19:32 Clean question -- what do you think about moving all of the URL details back into TodoApi (separation of concerns and all)?

There is no reason for the Repository to know about those details, the repository needs only to supply the TodoItem and the TodoApi knows everything it needs to form the API call.

ubersticks
Автор

How many years of experience have you hade in Android?

funnymoment
Автор

di, dto, dao too much.
why not name it same as web technology.
model, orm, etc etc

rizkiaprita
Автор

At 1:02:28 ... much easler to use the extension functions that you just created.
fun List<TodoEntity> = this.map{ it.toLocalEntity() }
fun List<TodoDto> = this.map{ it.toRemoteTodoDto() }
fun List<TodoItem> = this.map{ it.toTodoItem() }
fun List<TodoDto> = this.map{ it.toTodoDto() }
fun List<TodoEntity> = this.map{ it.toTodoEntity() }
fun List<TodoDto>.toTodoItem(): List<TodoItem> = this.map{ it.toTodoItem() }

ubersticks