How to Build a Calculator with Jetpack Compose - Android Studio Tutorial

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

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

  • @ninelivesforge6432
    @ninelivesforge6432 ปีที่แล้ว +17

    Thank you for this! As you said I was really overwhelmed with all the complex architecture and libraries in other tutorials, this is what I needed at my level! Please make more!

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

    Thanks as always for the great content, Philipp. One modest suggestion that I feel could be helpful: I'd love to see @Preview annotations used and see the UI built iteratively. It's easier to see the effects of the code that's being written when the execution of the code happens piecemeal. It's a little harder to string together when it happens all at once🙂.
    To be fair, coding along is an option, but sometimes I like to just hang back and enjoy the show.

  • @RaivoDoc
    @RaivoDoc 8 หลายเดือนก่อน

    Really helpful videos for someone who's re-qualifying from data analytics world to Android. Keep up the good work!!!

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

    Just a readability hack I found
    Instead of using a data class Operation inside a sealed class CalculatorOperation we could just another sealed class
    Example:
    sealed class CalculatorAction {
    data class Number(val number: Int) : CalculatorAction()
    object Clear : CalculatorAction()
    object Delete : CalculatorAction()
    object Decimal : CalculatorAction()
    object Calculate : CalculatorAction()
    //Instead of this
    //data class Operation(val operation: CalculatorOperation) : CalculatorAction()
    //Use this
    sealed class CalculatorOperation(val symbol: String) : CalculatorAction(){
    object Add : CalculatorOperation("+")
    object Subtract : CalculatorOperation("-")
    object Divide : CalculatorOperation("/")
    object Multiply : CalculatorOperation("*")
    }
    }
    Readability benfit:
    // This is better
    onClick = {
    onAction(CalculatorAction.CalculatorOperation.Divide)
    })
    //than this
    onClick = {
    onAction(CalculatorAction.Operation(CalculatorOperation.Divide))
    })

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

      Damn, this comment need more likes

  • @brunonoveli6839
    @brunonoveli6839 9 หลายเดือนก่อน

    You are a really good teacher. I've been learning Kotlin mainly by watching your videos and it's been a great experience.

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

    I'm gonna upgrade this to the scientific level.

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

      Please upload your scientific calculator source code.

    • @Justme-dk7vm
      @Justme-dk7vm ปีที่แล้ว

      Same

    • @user-Rania-n7m
      @user-Rania-n7m ปีที่แล้ว

      ​@@Justme-dk7vm ikr😆

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

    i've been learning on the side and had to take a break because work stuff was keeping me busy, holy cow the new version launches the app super fast now when i recompile my code, gotta give the props for the android team

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

    I think this would actually be _simplified_ by adding support for more operations, because now you just input a big string of characters and finally calculate it by hitting =. So all the operation buttons can just be the same action as the digits.
    Also you could cut the repetitive code down very simply by defining a local function with the 4 params which vary and packing the calls to that on a single line for each button.

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

    I experience joy of elegant coding in Jetpack Compose without messy xml. Kotlin with Compose is now at the same level as SwiftUI without messy .xib associated with storyboard in UIKit. Great lecture, Thanks.

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

      but xml performance is sitll better

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

    I already made a similar one in java, having something similar in compose is a good way for me to learn stuff. Thank you philip, now i can understand how to work in jetpack compose the correct way

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

      hey, the best I found is the last 2 chapters of Headfirst Android 3rd edition. Those are really really good to understand how compose work. I found them better than the official material on compose.

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

      @@akashkroy thank you for the advice, i will check them out

  • @a-zlearning6259
    @a-zlearning6259 10 หลายเดือนก่อน

    Created it successfully, and modified it a little bit 🥰 Thanks Philipp, you are the best teacher ever!

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

    You are a genious. I expect one day to be able to think all the things as fast as you do with Kotlin

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

    Hello Phillip, so yeah, I did the assignment. I can carry out multiple operations. Though, I changed the layer above to contain two textviews, one for displaying input and the other for displaying result. Thanks once again.

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

      Wow. Mind sharing how you did it?I've tried it's not working for me.

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

    it should be in android framework by default by now, but there is an operation called exhaustive, which if you add it to your when block, it forces you to add all the possible sealed classes possibilities (and will give you the option to do so) or add an else block.
    very handy indeed.
    it looks like this
    val T.exhaustive: T
    get() = this
    you add it to your util file, and can use it wherever you want.

  • @amritsohi6642
    @amritsohi6642 10 หลายเดือนก่อน +1

    In enter decimal function, instead of writing number2=state.number2+"." you write number1=state.number2+"." Last thing it a nice project

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

    thanks for the great video.
    there is a bug in 36:42 where for "number2" decimal you use the "number1" variable

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

    I search this on TH-cam, you made my day..

  • @abacaabaca8131
    @abacaabaca8131 ปีที่แล้ว +4

    @22:02
    luckily for me, I can populate the buttons using an array of buttons.
    because the button is actually the same object, it only differs in width in two areas (or elements).
    if we use the formula to linearize the 2d space into 1d space we can define it like this:
    f(i)=y*w+x
    where:
    'i' is the index,
    'y' is the index of y with the range of 0 to 4
    'x' is the index of x with the range of 0 to 4 except when y=0 and y=4, its range is 0 to 2
    so, since the number of buttons object is 4*5-2 = 18
    we can do for loop.
    in that for loop we can populate a homogenous attributes to all button object first for the color, then we can explicitly change certain attributes of the button.
    for example, button[0] and button[15] to have wider attribute for the size to be drawn on the screen. For button[0] and button[1] they have light grey color attribute.
    For the operation button, we can use % modulo operator to give orange color.
    like:
    if i%4==0:
    button[i].color=Color.orange
    button[17]=Color.orange
    and we are done.

  • @ChristianMielke
    @ChristianMielke 8 หลายเดือนก่อน

    i have learn so much about Kotlin. I love your Videos

  • @sarthakvatsa5607
    @sarthakvatsa5607 5 หลายเดือนก่อน

    Great one buddy. Helped a lot. Thanks!

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

    Another fan!!!!! You're spectacular, I've been following your videos and honestly , I like you, you're so wonderful...thanks for your time...

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

    reallly helpful, thanks a lot philipp

  • @masoumi-td7fg
    @masoumi-td7fg 2 ปีที่แล้ว

    great as always philipp

  • @timepasi
    @timepasi 5 หลายเดือนก่อน

    Great video so much helpful great work :)

  • @nadjlaau9267
    @nadjlaau9267 6 หลายเดือนก่อน +1

    Thank u this was very helpful.

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

    Thanks dude, it was so clear to understand.

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

    Great idea for a video big 🐕. I like that it's a realistic, full project but not overly complicated.
    I'm rewriting my super old Java/XML Android app in Compose/Kotlin/Room, learning all as I go, and decided to use Clean Architecture too. But man for my simple app that is way too unnecessarily complicated. There's about 4 times the files and code of my old app and I'm about half done lmao.
    I can see CA being useful for more complex apps and apps that a team works on, but for a small app by a single developer? No way, way overkill imo.

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

    Wonderful! Was wondering why you used sealed class vs enum for operations and I see you have another video for that. :) Mind-blown! ❣️

  • @HuynhDucPhu2502
    @HuynhDucPhu2502 5 หลายเดือนก่อน

    Very very cool tutorial

  • @mikeschoch
    @mikeschoch 9 หลายเดือนก่อน

    Very good Video, please more stuff like this simple app in Compose, maybe some with an API Call to load some contacts in a lazy list or something like that.

  • @bugslayer-sama
    @bugslayer-sama ปีที่แล้ว

    Thank you, this was very helpful as always

  • @aboubakergb5929
    @aboubakergb5929 10 หลายเดือนก่อน

    Thanks One of the best Channel

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

    It's really a good looking app
    Thx for the tutorial 🙏

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

    I have created a calculator like this. It was in one class 400 columns and it takes nearly 4 hours.

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

    This was a great tutorial. I really hope you will do more simple basic tutorials like this

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

    Thx for the video... Which plugin are you using?

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

    Thank you so much, great content love your videos

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

    10/10 architecture

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

    Hello Phillip Knacker. In the beginning of this video. You said that this is for those who have an idea of the basics of JetPack Compose. Does this mean I have to know at least the small basics of JetPack Compose before embarking on this project?? Just asking

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

    Adamın hası, hası

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

    Great tutorial, helped me with ViewModel when I was loosing hope to find solution of my problem, much thanks! :D
    Also I have a question: how did you push the modifier higher over buttonSpacing? Seem like some smart key comination

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

    You are genius man

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

    Hope you will make an update for this app using Constraint layout. Nice video and very helpful!!

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

    Thank you, great tutorial

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

    very cool video
    thank you BRO
    you are the best
    wish you all the best 🔥👍👍👍👍

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

    @19:33 Initially I was confused with how Compose work. Because, it is just a function annotated with `@Composable` keyword with multiple parameters.
    In the parameter we can set the default value for the function.
    Inside the body of the function, we can set the layout of that compose such as the Box compose which is also a function, here inside the Box's parameter is the place where we can set the attribute for that Box, but in it's body,
    It will specify the children element of that Box. For example, a Column compose as the children of Box.
    So, it is like xml file, where we can set the attribute of an element, or declare a children element.
    In a nutshell, in the Compose function's:
    1. parameter : specify the attribute of that particular Compose element.
    2. body: specify the children element of that particular Compose element.

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

      If we want multiple children element let say inside Column, we have 2 children elements:
      1. Text
      2. Row
      we do not need to put comma ","
      also for `Text` element it does not need a "body" or children.

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

    while following this tutorial while 15:56 viewModel is showing unresolved reference, i am using emptyactivity in android studio giraffe?????? please help!!!! !!!!!!!!!!!!!!!!!! i have found similar problem in stack overflow but no solution given

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

      Do you have?
      ...
      import androidx.lifecycle.ViewModel
      import androidx.compose.runtime.*
      and in build.gradle > implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.6.2"
      Tip: Hover and use Alt-Enter when it suggests imports

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

      @@hkjk0 I have it but same issue suggestions are create local variable, property ,object, parameter. have viewModels() though not viewModel()

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

      @@2050Debanjan and you synced it? (I had similar issues, but would have to start all over again to reproduce the solution)

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

      Also, is anything else blowing red?

    • @2050Debanjan
      @2050Debanjan ปีที่แล้ว

      @@hkjk0 solved after syncing ..there was sybcing issue

  • @beatricebastianello7372
    @beatricebastianello7372 9 หลายเดือนก่อน

    Thank you, it was great!!!

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

    thank you Philipp

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

    Can I start my development journey with jetpack compose If I'm a beginner or first I should go for XML one then switch on jetpack compose ????

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

    Great video! Thank you!
    How update viewModel from Service?

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

    Hello phillip this is a non related question but, do you know which technology I can use to automate apps,Like i want to create an app that automate WhatsApp message,I know aapium out there,but there is no reference how to implement as an app,Can you please tell me!.

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

    Thank you so much for this tutorial

  • @irvansyahnuradis-0614
    @irvansyahnuradis-0614 2 ปีที่แล้ว

    Nice vid bro I dropped a like and a sub

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

    Good video but this calculator can operate only at two numbers. It is unable to perform operation for 3 and more numbers like: 25+32+5 =

  • @ibrahimal-zaidi6436
    @ibrahimal-zaidi6436 2 ปีที่แล้ว

    Hi Philipp why you don't sale your courses on Udemy?

  • @ПавелЗубко-ц8ч
    @ПавелЗубко-ц8ч 2 ปีที่แล้ว

    Hello tell me pls what theme you use in android studio?

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

    Great!!!. Thank you very much!

  • @UhuPost
    @UhuPost 7 หลายเดือนก่อน

    that's very cool👍🏽

  • @tanushkartikeya5049
    @tanushkartikeya5049 2 หลายเดือนก่อน

    I think this video is out of date now, many things now dont work in the new version of Android Studio. He needs to update this video completely.

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

    Please someone answer my question. At 15:31, if you want to retain the state after the screen rotates shouldn't the ViewModel be:
    "var state by rememberSaveable {mutableStateOf(CalculatorState()) }"
    Instead of what's in the video:
    var state by mutableStateOf(CalculatorState())

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

      No, in the viewmodel there's no composition which the state would need to survive

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

      @@PhilippLackner isn’t the purpose of the view model to keep the state after the screen rotates and it’s destroyed?
      I thought rememberSavable was the only way to stop the state from getting destroyed after a configuration change like rotating your screen so why does mutableState work too or does it have a different purpose?

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

      @@punyan775 if you store the state in the composable itself, rememberSaveable is needed. But in a viewmodel it's save since that has a different livecycle

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

      @@PhilippLackner I see. Thank you 🙏🏽

  • @Fazlu3088
    @Fazlu3088 10 หลายเดือนก่อน

    12:33 why you don't use sealed interface instead of class 😅😅😅

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

    You are the fucking best ever Time a have a default thing that needs explaining your the man to go to... I hope you know how much we appreciate you..

  • @akenglishstudy
    @akenglishstudy 11 หลายเดือนก่อน +1

    Probably it's good for someone, but it would be way better if you showed the visual changes while writing the code rather than just describing how it works. Thanks anyway.

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

    Nice content but there should be history like normal calculator app

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

    Thank you Sir

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

    I'm getting error in text sir like annotationstring textunit , that's because i'm unable to run my app

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

    Uma Calculadora Muito fofa!

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

    Philip can I know what your android studio theme is?
    I've been getting into native android recently, previously I've always worked in VS Code and I can't find a theme that I like. This one seems pretty cool to try

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

    Amazing video 🌟🌟🌟

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

    hey im unable to use fontWeigth in calculator.kt please help

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

    Hi phil.. i am always enter ur channel everyday and it helps me a lot... I am just wanna ask u if u could make these tutorials or at least one of them
    - Simple validation clean arch
    - how to handle lifecycle with many real examples
    - paging 3
    Oh and all of them by xml not the compose please 😂

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

    I already saw this one coming.

  • @AbhishekTiwari-of8hp
    @AbhishekTiwari-of8hp 2 ปีที่แล้ว

    how to make table from json data dynamically through kotlin code volley without using xml

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

    Why you haven't use constraint layout ?

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

      u dont need to. nesting is fine

  • @emreskgor2472
    @emreskgor2472 4 หลายเดือนก่อน

    state.copy doesnt work unsolved reference someone help pls

  • @ΧρήστοςΚαρασούλας
    @ΧρήστοςΚαρασούλας 2 ปีที่แล้ว

    Actually, I made the UI and the final row overlaps with the above row because there is not much space. This is solved if I use scrollState on the column or lower the fontSize of the Text, but what is the optimal way of designing it so that it is smoothly running on all devices?

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

      Give the Calc section a weight of 1f and the button section no weight

    • @ΧρήστοςΚαρασούλας
      @ΧρήστοςΚαρασούλας 2 ปีที่แล้ว

      @@PhilippLackner Wow, that worked. Checked the documentation about how weight works when some children are unweighted. Thanks Philipp!

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

      I fixed it by replacing the line
      fontSize = 80.sp,
      to
      style = TextStyle(fontSize = 80.sp),

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

    Having an issue:
    When i click on the numbers it’s not displaying the numbers.. where could be the mistake

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

      same problem bro. Have you resolved this issue yet?
      please answer this

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

      same issue is there any solution

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

      did you fixed it ? dude@@priyanshukumar2606

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

      in your CalculatorButton.kt, make sure the .clickable in your modifier inside your box is .clickable{ onClick() }
      If you use only .clickable {onClick}, it won't work

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

      did you got any solution

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

    That is a great tutorial, could you make another tutorial about authentication especially firebase authentication with google credential in correct way? Thanks!!

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

    Great!

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

    Using a key and value with a loop would work

  • @Lucky_Mirror
    @Lucky_Mirror 5 หลายเดือนก่อน

    Where is thousend separator?

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

    Hi phillip, ive been making an nft app in android studio and im struggling with the xml layout designs. Can you please make a video on an nft marketplace ui design?

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

    How to remove that decimal from result i.e 5+5 = 10.0 how to remove that .0 ?

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

    Спасибо!

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

    🔥🔥🔥🔝

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

    What is this keyboard shortcut? sorry 3:24

    • @MohammadArif-gn7gr
      @MohammadArif-gn7gr 2 ปีที่แล้ว

      I think there is no default keyboard shortcut in AS, but you can set your own by going to Setting -> Keymap -> search kotlin class/file and then you can use any shortcut which is not already assigned to any other

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

    Woow woow

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

    @Philipp: Is there is any way to create project KMP using jetpack library rather than jetpack compose. There is no setting while creating project of KMP. It is by default creating project using jetpack compose library. There should be a option to do so while creating project of KMP .

  • @ChristianMielke
    @ChristianMielke 8 หลายเดือนก่อน

    now i see my calculator from a different perspective 😅

  • @АндрейФилатов-н7щ
    @АндрейФилатов-н7щ 2 ปีที่แล้ว

    Hai anna iam Nagendar Anna na age 42 LIKESEX.Uno qualification m.l.t medical lab technicianc ,Srpt lo jobs unte cheppagalaru anna.with govt Jobs

  • @Karan-ow4wl
    @Karan-ow4wl 2 หลายเดือนก่อน +1

    Very difficult to follow. He just assumes everything we know and starts writing the code without explaining what and why.

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

    Cullem cullem cullem cullem

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

    "With the layout preview while programming, it's better for understanding."😢

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

    Why u havent used textfield there coz in official google there is actually the implementation with text field what will you do when u have to change the number between the input please apply those changes and reupload the video....Thanks

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

    20:26
    41:22

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

    The amount of files required to make this project in the jetpack compose is absurd. Google is trying, but this will down the drain. XML is much simpler and faster to implement.

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

      i agree but in this case only : ) but this is f** future

  • @llamacoder
    @llamacoder 10 หลายเดือนก่อน

    your voice not clear

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

    give up android compose :)

  • @AlexanderMoyer-k3b
    @AlexanderMoyer-k3b 10 หลายเดือนก่อน

    pretty garbage tutorials :/
    Where's JavaScript Mastery for Kotlin/Android? ugh :/