How to Build a Clean Architecture CRUD Note App Using KMM (Android + iOS)

แชร์
ฝัง
  • เผยแพร่เมื่อ 21 พ.ย. 2024

ความคิดเห็น • 169

  • @hinocenciopaulo
    @hinocenciopaulo 2 ปีที่แล้ว +29

    I could see that you put a lot of effort into this project and still released it for free. Thank you very much.

    • @nijuyonkadesu
      @nijuyonkadesu ปีที่แล้ว +1

      yess 💌 only while doing I can realize how complex it can get !

  • @mattisovereighteen
    @mattisovereighteen ปีที่แล้ว +3

    This is better than most paid courses, thank you so much!

  • @dbug18
    @dbug18 2 ปีที่แล้ว +15

    Another tip from an iOS dev hehehe: you don't need to set optional variables to nil. The default value is already nil. Thanks for the video!

  • @kinggeorges625
    @kinggeorges625 2 ปีที่แล้ว +21

    Thanks Phillip for this great video were waiting impatiently 🤩
    Next time please consider doing a *News KMM app* with API requests 🙏

  • @francismwangi9752
    @francismwangi9752 ปีที่แล้ว +5

    Hello Phillip.Your ability to simplify complex concepts and explain them in a clear and concise manner is truly commendable. Your step-by-step approach to teaching makes it seem easy and achievable, even for beginners.
    Looking forward to learning more about Firebase, CRUD operations, and authentication. If you have time for a TH-cam tutorial on these topics, I'd love to watch it. Thanks for sharing your expertise.

  • @shareefummer2564
    @shareefummer2564 2 ปีที่แล้ว +3

    I was eagerly waiting for your KMM video. Thanks brother . Love from India😍

  • @elelan
    @elelan 2 ปีที่แล้ว +5

    Finally finished watching this and learned a lot
    I think it's time you start making IOS and swift tutorials along with KMM
    We would love that very much😍😍😍

    • @ChrisAthanas
      @ChrisAthanas 2 ปีที่แล้ว

      He specializes in Android tho.

  • @alexeysimchenko7494
    @alexeysimchenko7494 11 หลายเดือนก่อน

    on 22:10 I several times listened what did you say, and I could understand it only when I switched on subtitles.
    That word was - parameter)) You put emphasis on the last syllable, although it should be on the second. It's not big deal while you have good subtitles

  • @PhilippLackner
    @PhilippLackner  ปีที่แล้ว +1

    I just launched a really in-depth KMM course in which you learn to build a professionally designed translator app that supports 28 languages. Get it here:
    pl-coding.com/building-industry-level-multiplatform-apps-with-kmm

  • @breensrobert
    @breensrobert ปีที่แล้ว

    Wow finally finished this, great explanation and looking forward to building more apps on KMM.

  • @dess4099
    @dess4099 2 ปีที่แล้ว +2

    I wish there was that great content in Flutter like this! I'm not learning kotlin but it really helps in my stack anyway

    • @coldwolf5050
      @coldwolf5050 2 ปีที่แล้ว

      Check out Mitch Koko on youtube

    • @karansoni3798
      @karansoni3798 2 ปีที่แล้ว +1

      Bro you never heard of resocoder 😂..even a simple flutter keyword will index some of his videos

    • @dess4099
      @dess4099 2 ปีที่แล้ว

      @@karansoni3798 ofc, but reso doesn't build apps like this

  • @sanjaybatak3549
    @sanjaybatak3549 2 ปีที่แล้ว +1

    Thanks a million Phillip Lacker 🎉 U r our hero.

  • @theophilus494
    @theophilus494 2 ปีที่แล้ว +1

    Thanks sooooooo much Philipp... I'm personally grateful for this... 🙏🙌

  • @celik_m
    @celik_m ปีที่แล้ว

    Nicely done. Small suggestion would be to record natural approach to development in terms of showing decision making process and at least part of the struggles.

  • @miracleukaka4085
    @miracleukaka4085 2 ปีที่แล้ว

    Thank you so much for this. I can't wait to get my Mac so I can start applying these KMM concepts.

  • @alonshlider4881
    @alonshlider4881 2 ปีที่แล้ว

    2:09:10 you can use if let id2 = id{ null safe code } else { execute code if it is null}
    Replace id2 with a more relevant name

    • @ngolian
      @ngolian 2 ปีที่แล้ว

      You can also shadow the argument name: if let id = id ... and/or use a guard statement instead: guard let id = id else { return }

  • @andresfgarcia86
    @andresfgarcia86 2 ปีที่แล้ว

    Great tutorial, can't wait to see more KMM & iOS

  • @ericlekwa4573
    @ericlekwa4573 2 ปีที่แล้ว

    Thank you Philipp I have been keeping an eye for this tutorial. this is an dream come through for me 🥳

  • @rafiulhassan4027
    @rafiulhassan4027 ปีที่แล้ว

    Thanks a ton!!
    @ 44:22
    Why did you use "lowercase()" in both title & query instead of "ignorecase = true" inside contains?
    Isn't it more convenient?

  • @chimezieorji-unegbu7110
    @chimezieorji-unegbu7110 2 ปีที่แล้ว

    I have liked even before starting to watch knowing it's great already.

  • @elelan
    @elelan 2 ปีที่แล้ว +2

    Thank you
    Looking forward to learn a lot about KMM 🤩

  • @Cubdadure
    @Cubdadure 2 ปีที่แล้ว

    Amazing 🤩, thx !! It just need to add paging (for projects with lota of records) and you will have the perfect start kmm app 💪🥳

    • @PhilippLackner
      @PhilippLackner  2 ปีที่แล้ว +2

      that's your homework

    • @Cubdadure
      @Cubdadure 2 ปีที่แล้ว

      I’ll try again, it’s one of the reason I don’t use kmm for the moment, paging is a pain in kmm for the moment for me 😝

  • @KapilSaini-bt7gq
    @KapilSaini-bt7gq 2 ปีที่แล้ว +1

    Hi Philipp, Please use time stamps in your videos. Thanks for your videos it helps alot.

  • @amirraza2790
    @amirraza2790 ปีที่แล้ว

    Hey man! you are amazing.
    Well I have some confusions here, please make it clear to me If you get time.
    - How can we achieve DI in shared module? please exclude koin or kodein
    - As far as I get the KMM, It has a very limited scope that codebase can be shareable as there are much to be implemented in platform-specific package. Am I right? If yes, Why KMM can be chosen?
    - How can we manage the build variants for Android and iOS in KMM?
    - How can we add projects as sub-modules?
    Thankyou!

  • @KIRILLINGUSS21
    @KIRILLINGUSS21 2 ปีที่แล้ว

    awesome video!!! we're waiting for more about KMM :))😀😃

  • @Aditprayogo18
    @Aditprayogo18 2 ปีที่แล้ว

    Nice explanation, may I know what theme did you use on the android studio? thank you

  • @hcaltay
    @hcaltay 2 ปีที่แล้ว

    You are a legend. Thanks for the video!

  • @dutyman5533
    @dutyman5533 2 ปีที่แล้ว

    Thank you very much for the time that you spent for tutorial.

  • @ИльяШелковенко
    @ИльяШелковенко 2 ปีที่แล้ว

    Hi Philipp, thank you for your lessons , can you tell, what android studio theme do you use?

  • @edbienes
    @edbienes 2 ปีที่แล้ว

    very timely content!! 🥳👍🏻👍🏻 thank youuu

  • @eczema59
    @eczema59 ปีที่แล้ว +2

    Android Studio cannto find SQLDelight plugin, what I need to do?

    • @PhilippLackner
      @PhilippLackner  ปีที่แล้ว +1

      You can manually download it from the jetbrains website, simply Google for it and then open the zip in android studio in the plug in settings tab

  • @jiwomdf8244
    @jiwomdf8244 ปีที่แล้ว

    just finish it, you are the best philipp, help me a lot, thank you so much

  • @rasoolmohamed4788
    @rasoolmohamed4788 2 ปีที่แล้ว

    Wow Wow Wow, The most awaited tutorial😍😍😍 Thank You, @Philipp Lackner

    • @PhilippLackner
      @PhilippLackner  2 ปีที่แล้ว

      You're welcome 😊

    • @rasoolmohamed4788
      @rasoolmohamed4788 2 ปีที่แล้ว

      @@PhilippLackner Can we have an API call video with error handling in KMM + Clean Architecture?

  • @xakaler2638
    @xakaler2638 2 ปีที่แล้ว

    Thnq philipp for your amazing content always.
    ...
    Can we start learning KMM, what is the future of KMM.

  • @jisunski02
    @jisunski02 2 ปีที่แล้ว

    Will try this later. Great dude!

  • @michaberkowicz8239
    @michaberkowicz8239 2 ปีที่แล้ว

    Perfect for boring sunday

  • @adrianpionka6329
    @adrianpionka6329 ปีที่แล้ว

    Hello. Good job. Great knowledge. Maybe next time you show how implement navigation drawer? :)

  • @smartapps8770
    @smartapps8770 2 ปีที่แล้ว

    Good project🎉, i’m a fan of sharing viewModel instead 😂

  • @josephplayspickleball
    @josephplayspickleball 2 ปีที่แล้ว +2

    Phillip, I really appreciate this as I'm building a KMM app right now! These videos are helping to fill the gaps in my knowledge!
    One thing I'm struggling to find help with is OAUTH2 verification for users of my app. I need them to send google Sheet requests to write data. I've only been trying in android, but I can't find any good video resources, and I'm struggling to find anything else online. Any good walkthroughs? If not, I guess I'll have to wait for a video of yours to drop one day. Thank you Phillip for all you do for us!

  • @rahmathidayat4797
    @rahmathidayat4797 2 ปีที่แล้ว

    Beautiful course master Philip

    • @PhilippLackner
      @PhilippLackner  2 ปีที่แล้ว

      Thanks, happy to help!

    • @chhatrapatikumar7311
      @chhatrapatikumar7311 2 ปีที่แล้ว

      @@PhilippLacknerplease make a video on kotlin + node js + mongodb full stack clone App like people made clone app in flutter.

  • @hachoumkabboudi8125
    @hachoumkabboudi8125 2 ปีที่แล้ว

    great job, some seperate iOS tutorials would be awesome too

  • @joeymarley
    @joeymarley 2 ปีที่แล้ว

    Another Great tutorial!! Thanks for sharing your knowledge and for making those awesome tutorials

  • @codingjack
    @codingjack 2 ปีที่แล้ว

    Highly appreciate the contents you are providing.

  • @morpheus4564
    @morpheus4564 3 หลายเดือนก่อน

    CI/CD for KMM video will be nice

  • @sukanyasadasivan5632
    @sukanyasadasivan5632 ปีที่แล้ว

    Hi, could you please do a video on Compose multi-platform?

  • @ИльяСавинков-ш5с
    @ИльяСавинков-ш5с ปีที่แล้ว

    Why do you use types from presentation layer in domain layer? It is a mistake. 28:00

  • @myselferbumba
    @myselferbumba ปีที่แล้ว

    Thanks a lot!
    What about Compose Multiplatform!
    Is it interested for KMM projects ?
    Will you talk about this ?

    • @PhilippLackner
      @PhilippLackner  ปีที่แล้ว +1

      I will once it's stable enough to not run into a million Gradle conflicts

  • @anudeepananth
    @anudeepananth 2 ปีที่แล้ว

    Does jetpack compose lazy column support sql delight? It only supports room 3 to my knowledge...

  • @ЕвгенийВорожбянов-г7б
    @ЕвгенийВорожбянов-г7б ปีที่แล้ว

    Hi! I can't figure out how to do the migration correctly. In the file "note.sq" I create an "insert into ...". The record is saved in the database, everything is ok. I create a file "1.sqm" after I insert line "update table ...". The record has been updated for the current user, but when installing from scratch, I see the old value. Do I really need to change the values ​​in two places?

  • @zimbaldinho
    @zimbaldinho 2 ปีที่แล้ว

    Excelent video!
    Has anyone noticed that, on the ios app, when you click in any note, goes back and try to create a new note the content of that note is still there? or did I miss something? on mine it happens like this

  • @alonshlider4881
    @alonshlider4881 2 ปีที่แล้ว

    Why do you use savedStateHandle for process death and not the rememberSaveable { } block?

  • @JohanMosqueraYT
    @JohanMosqueraYT 2 ปีที่แล้ว

    Thank you Philipp . Sos un crack!
    I’m sorry about the spanglish, but it sounds better to me 😅.

  • @stephentellez5718
    @stephentellez5718 ปีที่แล้ว

    thank you soo much for your magnificent work

  • @zeynepduyenli
    @zeynepduyenli ปีที่แล้ว

    In Android, search bar doesn't except any keyboard input. I tried both in my physical device & emulator.

  • @raymondmichael4987
    @raymondmichael4987 2 ปีที่แล้ว

    Would like if you can add mongodb realm into the mix, as apart two.
    Thanks buddy

  • @davesari6345
    @davesari6345 11 หลายเดือนก่อน

    Stuck at share folder . . . it seems not to be found/seen on mac end

  • @unclerukuss
    @unclerukuss ปีที่แล้ว

    thanks Philipp !

  • @dmytroberezhnyi717
    @dmytroberezhnyi717 2 ปีที่แล้ว +2

    Jetpack compose for iOS?

    • @ChrisAthanas
      @ChrisAthanas 2 ปีที่แล้ว +2

      One can hope and im sure its in the pipeline.

  • @coldwolf5050
    @coldwolf5050 2 ปีที่แล้ว

    Any chance for an oauth 2.0 with compose video? I spend so much time looking and nothing works...

  • @trocchiettoski
    @trocchiettoski 2 ปีที่แล้ว

    counting the hours to see how do you implement flow in ios and with a shared view model

  • @androidmaster9869
    @androidmaster9869 2 ปีที่แล้ว

    I was expecting a video like this , also navigation with decompose library , but it seems you didn't use decompose . I will watch this video after I complete my current project. anyway thanks a lot .

    • @karansoni3798
      @karansoni3798 2 ปีที่แล้ว

      Hey are you contributing for kmm on a open source project or a private project?

  • @avc8484
    @avc8484 ปีที่แล้ว

    why use combine at 1:01:27 instead can use merge isn't it?

  • @ngolian
    @ngolian 2 ปีที่แล้ว

    About 7 minutes in I noticed some references to iosX64. Does that exist just so that the app can be tested on a simulator on an Intel Mac? Is it safe to remove these references if you're using an Apple Silicon Mac?

  • @ashrafkm5916
    @ashrafkm5916 ปีที่แล้ว

    Hi all. A question to everyone. I am backend developer. I am going to start work on front end mobile app. I am little bit confused on choosing flutter vs kotlin+jetpack compose.
    Can you guys suggest please.
    I want app to be working smoother like for example how Instagram works.

  • @guidoferri8683
    @guidoferri8683 2 ปีที่แล้ว +1

    Do you ever use UI design tools like Figma?

  • @deviantstudio
    @deviantstudio 2 ปีที่แล้ว

    why you didn't use koin for di? it's multiplatform

  • @larkes3364
    @larkes3364 ปีที่แล้ว

    I can't find sqldelight plugin in my android studio

  • @fatmafakhfakh9997
    @fatmafakhfakh9997 2 ปีที่แล้ว

    Thanks for this video .
    I have some issue in other need ; the issue is i have list of item and on Click of Item I open a dialog for detail of current item ;
    the problem is if I click quickly and successive on a first item then on the second item --> the dialog show the details of the second one with the size of the first one

    • @fatmafakhfakh9997
      @fatmafakhfakh9997 2 ปีที่แล้ว

      please tell me if you have any idea to solve this

  • @maksymilian7171
    @maksymilian7171 2 ปีที่แล้ว

    Btw you can get rid off the conditions when formating datetime:
    val hourAndMinute = LocalTime(
    hour = dateTime.hour,
    minute = dateTime.minute
    )
    return "${dateTime.date} $hourAndMinute"

  • @thumbthrasher
    @thumbthrasher 2 ปีที่แล้ว

    Thank you for a great tutorial
    The initial source code seems to be the final version though?

    • @PhilippLackner
      @PhilippLackner  2 ปีที่แล้ว

      Uhm no? 🤔

    • @thumbthrasher
      @thumbthrasher 2 ปีที่แล้ว

      @Philipp Lackner it's no bother, I just wanted to follow along as I'm still a newbie.
      Separately:
      How could I add an extra feature such as a checkbox for a shopping list, for example?
      Thanks again

  • @John-qt6qk
    @John-qt6qk 2 ปีที่แล้ว

    Awesome!!

  • @chandershekhar9251
    @chandershekhar9251 2 ปีที่แล้ว

    thank you very much sir for the tutorial

  • @khemmahato8420
    @khemmahato8420 2 ปีที่แล้ว

    you are great bro so much good content

  • @surendramaran
    @surendramaran 2 ปีที่แล้ว

    Amazing as always. Would you mind making a video on CameraX?

  • @tikayz
    @tikayz 2 ปีที่แล้ว

    Thanks for such an intuitive tutorial.
    I've not finish watching but I've already liked it.
    I really love you man for impacting so much knowledge on us.
    Can't wait to get a MacBook to try my hands on this
    :)

    • @smart1hashi
      @smart1hashi 2 ปีที่แล้ว

      Do you think we can use kotlin in ios as well in the future?

  • @HritikUtekar
    @HritikUtekar 2 ปีที่แล้ว +1

    You can use if let x = x {} in Swift
    It's like x?.let {}

  • @safionweb
    @safionweb ปีที่แล้ว

    🔥

  • @pierre.vieira
    @pierre.vieira ปีที่แล้ว

    1:11:21 Probably, for the purpose of the video being something more summarized, he doesn't care much about clean. In this case, the ideal would be to pass a string to the composable that already has the formattedDate field calculated. That string could be in a ui model that is passed to NoteItem composable. In this case, as he created a single Note data class, this model needs to be shared between data, domain and presentation, which is not ideal.

  • @Alex-ve4wr
    @Alex-ve4wr 2 ปีที่แล้ว

    Do you have to do something specific for the project to start with Compose for Android ? Mine started with xml

    • @ArturoDevA
      @ArturoDevA 2 ปีที่แล้ว

      xml is better, you can use databinding with xml > compose

  • @musfickjamil2831
    @musfickjamil2831 2 ปีที่แล้ว

    Wow 🤯🤯🤯🤯

  • @smreha
    @smreha 2 ปีที่แล้ว

    My man 🙂

  • @abmhdidev
    @abmhdidev 2 ปีที่แล้ว

    Thank you so much for this video

    • @PhilippLackner
      @PhilippLackner  2 ปีที่แล้ว +1

      Most welcome 😊

    • @abmhdidev
      @abmhdidev 2 ปีที่แล้ว

      @@PhilippLackner Thank you. I really enjoyed watching this video today and I have recommended this video to my developer friends.

  • @bitwisedevs469
    @bitwisedevs469 2 ปีที่แล้ว

    Finally

  • @gori_maheswari8994
    @gori_maheswari8994 ปีที่แล้ว

    Good nice amazing😍

  • @saifalnuaimi204
    @saifalnuaimi204 6 หลายเดือนก่อน

    Thanks man

  • @nguyencodervn
    @nguyencodervn 2 ปีที่แล้ว +1

    Thank !!!!!!!

  • @devanshgarg6298
    @devanshgarg6298 ปีที่แล้ว

    My sql file is not getting recognised, do anybody else also have the same problem?

  • @monoromrin8177
    @monoromrin8177 2 ปีที่แล้ว

    Hello anyone, can you tell me how to redraw the view in fragment when configuration change (UImode) in Fragment Activity?

  • @arunrajkumard5238
    @arunrajkumard5238 2 ปีที่แล้ว

    Thank you

  • @Rekubot
    @Rekubot 2 ปีที่แล้ว

    Amazing content, thank you! Does anyone know how to enable the sticky scrolling headers in Xcode seen at 2:09:54? I couldn't find a way to enable them in preferences.
    Edit: nvm, it's an Xcode 14 feature

  • @xakaler2638
    @xakaler2638 2 ปีที่แล้ว +2

    Is KMM stable now?

    • @ChrisAthanas
      @ChrisAthanas 2 ปีที่แล้ว +1

      Its now in Beta, so the API will not be changing anymore.

  • @frostyfreezemovies
    @frostyfreezemovies ปีที่แล้ว

    Plz add this to playlist

  • @ArturoDevA
    @ArturoDevA 2 ปีที่แล้ว

    other video with api rest please

  • @Bluckyism
    @Bluckyism 2 ปีที่แล้ว

    Thank you......

  • @AliouneDupuy
    @AliouneDupuy 2 ปีที่แล้ว

    That is so unfortunate that you have to use a mac to follow. But Great video as usual.

  • @andrevini8099
    @andrevini8099 ปีที่แล้ว

    Hello guys, I had an issue when I errased the following code :
    plugins {
    //trick: for the same plugin versions in all sub-modules
    id("com.android.application").version("7.4.1").apply(false)
    id("com.android.library").version("7.4.1").apply(false)
    kotlin("android").version("1.8.10").apply(false)
    kotlin("multiplatform").version("1.8.10").apply(false)
    }
    from the build.gradle from the app root, without it I had some errors like androidUnitTest is not available or com.android.library plugin doesn´t exist.
    Just to let you know.
    Awesome video btw

  • @kingcoder7654
    @kingcoder7654 2 ปีที่แล้ว

    ❤️❤️

  • @denisrudenko9937
    @denisrudenko9937 2 ปีที่แล้ว

    Thanks

  • @micah1995
    @micah1995 2 ปีที่แล้ว

    I picked up an issue on the IOS app. When you select a note from the list and click back and than click on the add icon I get the same note. My expectation is that I should see a screen with only the hints.

    • @micah1995
      @micah1995 2 ปีที่แล้ว +2

      I found the issue on line 34 of the NoteListScreen you should pass noteId as nil and not selectedNoteId because the NoteListScreen still keeps the same reference of the selectedNoteId

    • @andrefilgueiras
      @andrefilgueiras ปีที่แล้ว

      @@micah1995 Nice catch and thanks for sharing

  • @ChrisAthanas
    @ChrisAthanas 2 ปีที่แล้ว +1

    I'm seeing a runtime error when the android app is put into the background that causes the app to crash:
    java.lang.RuntimeException: Parcel: unable to marshal value Note(id=2, title=zoom, content=, colorHex=4286701290, created=2022-10-11T01:34:44.331)
    Is anyone else getting this error when the app is put in the background?
    It seems that the Note class needs to use the "Serializable" interface to be used as a Parcelable, but since thats a Java-only feature, i cant add it to the Note class.
    Any suggestions?

    • @ChrisAthanas
      @ChrisAthanas 2 ปีที่แล้ว +1

      I figured it out, and whoa what a pain. The documentation on this is extremely lacking!
      My answer and sample code at sta ckov erflo w dhat c om slash a slash 74050344/2857200
      (remove the spaces and change the dhat to a . and the slash to / - YT doesnt let you post links)

    • @ChrisAthanas
      @ChrisAthanas 2 ปีที่แล้ว +2

      I had to add custom annotations and TypeParceler, and it was not very straightforward

    • @MrWiseguy818
      @MrWiseguy818 ปีที่แล้ว +1

      Weird that the Phillip doesn't seem to address this. The bug is caused because the notelistviewmodel is trying to get saved into a parcel when the app goes into the background, but the Note data class is not parcelable and doesn't have the code to do so.
      Difficult to fix this issue if you dont understand it.
      The Solution is to use the kotlin Parcelize annotation
      Add id "kotlin-parcelize" to the module build.gradle, at the top inside the plugins object.
      Then, add @Parcelize annotation to the Note class, and all the subclasses if needed
      make sure the note data class also implements the Parcelable interface, with Note: Parcelable
      It should work just fine after that