Тёмный

How to Build a Clean Architecture Stock Market App 📈 (Jetpack Compose, Caching, SOLID) 

Philipp Lackner
Подписаться 175 тыс.
Просмотров 144 тыс.
50% 1

This video will teach you all the relevant concepts you need to build a solid app with the clean architectural guidelines. You'll learn to use dependency injection with Dagger-Hilt, SOLID principles, CSV parsing with OpenCSV, working with remote APIs using Retrofit, local caching with Room, custom drawing on a canvas using Compose and much more.
Get 10% off learning to build industry-level multi-module apps using the code STOCK-MARKET-APP:
pl-coding.com/multi-module-co...
or learn to create any custom UI you like using canvas:
elopage.com/s/philipplackner/...
Get my FREE PDF about 20 things you should never do in Jetpack Compose:
pl-coding.com/jetpack-compose...
Join this channel to get access to perks:
/ @philipplackner
Get the initial source code for this video here:
github.com/philipplackner/Sto...
Get the final source code here:
github.com/philipplackner/Sto...
Join my Discord server:
/ discord
Regular programming advice on my Instagram page: / _philipplackner_
Checkout my GitHub: github.com/philipplackner
You like my free content? Here you can buy me a coffee:
www.buymeacoffee.com/philippl...
Introduction (00:00)
Checkpoint 1 - API & DB Setup (09:26)
Checkpoint 2 - StockRepository (30:38)
Checkpoint 2 - CompanyListingsParser (51:12)
Checkpoint 3 - CompanyListingsViewModel (1:04:04)
Checkpoint 4 - Company Listings Screen + DI (1:16:29)
Checkpoint 5 - CompanyInfo Data (1:46:41)
Checkpoint 6 - CompanyInfoViewModel (2:09:14)
Checkpoint 7 - Stock Chart (2:17:50)
Checkpoint 8 - Company Info Screen (2:54:19)
Trying it out (3:04:50)

Опубликовано:

 

