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

Поділитися
Вставка
  • Опубліковано 30 вер 2024

КОМЕНТАРІ • 262

  • @theuntoldtree
    @theuntoldtree 2 роки тому +2

    33:00 you created resource class, atleast explain a bit about it , instead of saying "it seems difficult,but it isnt" : (

  • @osisuper98
    @osisuper98 2 роки тому +33

    Dude is just unbelievable! You are the reason I have a job.

  • @b4ux1t3-tech
    @b4ux1t3-tech 2 роки тому +4

    If anyone is showing a blank screen on refresh when you test the app for the first time, check your StockApi. The `@Query` decorator needs to have the string `"apikey"`, _not_ `"apiKey"`.
    Happy hacking! 😉

  • @matinaghalarkhani4802
    @matinaghalarkhani4802 2 роки тому +47

    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.

  • @MetehanBOLAT
    @MetehanBOLAT 2 роки тому +48

    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. 👊

  • @trendystatuses161
    @trendystatuses161 2 роки тому +13

    If possible please make an e-commerce app tutorial as well.

  • @francismwangi9752
    @francismwangi9752 Рік тому +7

    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

  • @AbhishekKumar-fb3uq
    @AbhishekKumar-fb3uq Рік тому +1

    at 1:40:04 i got this error when i rebuild project how can i fix this
    3 issues were found when checking AAR metadata:
    1. Dependency 'androidx.activity:activity-ktx:1.8.0-alpha02' requires libraries and applications that
    depend on it to compile against codename "UpsideDownCake" of the
    Android APIs.
    :app is currently compiled against android-33.
    Recommended action: Use a different version of dependency 'androidx.activity:activity-ktx:1.8.0-alpha02',
    or set compileSdkPreview to "UpsideDownCake" in your build.gradle
    file if you intend to experiment with that preview SDK.
    2. Dependency 'androidx.activity:activity:1.8.0-alpha02' requires libraries and applications that
    depend on it to compile against codename "UpsideDownCake" of the
    Android APIs.
    :app is currently compiled against android-33.
    Recommended action: Use a different version of dependency 'androidx.activity:activity:1.8.0-alpha02',
    or set compileSdkPreview to "UpsideDownCake" in your build.gradle
    file if you intend to experiment with that preview SDK.
    3. Dependency 'androidx.activity:activity-compose:1.8.0-alpha02' requires libraries and applications that
    depend on it to compile against codename "UpsideDownCake" of the
    Android APIs.
    :app is currently compiled against android-33.
    Recommended action: Use a different version of dependency 'androidx.activity:activity-compose:1.8.0-alpha02',
    or set compileSdkPreview to "UpsideDownCake" in your build.gradle
    file if you intend to experiment with that preview SDK.

  • @rahul_spawar
    @rahul_spawar 2 роки тому +1

    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🤔

  • @MuhammadPandam
    @MuhammadPandam 2 роки тому +5

    Always love your tutorials. I learn a lot from you

  • @attiaaliattia
    @attiaaliattia 2 роки тому +8

    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 2 роки тому +4

      Show some video and then talk

    • @DanielRodriguez-ds2qs
      @DanielRodriguez-ds2qs Рік тому +1

      @@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 (...)"

  • @ghostsfo
    @ghostsfo Рік тому +2

    I also ran into the NavGraphs class not found issue. According to the setup directions for the compose-destinations library, you need to tell Android Studio to look at the generated folder, add the following code in the Android block of the app level gradle file:
    applicationVariants.all {
    kotlin.sourceSets {
    getByName(name) {
    kotlin.srcDir("build/generated/ksp/$name/kotlin")
    }
    }
    }

    • @yuhenteng4694
      @yuhenteng4694 Рік тому

      Thanks!

    • @AntonioGonzalezsanchez
      @AntonioGonzalezsanchez Рік тому

      Thanks, I can't quite get it to work but I appreciate this. Do you know why this issue is appearing only now?

    • @kerimbilgi153
      @kerimbilgi153 Рік тому

      Thanks. This solution worked for me.

  • @tonnie7079
    @tonnie7079 2 роки тому +2

    Just landed from Multi-Module Architecture and the ink on my Certificate is not even dry, thx Philipp for the exposure.

  • @alishanvaliani9952
    @alishanvaliani9952 2 роки тому +1

    YEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAh

  • @maciejpelc9039
    @maciejpelc9039 Рік тому +2

    Thank you my man, you are helping to create new generation of devs!

  • @miladhashemzadeh5626
    @miladhashemzadeh5626 2 роки тому +1

    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🙌🙏

  • @fauzanajiprayoga2955
    @fauzanajiprayoga2955 2 роки тому +3

    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

  • @VillageWoodWorks
    @VillageWoodWorks 2 роки тому +13

    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!

  • @hubinsord9009
    @hubinsord9009 2 роки тому +7

    1:30:50 DI Application
    1:31:47 DI Modules
    1:32:50 DI AppModule
    1:37:38 DI RepositoryModule
    1:38:44 @Binds
    1:40:57 Navigation

  • @karamba6936
    @karamba6936 Рік тому +1

    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.

  • @Camlon
    @Camlon 2 роки тому +3

    Thank you for providing such great content for free. I have followed your tutorials from the basic Android Tutorials to the recent Clean Code and I am now ready to work on my personal project.
    I do wonder what is your current opinion on use cases. In earlier clean tutorials you use use-cases, but here you chose not to and used the repository in the view model.
    Do you no longer recommend using use-cases? Or do you use it when it is needed and mix repositories and use cases in the view model? Or was it a simplification for this specific project and you would have used use-cases if it was a larger project.

    • @PhilippLackner
      @PhilippLackner  2 роки тому +6

      I used them in earlier projects to show their concepts for people who want to learn it. Use cases have their purpose, but not in most projects people here build. So often, they just call a repo function and pollute your code with tons of classes that do nothing.
      For large scale projects, they do make sense though, but people tend to use them just because they heard somewhere it's a best practice. Always question if a specific architecture makes sense for your particular project without listening to trends too much.

    • @Camlon
      @Camlon 2 роки тому

      @@PhilippLackner Thanks for the explanation. :)
      Then I can get rid of those useless use case classes without feeling guilty.

  • @yunuscaglyan417
    @yunuscaglyan417 2 роки тому +3

    Nice tutorial . Can you make a tutorial about modular architecture?

    • @iliasg
      @iliasg 2 роки тому

      He made a course about that, highly recommend it! Check the first link in the video description.

    • @sahilfarhan5712
      @sahilfarhan5712 2 роки тому

      Just put the network and db into different module for this project

  • @harisai3580
    @harisai3580 2 роки тому +2

    Never expected the entire video without parts. TQSM

  • @rahathossainhimel7177
    @rahathossainhimel7177 2 роки тому +1

    Thank You. You are amazing. Love You.

  • @ChaosFleischer
    @ChaosFleischer 7 місяців тому +1

    Thank you for this Amazing Tutorial! After i fixed some gradle issues its running now!!!!

    • @furkanbademli8402
      @furkanbademli8402 6 місяців тому

      how to solve that? i m having gradle issues,too.

  • @fracta7
    @fracta7 2 роки тому +2

    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!

  • @elfarouk3306
    @elfarouk3306 2 роки тому +1

    man I really needed this And I said to my self I wish
    philipp has a tutorial on it . Like before Watching .

  • @a2ashraf
    @a2ashraf 2 роки тому +1

    Hi Phillip, you can add a donation to your video (thanks button) so that you can get still give content for free but also increase ability to make money via donations for those that benefited.

    • @PhilippLackner
      @PhilippLackner  2 роки тому +4

      There is a buymeacoffee link in the description, but generally the best way to support me and get amazing value at the same time is to get my premium courses :) thanks a lot, appreciated

  • @androidkotlin-6234
    @androidkotlin-6234 Рік тому

    I solve it by myself, I was change import of Path()

  • @Johnny-nq9bh
    @Johnny-nq9bh 6 місяців тому

    i see something odd, isRefreshing state is never changed so loading circle newer shows up, easy fix is to change isRefreshing to isLoading in screen

  • @Revakovskyi
    @Revakovskyi Рік тому +1

    Perfect!!!! Nothing to say more except THANKS a lot for your course and teaching!!! Perfect!!!

  • @mrbmro3991
    @mrbmro3991 2 роки тому +1

    Whilst this is a great example, this architecture is missing one key layer, the domain layer as part of clean architecture. Having usecases is critical and these need to be injected into the Viewmodel. In the above example becuase you have not used usecases, this mean all the bussiness logic overspills into two areas, the ViewModel and or the Repository. By having the Usecases (as a pure kotlin module or package) allows us to isolate business logic and therefore leave the Repo to be purley handling CRUD operations and leave the view model to handle purley view related work. For the same reason why we back a view such as a Fragment or Activity by a Presenter or ViewModel to handle View logic, if we accept this, then we should accept that the view model or presenter should also be backed by a usecase to handle business logic

    • @PhilippLackner
      @PhilippLackner  2 роки тому +1

      If you would've watched the video, you would've heard my explanation why I didn't use use cases here 😄 I have plenty of other videos using it with use cases

  • @jatinvashisht4293
    @jatinvashisht4293 2 роки тому +1

    Just finished the video, hands down the best video on best practices I ever watched (including Philipps')

  • @subhradeepbera2774
    @subhradeepbera2774 Рік тому +1

    Hey Philipp! Make more of these large videos for UA-cam!

  • @liosha2007
    @liosha2007 2 роки тому +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 роки тому +3

      Thanks, but my channel is full of crud tutorials 🤔 check my note app course for example

  • @sqsongsong2450
    @sqsongsong2450 2 роки тому

    Nice video. But the StockChart y coordinate calculate wrong. val y1 = height - spacing - (leftRatio * (height - spacing)).toFloat(), isn't it?

  • @honghuynh9322
    @honghuynh9322 2 роки тому +1

    Hello everyone,
    CompanyListing(
    name = name ?: return@mapNotNull null,
    symbol = symbol ?: return@mapNotNull null,
    exchange = exchange ?: return@mapNotNull null)
    inside the companyListingParser class. Why do we need to have "return @mapNotNull null"? How does it work, please help

  • @codinginflow
    @codinginflow 2 роки тому

    Bro why are your earlobes attached like this

  • @naveen90z
    @naveen90z 11 місяців тому

    Question: Supppose I am using an UserRespostory which depends on LoginRepository and RegistationRepository, where can I place the UserRep?? Also should the UserRespo only access the interface of other two repos?? Can i go with below project structure or please suggest other option.
    ---> data
    ------> repository (Implementation)
    ----------> LoginRepo
    ----------> RegistrationRepo
    -----------> UserRepo (use required data from LoginRepo and RegistrationRepo)
    --> domain
    ------> repository (interfaces)
    ----------> LoginRepo
    ----------> RegistrationRepo
    -----------> UserRepo

  • @hasnainahmad8295
    @hasnainahmad8295 8 місяців тому

    Is the SOLID and MVVM architecture are same?

  • @Team_8x
    @Team_8x 4 місяці тому

    Thanks awesome, you are a great inspiration and teacher!

  • @Usam43
    @Usam43 2 роки тому +1

    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.

  • @paulvickers8059
    @paulvickers8059 2 роки тому +1

    Do you have anything about foreground, background maybe with a timer, that keeps running when app goes into background?

    • @nipunkumarit2168
      @nipunkumarit2168 2 роки тому

      I think Phillip already upload a work manager tutorial, may be that will help you.

    • @paulvickers8059
      @paulvickers8059 2 роки тому

      @@nipunkumarit2168 thanks I'll have a look, is it with compose?

    • @nipunkumarit2168
      @nipunkumarit2168 2 роки тому +1

      @@paulvickers8059 yes

  • @himanshumalik2032
    @himanshumalik2032 2 роки тому

    I am also having that same NavGraphs class import issue and that re import doesn't works for me, anybody facing the same issue ?

  • @ubersticks
    @ubersticks 2 роки тому +1

    Thank you for your work Philipp. I enjoyed it and it is always educational to see your designs.

  • @vladislavshlapakov2449
    @vladislavshlapakov2449 2 роки тому +1

    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).

  • @b4ux1t3-tech
    @b4ux1t3-tech 2 роки тому

    RE: Comments: Comments should not explain what code does, they should explain _why_ the code is the way it is. Links to upstream issue trackers, stack overflow-based workarounds, explaining a weird order of operations that may be necessary for some API, etc.
    There's a whole lot of people who say that "comments don't belong in code", but if that were the case, comments wouldn't exist. They have a purpose, like everything else. Use them wisely, but don't just not use them.

  • @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.

  • @paulvickers8059
    @paulvickers8059 2 роки тому +1

    This looks amazing, can't wait to start this tomorrow.

  • @IoannisAnifantakis
    @IoannisAnifantakis 5 місяців тому

    Philipp for President!

  • @ahmedabdelrahman1375
    @ahmedabdelrahman1375 Рік тому

    Hello World! , if i use ktor not retrofit how to retrive CompanyListing ResponseBody [with ktor] ?

  • @Rodrigo-bu5tp
    @Rodrigo-bu5tp 2 роки тому

    Hi, great content, thanks.
    Can you explain more why do you have Resource. Loading(loading: true / false) ? Why don't you have like:
    Resource.loading
    Resource.success
    Resource.error
    If is success or error, the loading will be false ... The only reason that I can think to use this will be for example, remove the loading of the screen only after the content is loaded, but the time difference will be so short that maybe does not worth ...

  • @pumaelgatosiberian5047
    @pumaelgatosiberian5047 2 роки тому +1

    awesome, thanks a lot! Спасибо! My solution of filter problem
    .filter {
    val yesterday = LocalDate.now().minusDays(1)
    val filter = when (yesterday.dayOfWeek.value) {
    6 -> yesterday.minusDays(1)
    7 -> yesterday.minusDays(2)
    else -> yesterday
    }
    it.date.dayOfMonth == filter.dayOfMonth
    }

  • @ByteZeroOne
    @ByteZeroOne 2 роки тому

    "In line with legal and regulatory requirements, we currently do not offer services for clients based in Russia" Noice, we are just short of starting to burn books of specific culture, to return to our ancestry, German, probably, kekw

  • @DanielDemesmaecker
    @DanielDemesmaecker 11 місяців тому

    Scandeless that you not even get 3k likes in a year when you produce such quality, I've seen tutorials of less quality reach a milj likes

  • @SiamakAshrafi
    @SiamakAshrafi 2 роки тому

    Not a good idea. This is no longer MVVM.
    You are breaking the flow from the DB to the UI.
    Please make a new version that reacts as soon as the cache is updated.
    No need to do a pull to refresh ...

  • @FreedivingTrainer
    @FreedivingTrainer 2 роки тому

    Preview!? What about preview in Compose? Is it so bad for now that you do not use it?

  • @ARIZONAMUSIC
    @ARIZONAMUSIC 2 роки тому

    Damn! What a man!
    We are not worthy of such concentrated delicious tutorials :)

  • @FreedivingTrainer
    @FreedivingTrainer 2 роки тому

    New Formatter (datetime) object will be create on every mapping operation, is it make sense to have one formatter?

  • @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

  • @amineayachi335
    @amineayachi335 2 роки тому +1

    amazing 🤩 well done 👍

  • @i.ankitmishra
    @i.ankitmishra 2 роки тому

    Please tell what Android Studio IDE Theme you are using in this video. It looks great.

  • @rahul_spawar
    @rahul_spawar 2 роки тому

    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?

  • @muhamadabdulaziz2210
    @muhamadabdulaziz2210 2 роки тому

    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?

  • @umnikya7874
    @umnikya7874 2 роки тому

    Yes! I repeat this! Your code is repeatable and you talk about places where can stuck.

  • @umnikya7874
    @umnikya7874 2 роки тому

    I want to use charts in my app, after this video I think I can do something.

  • @yochilloutfam
    @yochilloutfam 7 місяців тому

    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

  • @maciejpelc9039
    @maciejpelc9039 Рік тому

    The solution to the problem with the graph not working on monday and sunday is just getting the current day from localdatetime and using when to get minus 2 or minus 3 days :) hope it helps someone

  • @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

  • @niksha6099
    @niksha6099 Місяць тому

    Thanks for video ❤

  • @nsikakisaac7872
    @nsikakisaac7872 2 роки тому

    You're the GOAT!! Thanks for consistently putting out awesome content.

  • @pereyrarg11
    @pereyrarg11 Рік тому

    Thanks for sharing your acknowledgement!

  • @jayantkumar1954
    @jayantkumar1954 2 роки тому +1

    Amazing ❤️👌

  • @wolfrudel7624
    @wolfrudel7624 Рік тому

    Really nice video. Thanks❤ Why do you use mutableState (COMPOSE) and not stateFlow in your viemodel?

  • @saadowain3511
    @saadowain3511 2 роки тому

    Thanks Philipp . Any discount for your courses !?

  • @dhruvnami
    @dhruvnami 3 місяці тому

    you are the best of the best

  • @flowzk921
    @flowzk921 2 роки тому

    Whew! finally finished this, learn't a lot, first time working with CSV rather than Json, many many Thanks Philip!!!

  • @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

  • @rena-tc4hy
    @rena-tc4hy 2 роки тому

    Hello, thank you for this amazing tutorial its really make alot of things clear in my head 💜💜,
    If you allow me to ask you please consider uncle Bob clean code thing like fun should continue 4 to 6 line max, it will be amazing thank you so much again I really appreciate you help with those awesome tutorials.

  • @sanjaybhatikar
    @sanjaybhatikar Рік тому

    Wow, Philipp! You are like a Gandhi who codes ;)

  • @GiridharaSaiPavanKumarGurram

    20:11 why to mark the id as nullable? When we are already marking it @PrimaryKey

  • @nabinchaudhary73
    @nabinchaudhary73 2 роки тому

    i will surely buy your course but i have not credit or master card. But in near future i will surely buy your course if i got one and start earning.

  • @hectorvector4887
    @hectorvector4887 2 роки тому

    Thanks So much Sir.. learning from the best

  • @muhammadhassan3264
    @muhammadhassan3264 2 роки тому

    Hey why are you naot use post api.We want to see what actually behaivour of post api in clean arcitecture

  • @PratikkumarP-f6s
    @PratikkumarP-f6s 10 місяців тому

    is that ok to access util package Resource class from domain layer in clean arch?

  • @dev_jeongdaeri
    @dev_jeongdaeri 2 роки тому

    super amazing!

  • @dougphillips5686
    @dougphillips5686 2 роки тому

    Love it.
    Can you do a tutorial for developing a launcher and channel app for android tv?

  • @BunsenBurns
    @BunsenBurns 2 роки тому

    your new android studio colors are aesthetic af

  • @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

  • @YouGuto
    @YouGuto 2 роки тому

    Man! You are the best... looking forward for the Tests

  • @kickart7517
    @kickart7517 2 роки тому

    im wondering, can i create this inside a flutter project?

  • @osmanmusse9432
    @osmanmusse9432 2 роки тому

    Thanks you Philip your really helping the android community out

  • @محمدمجدي-ف8ل5م
    @محمدمجدي-ف8ل5م 2 роки тому

    Hi Philip you are amazing person 🔥💙❤ and I benefit from your videos. . Course of industry world tracker is paid and it very very nice .. please can you make it free and downloaded it in UA-cam.🙏

    • @PhilippLackner
      @PhilippLackner  2 роки тому

      Can you please pay for it? How do you think I can make all these free videos without being able to pay my food?

  • @vladimirparizek9499
    @vladimirparizek9499 Рік тому

    Thanks for tutorial. I used chart in my own project and found an error in stroke path.
    val y1 = height - spacing - (leftRatio * height).toFloat()
    shoul actually be
    val y1 = height - spacing - (leftRatio * (height - spacing)).toFloat()
    Same with val y2.
    And similarly in Y axis labels the Y coordinate should be:
    size.height - spacing - i * (size.height - spacing) / 5f,

  • @meetsoni1938
    @meetsoni1938 Рік тому

    Your efforts are highly appreciated🙏❤

  • @danyelsh874
    @danyelsh874 2 роки тому

    Still not whatch the video
    But i know it's a awesome 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

  • @milon27
    @milon27 2 роки тому

    thank you for the video, how you are sharing the Mobile screen on the computer? which tool you are using?

  • @jeckonly5853
    @jeckonly5853 2 роки тому

    I learned a lot from this. It is better to learn from Google docs.

  • @sayyedaamer9243
    @sayyedaamer9243 2 роки тому

    Hi Philipp, the video is very good as always. I have a question. Actually it’s not a question its a issue with my understanding. I always ending up with adding wrong dependencies in gradle file. I learned everything from UA-cam.
    I search for the dependency but always always end-up with wrong one.
    The dependency always confuses me.
    Like how to know which dependency is required when.
    For example: hilt . There are different dependency for android compiler kotlin viewmodel.
    And these all dependency are not in one place We have search it differently.
    Is there any documentation from where i get all the dependency at ones and with description that for what purpose the dependency work
    Please answer.

    • @salgutierrez3272
      @salgutierrez3272 2 роки тому

      Hi, what I have tried is to get the most up to date dependency for each thing and hope they all line up and they do :)