Great job, weldone sir....patiently anticipating for the other parts. Also, please consider uploading the other parts of the expense app, I mean the complete video on the project, I have been waiting for it for the past months. Thanks
I really enjoyed the Part 1 video of This Series. Few people are working on new technologies such as Jetpack Compose, Ktor, Koin, Compose Navigation, and MVVM, and I eagerly await for The next Part.
Bhai abhi abhi hilt and retrofit pe haath baitha tha. I thought ki ab bss backend part pe dhyan dena hai but aapne ab lgta h kator and coin v sikha ke hi manoge
Basically, mera plan yeh hai k is project ko Android me bana k Compose Multiplateform pe shift karenge. so that's why I chose Ktor and Koin because they are core Kotlin-based. Yeah, android pe dependent ni hain.
Hi Furqan, very nice effort with these videos. But your presentation layer is depending upon domain and data both, which violates the core principle of clean architecture. Data and presentation should only depend on domain layer. I can understand that we'll need to depend upon data for wiring up the DI but in that case, we should have an app module(not presentation) and each feature module can have it's own UI. And if we want to keep the UI in app module, renaming it to presentation will cause the confusion for new learners IMO. Secondly, can you tell me what mic you're using for audio recording? Again great effort with the videos.
Hello Brother, Thank you so much for your thoughtful feedback and for appreciating the effort put into the videos. You're absolutely right that, in the purest form of Clean Architecture, the Presentation layer should only depend on the Domain layer, keeping the Data layer isolated. This is something I strive to follow in most cases. However, in this series, I opted to simplify some aspects, especially around dependency injection (DI), to make it easier for beginners to grasp the concepts without getting too overwhelmed. I agree that introducing an "app" module could have been a better approach to managing DI, keeping the Presentation layer more aligned with the core principles of Clean Architecture. Regarding the module naming, I see your point about potential confusion. I’ll definitely consider that in future tutorials to ensure that the structure remains intuitive for all learners, especially those new to these concepts. I also wanted to let you know that since the first four parts of this series are already recorded and edited, I will post an update video in part 5 that will cover the use of an app module. This should help clarify things and align the project more closely with the Clean Architecture principles. As for your second question, I'm currently using the boya.com.pk/product/boya-by-m1-lavalier-microphone/ for audio recording. It's been working well for my needs, providing clear audio for my tutorials. Again, I really appreciate your input-it helps me improve the content and ensure it’s as helpful as possible for everyone. Thanks for watching and for the great suggestions! Best, Furqan
@@CodeWithFK Great work Furqan, I've been making videos on Basic Android development for some time and can understand the effort that goes into making such content behind the camera. Regarding the clean arch question, you're right about keeping the things simple for beginners but they can also take this as the CORRECT implementation on clean architecture, because they're learning it for the first time. I just wanted to highlight this point. It is very kind of you to put extra effort in making a separate video for explaining this. Best of luck with the channel brother ❣
@@CodeWithFK Regarding the mic, I purchased the same back when I started my channel but didn't quite get it to record clean audio. I've been struggling with audio for a long time. But your audio is quite clean. Recently, I started using OBS and the noice suppression filters on OBS are very very good. Good Job with the audio as well
@@U4Universe Thank you, brother, I have been using OBS as well with Noice Suppression. I just subscribed to your channel and would love to collaborate someday on some project :)
@@CodeWithFK Will be my pleasure to collaborate brother. Unfortunately due to the job, I wasn't able to make much content in the last 2 years, but I have planned some courses and will be launching soon.
If you are just starting Android development, I would recommend starting with my Expense Tracker app -> News App -> Chat App and then eCommerce App. Ktor and Koin are just alternative to Retrofit and Dagger Hilt.
You can use replace the existing DI framework with whatever you want. there are slight differences in how the DI frameworks are implemented, In my previous apps i have used Hilt so you can follow those videos and implement it in this project.
At 15:45, why are we adding the implementation()s to build.gradle.presentation, rather than add api("koin android") and api("koin android compose") to the domain gradle? Is it because we want to limit exposing these two dependencies to ONLY the domain and presentation?
We want android specific libs to be added only to presentation to keep domain and data kotlin specific. That's why we only added the koin android and koin android compose to presentation module using implementation.
In NetworkServiceImpl, "val result: R = mapper?.invoke(response) ?: response as R" the warning appears that "unchecked cast T to R" which seems like a valid concern. Why is this ok to cast Response as type R?
In typical use, this function operates as follows: if a web call is made with a request of type A and receives a response of type B from the backend, but we want to pass the response as type C to the domain layer, we use the mapper function to transform B into C. However, there are cases where we don’t want to map the response to another type. In these cases, we know that both T and R are the same type, so we can safely cast the response directly to R. To be extra certain, you can add a nullability check before casting the response. This check verifies that the response matches the expected type. If it doesn’t, you can throw a specific exception, which will then be caught in the catch block below, allowing you to return a meaningful error response if there is a type mismatch. val result: R = mapper?.invoke(response) ?: (response as? R ?: throw IllegalArgumentException("Response type mismatch"))
Hello live edit and preview are not very functional in jetpack compose ui development, it takes me time to create instant ui designs for me my application development speed in flutter is very fast, but I cannot realize this for kotlin, how do you do it how can I perform faster editing process for ui
Thank you for your feedback! I appreciate you bringing this to my attention. I'll make sure to use a larger font in future videos to make the content easier to follow.
First man making a project with Jetpack compose. Thanks a lot sir 🙌. Waiting for an awesome project.
Hope you enjoy it!
Sir using jetpack compose with advance features
Thank you sooo much sor, have been waiting for hood project to learn deeply jetpack compose
Glad You liked it.
Great job, weldone sir....patiently anticipating for the other parts. Also, please consider uploading the other parts of the expense app, I mean the complete video on the project, I have been waiting for it for the past months.
Thanks
Hello, which part of the expense tracker app is missing?
@@CodeWithFK
Part 4.....It ended in part 3, I was thinking there will be part 4, according to the number of pages on the figma file.
@@makindeisrael9635 th-cam.com/video/xolI_2svC6w/w-d-xo.html here is the part 4
@@CodeWithFK Thanks sir
I really enjoyed the Part 1 video of This Series. Few people are working on new technologies such as Jetpack Compose, Ktor, Koin, Compose Navigation, and MVVM, and I eagerly await for The next Part.
Bhai abhi abhi hilt and retrofit pe haath baitha tha. I thought ki ab bss backend part pe dhyan dena hai but aapne ab lgta h kator and coin v sikha ke hi manoge
Basically, mera plan yeh hai k is project ko Android me bana k Compose Multiplateform pe shift karenge. so that's why I chose Ktor and Koin because they are core Kotlin-based. Yeah, android pe dependent ni hain.
@@CodeWithFK thanks to you for you tremendous job ❤️
Als waiting for your videos...
keep supporting, I have a lot in the pipeline.
Hi Furqan, very nice effort with these videos. But your presentation layer is depending upon domain and data both, which violates the core principle of clean architecture. Data and presentation should only depend on domain layer.
I can understand that we'll need to depend upon data for wiring up the DI but in that case, we should have an app module(not presentation) and each feature module can have it's own UI. And if we want to keep the UI in app module, renaming it to presentation will cause the confusion for new learners IMO.
Secondly, can you tell me what mic you're using for audio recording?
Again great effort with the videos.
Hello Brother,
Thank you so much for your thoughtful feedback and for appreciating the effort put into the videos. You're absolutely right that, in the purest form of Clean Architecture, the Presentation layer should only depend on the Domain layer, keeping the Data layer isolated. This is something I strive to follow in most cases.
However, in this series, I opted to simplify some aspects, especially around dependency injection (DI), to make it easier for beginners to grasp the concepts without getting too overwhelmed. I agree that introducing an "app" module could have been a better approach to managing DI, keeping the Presentation layer more aligned with the core principles of Clean Architecture.
Regarding the module naming, I see your point about potential confusion. I’ll definitely consider that in future tutorials to ensure that the structure remains intuitive for all learners, especially those new to these concepts.
I also wanted to let you know that since the first four parts of this series are already recorded and edited, I will post an update video in part 5 that will cover the use of an app module. This should help clarify things and align the project more closely with the Clean Architecture principles.
As for your second question, I'm currently using the boya.com.pk/product/boya-by-m1-lavalier-microphone/ for audio recording. It's been working well for my needs, providing clear audio for my tutorials.
Again, I really appreciate your input-it helps me improve the content and ensure it’s as helpful as possible for everyone. Thanks for watching and for the great suggestions!
Best,
Furqan
@@CodeWithFK Great work Furqan, I've been making videos on Basic Android development for some time and can understand the effort that goes into making such content behind the camera.
Regarding the clean arch question, you're right about keeping the things simple for beginners but they can also take this as the CORRECT implementation on clean architecture, because they're learning it for the first time.
I just wanted to highlight this point. It is very kind of you to put extra effort in making a separate video for explaining this.
Best of luck with the channel brother ❣
@@CodeWithFK Regarding the mic, I purchased the same back when I started my channel but didn't quite get it to record clean audio. I've been struggling with audio for a long time. But your audio is quite clean.
Recently, I started using OBS and the noice suppression filters on OBS are very very good.
Good Job with the audio as well
@@U4Universe Thank you, brother, I have been using OBS as well with Noice Suppression. I just subscribed to your channel and would love to collaborate someday on some project :)
@@CodeWithFK Will be my pleasure to collaborate brother.
Unfortunately due to the job, I wasn't able to make much content in the last 2 years, but I have planned some courses and will be launching soon.
Is it for beginners , I don't know about koin and ktor
If you are just starting Android development, I would recommend starting with my Expense Tracker app -> News App -> Chat App and then eCommerce App. Ktor and Koin are just alternative to Retrofit and Dagger Hilt.
Thank you sir
Code with FK, great job on this video
@@IOSALive thank you so much 😊
I am just starting android app development. Please advise me and guide me what can I do?
THANK YOU SIR 👍👍👍
Part 2. please 🙏 🙏 🙏 🙏 🙏 🙏
@@obeddougan1505 video till part 8 are available on my channel.
Thank you for this
Hey im stuck in network module in (CIO) when i click it not showing import object it shows create val
@@mmohammadtalha296 please join my discord server and post your problem I will try to help you out.
@@CodeWithFK discord link
I have sent a photo of my problem in your discord
could you please show to me sir if I use Hilt DI instead of Koin
You can use replace the existing DI framework with whatever you want. there are slight differences in how the DI frameworks are implemented, In my previous apps i have used Hilt so you can follow those videos and implement it in this project.
@@CodeWithFK thank you so much sir. You explained very well for the multi modules
At 15:45, why are we adding the implementation()s to build.gradle.presentation, rather than add api("koin android") and api("koin android compose") to the domain gradle? Is it because we want to limit exposing these two dependencies to ONLY the domain and presentation?
We want android specific libs to be added only to presentation to keep domain and data kotlin specific. That's why we only added the koin android and koin android compose to presentation module using implementation.
Thank you so much!
And could you please tell me, why your code auto complete is awesome 😎
I think after enabling Gemini "Use context from your projects to improve responses" from settings
I am using GitHub Copilot.
@@CodeWithFK thank you so much sir
@@ahmedzain3416 thank you sir, now I know
Amazing!
Glad you liked it!
In NetworkServiceImpl, "val result: R = mapper?.invoke(response) ?: response as R" the warning appears that "unchecked cast T to R" which seems like a valid concern. Why is this ok to cast Response as type R?
In typical use, this function operates as follows: if a web call is made with a request of type A and receives a response of type B from the backend, but we want to pass the response as type C to the domain layer, we use the mapper function to transform B into C.
However, there are cases where we don’t want to map the response to another type. In these cases, we know that both T and R are the same type, so we can safely cast the response directly to R.
To be extra certain, you can add a nullability check before casting the response. This check verifies that the response matches the expected type. If it doesn’t, you can throw a specific exception, which will then be caught in the catch block below, allowing you to return a meaningful error response if there is a type mismatch.
val result: R = mapper?.invoke(response) ?: (response as? R
?: throw IllegalArgumentException("Response type mismatch"))
Hey bro waiting for the next you said it will come on Monday.
Really sorry, a new video will be released this monday.
ik adimn panel nam sai ik or app bnaye usmy ham product ko add krdey tu realtime is app mai wo product show hu
Hello live edit and preview are not very functional in jetpack compose ui development, it takes me time to create instant ui designs for me my application development speed in flutter is very fast, but I cannot realize this for kotlin, how do you do it how can I perform faster editing process for ui
Clean architecture and MVVM architecture are different from one another?
Yes, they are different but can work together.
Thanks
great work , can you share the design link ?
Design File: www.figma.com/design/IINva9f5ZcXCkYIJ2wDUx9/e-commerce-app-(Community)
Sir can you add testing too❤
@@maxeraxe7413 yes this project will have testing
16
Fonts aur thoda chota kar leta !🤡
Thank you for your feedback! I appreciate you bringing this to my attention. I'll make sure to use a larger font in future videos to make the content easier to follow.