22 июл 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 261   
@matinaghalarkhani4802
@matinaghalarkhani4802 2 года назад
You are a lot more qualified than all those university teachers and proffessors. thumbs up my bro and hope to learn a lot more from you.
@PhilippLackner
@PhilippLackner 2 года назад
🙏❤️
@walrider7374
@walrider7374 Год назад
because a good teacher can't never stop learning
@tonnie7079
@tonnie7079 2 года назад
Just landed from Multi-Module Architecture and the ink on my Certificate is not even dry, thx Philipp for the exposure.
@osisuper98
@osisuper98 2 года назад
Dude is just unbelievable! You are the reason I have a job.
@PhilippLackner
@PhilippLackner 2 года назад
🙏🙏❤️
@chax255
@chax255 Месяц назад
I am next in that list
@harisai3580
@harisai3580 2 года назад
Never expected the entire video without parts. TQSM
@francismwangi9752
@francismwangi9752 Год назад
Thanks Phillip. I enjoyed every single bit of the video. I can't image how much more I'll learn and the skills I'll gain through the premium courses. I plan on buying one someday, to learn more and scale up. Thanks again
@fracta7
@fracta7 Год назад
This is a great tutorial. I have learnt many things from this. Many of the things I learnt here were applied on my personal project. Thank you for that!
@MuhammadPandam
@MuhammadPandam 2 года назад
Always love your tutorials. I learn a lot from you
@flowzk921
@flowzk921 2 года назад
Whew! finally finished this, learn't a lot, first time working with CSV rather than Json, many many Thanks Philip!!!
@fauzanajiprayoga2955
@fauzanajiprayoga2955 2 года назад
This is really good, thanks for sharing it for free. i'll save to my watch list. Can't wait to learn from here. You are my incredible online professor ... love from Indonesia
@maciejpelc9039
@maciejpelc9039 Год назад
Thank you my man, you are helping to create new generation of devs!
@ubersticks
@ubersticks 2 года назад
Thank you for your work Philipp. I enjoyed it and it is always educational to see your designs.
@PhilippLackner
@PhilippLackner 2 года назад
Thank you, glad it's helpful!
@Kylegil00
@Kylegil00 2 года назад
This videos have helped me so much. Thank you. Going to start this project today
@mohammadansar2987
@mohammadansar2987 2 года назад
thank you so much philipp, appreciated! your dedication and hard work.
@garrettstrobel7051
@garrettstrobel7051 2 года назад
This is so good. Thank you for the time and thought that went into this.
@faysaldeve385
@faysaldeve385 2 года назад
Thank you. I will watch this whole video because I really like it when the videos are long
@naveen12051990
@naveen12051990 2 года назад
Coded along the way till the end..very helpful looking forward for more.
@ChrisAthanas
@ChrisAthanas 2 года назад
I finished the app and added error handling, I learned a lot I fixed the date problem by using the first stock data day returned from api
@MetehanBOLAT
@MetehanBOLAT 2 года назад
Thank you very much Philipp. It is really a nice and necessary content for Android. Also, thank you for sharing it for free. We have a lot to learn from you. 👊
@raymondmichael4987
@raymondmichael4987 2 года назад
Sure this is a gold in it self, given for free his massive hours of work. We appreciate his work
@ThuyLe-mg3yi
@ThuyLe-mg3yi 2 года назад
L
@ThanhNguyen-se4hb
@ThanhNguyen-se4hb 2 года назад
@@raymondmichael4987 q
@MrVipulLal
@MrVipulLal 6 месяцев назад
All your videos are so good! Thanks!
@paulvickers8059
@paulvickers8059 2 года назад
This looks amazing, can't wait to start this tomorrow.
@jatinvashisht4293
@jatinvashisht4293 2 года назад
Just finished the video, hands down the best video on best practices I ever watched (including Philipps')
@PhilippLackner
@PhilippLackner 2 года назад
Thank you🙏
@osmanmusse9432
@osmanmusse9432 2 года назад
Thanks you Philip your really helping the android community out
@attiaaliattia
@attiaaliattia 2 года назад
This is a list of disadvantages of using extension functions instead of a dependency for the Data Mapper: Testing might be tricky: if you create a model in the repository class you can’t mock the mapping, so you are forced to test the mapping again. You lose the dependency inversion: when you are coding the repository you need to have the mapping beforehand, with the mapper instead you just put an interface and don’t care about the actual implementation. Also whenever you change the mapping your repository needs to be recompiled. Doesn’t work well with java, in case you have legacy code. Less reusability: by using a dependency the generic logic of the mapping can be extracted in another class. With an extension function you don’t have the same flexibility.
@orangasli2943
@orangasli2943 Год назад
Show some video and then talk
@DanielRodriguez-ds2qs
@DanielRodriguez-ds2qs 10 месяцев назад
@@orangasli2943 Why does he have to create a video to do so?, pointing things out is not wrong albeit he could have started the comment with something along the lines of "Great video!, (...) I do want to point out something, in my opinion (...)"
@ChaosFleischer
@ChaosFleischer 5 месяцев назад
Thank you for this Amazing Tutorial! After i fixed some gradle issues its running now!!!!
@furkanbademli8402
@furkanbademli8402 4 месяца назад
how to solve that? i m having gradle issues,too.
@AntonisKaklis
@AntonisKaklis 2 года назад
Great tutorial Philipp! Awesome content from you as always! Thank you. I would like to ask a question though. If we would like to add let's say Favorites functionality for some stocks. How we should approach this?
@Team_8x
@Team_8x 2 месяца назад
Thanks awesome, you are a great inspiration and teacher!
@federicocreti4699
@federicocreti4699 2 года назад
Good course, it has been a pleasure to follow! TY man
@sijanneupane
@sijanneupane 2 года назад
Added to my watch later! will surely follow next week 🔥❤
@mertgundogan2623
@mertgundogan2623 2 года назад
Thank you Philipp. Great tutorial. 👌
2 года назад
Very good video! Thanks a lot for your outstanding work here!!
@YouGuto
@YouGuto 2 года назад
Man! You are the best... looking forward for the Tests
@Usam43
@Usam43 2 года назад
Thank you so much, loved this video. I like what you do and how you do it. I would like to take my expertise to the next level, hope you would help me out on that. Hopefully, I will keep learning from you more in future 🙏. Take ❤ brother.
@miladhashemzadeh5626
@miladhashemzadeh5626 2 года назад
Thank you a lot my friend always keep going up it's gr8 and you spend so much much of engery for it, please accept my Endless Gratitude. Nice and applicable🙌🙏
@minyounglee8528
@minyounglee8528 2 года назад
As always, thank u so much for your work!
@Revakovskyi
@Revakovskyi Год назад
Perfect!!!! Nothing to say more except THANKS a lot for your course and teaching!!! Perfect!!!
@PhilippLackner
@PhilippLackner Год назад
Glad you like it!
@elfarouk3306
@elfarouk3306 2 года назад
man I really needed this And I said to my self I wish philipp has a tutorial on it . Like before Watching .
@nsikakisaac7872
@nsikakisaac7872 2 года назад
You're the GOAT!! Thanks for consistently putting out awesome content.
@VillageWoodWorks
@VillageWoodWorks 2 года назад
Congratulations on a presentation! Your dedication in helping others to help themselves, as they journey to become Android developers has far outpaced others on this platform. I am forever grateful for your commitment in this space. BEST REGARDS!
@PhilippLackner
@PhilippLackner 2 года назад
🙏🙏🙏
@sepideh1085
@sepideh1085 2 года назад
precious tutorial . Absolutely your channel is on of the main reason has kept me motivated
@PhilippLackner
@PhilippLackner 2 года назад
❤️
@UpLiftingU007
@UpLiftingU007 2 года назад
thanks philipp for the tutorial really amazing
@rahul_spawar
@rahul_spawar Год назад
1:06:35 when any one of three state changes does it recomposes other composes as well ? for ex. when I swipe down To Refresh my loading state will go to true until I get response from api, when loading state changes from false to true any composable depending on it will recompose, will that change in state of CompanyListingState also recompose other composables?
@meetsoni1938
@meetsoni1938 Год назад
Your efforts are highly appreciated🙏❤
@ankitverma3932
@ankitverma3932 2 года назад
Some extraordinary effort.. cheers to you..
@rushidesai2836
@rushidesai2836 Год назад
Great content Philip!
@MichaelTirkey0719
@MichaelTirkey0719 2 года назад
Thank you so much for selflessly creating such amazing content @Philipp Always I’ve learned so much from your videos and can’t wait for more :) lots of love from India
@sh3r1p49
@sh3r1p49 2 года назад
Thank you very much Philipp!
@ARIZONAMUSIC
@ARIZONAMUSIC Год назад
Damn! What a man! We are not worthy of such concentrated delicious tutorials :)
@rafamichalski6150
@rafamichalski6150 Год назад
You are right - this was an amazing course.
@emmanuelbamidele5064
@emmanuelbamidele5064 2 года назад
Hi Philip Thanks for this wonderful tutorial, I would like to know the explanation for the step you carried out at the 22:57 of your video where you created a CompanyListingEntity.toCompanyListing() method based on my understanding I would have created the toCompanyListing() without the CompanyListingEntity before it but you didn't create it that way. I also understand that the way you created the method it affords you direct access to the variable in the CompanyListingEntity class. I would really like to know what rule explains dis
@snehilsinha4689
@snehilsinha4689 2 года назад
Absolutely love this ! 🔥❤
@pereyrarg11
@pereyrarg11 Год назад
Thanks for sharing your acknowledgement!
@brunno_gonzalez_dev
@brunno_gonzalez_dev 2 года назад
🔥🔥🔥🔥🔥🔥🔥 Thank you very much Philipp!
@liosha2007
@liosha2007 2 года назад
Hello! Thank you so much for your content and for videos like this. I have already watched all your videos connected to Compose, but still found at least 5 things to make better in my apps watching this video. Also I would like to ask you to start making sample apps with edit/update/delete functionality. Apps with read/cache functions are not so difficult and you already have lots of samples and advices connected to that. As for CRUD apps, there are lots of places for which it is difficult to determine best way to do them. For example, the same app with one on the video, but with possibility to delete/create entries. When cache should be updated, how it should be updated, what to do in case of internet unavailable (deny modifying or caching changes and then syncing) and so on. How to use values from datastore in API requests, on which level it is correct to access datastore in cause of using it as part of API requests and in te same time as app settings. Anyway, thanks so much for content and sorry for my english:)
@PhilippLackner
@PhilippLackner 2 года назад
Thanks, but my channel is full of crud tutorials 🤔 check my note app course for example
@hectorvector4887
@hectorvector4887 2 года назад
Thanks So much Sir.. learning from the best
@karamba6936
@karamba6936 Год назад
Hello, thank you for your work. In second part of repository, where we load data from internet, cashe it to database. Then get from database with "" parameter. I think parameter must be querystring.
@wolfrudel7624
@wolfrudel7624 Год назад
Really nice video. Thanks❤ Why do you use mutableState (COMPOSE) and not stateFlow in your viemodel?
@abdelazizyasser3512
@abdelazizyasser3512 2 года назад
Thank u so much philipp, i want to learn more about canvas, it's very difficult but i'll try 😅
@PhilippLackner
@PhilippLackner 2 года назад
Yeah, my canvas course goes through it from very simple to difficult things. This video should give you a basic first understanding as well :)
@techmarinar
@techmarinar 2 года назад
This is very helpful thank you so much
@ahmedabdelrahman1375
@ahmedabdelrahman1375 Год назад
Hello World! , if i use ktor not retrofit how to retrive CompanyListing ResponseBody [with ktor] ?
@BunsenBurns
@BunsenBurns 2 года назад
your new android studio colors are aesthetic af
@muhamadabdulaziz2210
@muhamadabdulaziz2210 Год назад
Hi philipp, i have a problem with item clickable, there's not any happen when i click the item, i see in logcat but that doesn't appear any information or some error too.. what should i do?
@sovrinfo
@sovrinfo 2 года назад
Thank you a lot Phillipp
@user-cs4dl3kk8r
@user-cs4dl3kk8r 2 года назад
Thank you very much man!
@nishantabhishek8199
@nishantabhishek8199 7 месяцев назад
thanks for such an amazing content.
@lokiksoni3519
@lokiksoni3519 2 года назад
Great work philipp.
@FreedivingTrainer
@FreedivingTrainer 2 года назад
New Formatter (datetime) object will be create on every mapping operation, is it make sense to have one formatter?
@finaalfionita8392
@finaalfionita8392 2 года назад
Can someone tell me why does he use openCV and parsing? Do i need it also if the respond only a simple object like user object? Thank u
@user-ro9yw8bq2e
@user-ro9yw8bq2e 8 месяцев назад
is that ok to access util package Resource class from domain layer in clean arch?
@rahathossainhimel7177
@rahathossainhimel7177 2 года назад
Thank You. You are amazing. Love You.
@yonirozental2549
@yonirozental2549 2 года назад
Great job sir!
@amineayachi335
@amineayachi335 2 года назад
amazing 🤩 well done 👍
2 года назад
Good job. Thank you very much
@sergeytarasov5041
@sergeytarasov5041 2 года назад
Thank U Philipp, its good and easy!
@PhilippLackner
@PhilippLackner 2 года назад
Glad you liked it!
@yochilloutfam
@yochilloutfam 5 месяцев назад
So funny that I actually did it on Monday and the yesterday came to be sunday as well for me. What a coincidence. Lol :D
@NatiAgame
@NatiAgame 8 месяцев назад
Simply, thank you 😊
@sahilfarhan5712
@sahilfarhan5712 2 года назад
Great man.... Always bringing best content....and I think you could have a different module for the network it would be much better instead of packages...
@PhilippLackner
@PhilippLackner 2 года назад
Not for a tiny app like this
@maksym6415
@maksym6415 2 года назад
Thank you very much Philipp for a nice video. But I didn't understand, why do we need suspend repository function if it returns Flow ? For example: suspend fun getCompanyListings():Flow.
@rokydas9779
@rokydas9779 2 года назад
You are just awesome bro. Lots of love to you
@i.ankitmishra
@i.ankitmishra 2 года назад
Please tell what Android Studio IDE Theme you are using in this video. It looks great.
@wardengrant6070
@wardengrant6070 2 года назад
Your other tutorial in RepositoryImpl you pass the dao into constructor. This one you pass the Database and get the dao from the db, any particular reason?
@osisuper98
@osisuper98 2 года назад
For easy testing maybe
@devstuff2576
@devstuff2576 2 года назад
Thank You So so much brother
@sqsongsong2450
@sqsongsong2450 2 года назад
Nice video. But the StockChart y coordinate calculate wrong. val y1 = height - spacing - (leftRatio * (height - spacing)).toFloat(), isn't it?
@rahul_spawar
@rahul_spawar Год назад
3:02:23 why are we checking for loading state inside the box and not outside, even if loading is false we'll still create that box, Can anyone please help🤔
@theg4meover988
@theg4meover988 Год назад
awesome tutorial !
@MrBicelis
@MrBicelis 2 года назад
Thanks a lot! This is great! By the way, Phillip, do you have to recommend some good third party library for charts / graphs? In my project I'm working on, I need a good looking and functional piechart, but struggling to find something useable :)
@osisuper98
@osisuper98 2 года назад
Try Jitpack (just as spelt), for compose tho.
@JohanAlbrectsen
@JohanAlbrectsen 2 года назад
Amazing video!
@67Diadem
@67Diadem 2 года назад
Great!!! Thanks a lot
@vladislavshlapakov2449
@vladislavshlapakov2449 2 года назад
Thank you a lot, Phillip! I have one question. How to do full package naming if you have only one subclass/subdirectory (for example remote { dto }) instead of Android Studio default (for example remote.dto).
@novruzceferov8666
@novruzceferov8666 2 года назад
Go to up settings, check compact middle packages
@vladislavshlapakov2449
@vladislavshlapakov2449 2 года назад
@@novruzceferov8666 Thats great! Thank you a lot
@saadowain3511
@saadowain3511 2 года назад
Thanks Philipp . Any discount for your courses !?
@jorgearturorodriguez9432
@jorgearturorodriguez9432 2 года назад
At 48:38 in the try catch block shouldn't we catch the cancellationException and throw it to the parent coroutine as you mentioned on the 5 fatal coroutines video? that is the part where I got confused in both videos. Great course and appreciated as always
@daniboy943
@daniboy943 Год назад
Yea, we should.
@dreamer6228751
@dreamer6228751 2 года назад
Thank for new best video!))
@trendystatuses161
@trendystatuses161 2 года назад
If possible please make an e-commerce app tutorial as well.
@hussein9577
@hussein9577 2 года назад
well done Philipp
@dougphillips5686
@dougphillips5686 2 года назад
Love it. Can you do a tutorial for developing a launcher and channel app for android tv?
@martingaens2073
@martingaens2073 2 года назад
Hey Philipp! Awesome tutorial, thank you very much. I'm not sure if you created a video on that yet, but so far I always noticed that you organize your stuff in packages and say that for bigger projects we should use modules. Do you have any tutorials on how to make a clean architecture app with modules instead of packages?
@shrutivyas1965
@shrutivyas1965 Год назад
Awsome content, I have a query: 1:40 Why do we need to add @Inject when we don't need any object there? Thank you
@koetjape4440
@koetjape4440 2 года назад
Hy, Philipp. This is such a great tutorial and I did enjoy watching this. I have a question. Approximately at 2:06:00 you sorted List by hour. Do we need to do this in data? Should not this sorting be in domain because it might be business logic ? Thank you in advance for response.
@PhilippLackner
@PhilippLackner 2 года назад
Yeah, good point, you're right :)
@relaxwithmusic9036
@relaxwithmusic9036 2 года назад
Thanks for such content
@bitchwales9146
@bitchwales9146 2 года назад
thank you for your video,it helped me alot. But i just want to konw that ever since I import ksp,my as split preview went cracked. I don't konw why. ps it just like you don't use the "preview" in your video, it's cut out?
@bitchwales9146
@bitchwales9146 2 года назад
got it,Its the gradle dependency cause
@argahutama
@argahutama 2 года назад
amazing tutorial
Далее
5 Fatal Coroutine Mistakes Nobody Tells You About
18:15
СПАЛИЛА МАМЕ СТАРШУЮ СЕСТРУ
00:23
Разбудили Любимой Песней 😂
00:14
FABIANO SACRIFICES 2 ROOKS AND WINS IN 9 MOVES!
6:07
Просмотров 464 тыс.
Full Guide to Jetpack Compose Effect Handlers
24:56
Просмотров 89 тыс.
This Is My FAVORITE Error Handling Class
28:57
Просмотров 27 тыс.
He Beat A Super Grandmaster In 9 Moves!!
6:13
Просмотров 35 тыс.
СПАЛИЛА МАМЕ СТАРШУЮ СЕСТРУ
00:23