Search code examples
androidkotlinandroid-jetpack-composeandroid-jetpack-compose-material3

How to implement BottomSheet in Material 3 Jetpack Compose Android


I know how to implement BottomSheet in Material 2 Jetpack Compose using BottomSheetScaffold.

But there is no BottomSheetScaffold in Material 3. Also, there is nothing in official samples about BottomSheet.


Solution

  • So I was able to make it work!

    It seems that, as of today, BottomSheetScaffold is not available yet on Material3, this is discussed in this issue I found digging around: https://issuetracker.google.com/issues/229839039

    I quote the important part from the reply of a google dev:

    we aren't in a super easy spot with Swipeable. It currently has a number of critical bugs that need to be addressed first (we are working on this), which is why we are limiting the surface we are exposing for Swipeable in M3 for the time. Our plan for the coming months is to focus on this specific area and improve developer experience.

    Material 3 for Jetpack Compose is still in alpha - this means we consider components production-ready, but the API shape is flexible while in alpha. This gives us space to iterate while getting real-world feedback from developers, which ultimately helps improve your experience. Copy-pasting source code for components that are not (fully) implemented or exposed in an alpha version can be a good thing to do in the meantime! Owning the source code while the API shape is still flexible gives you a number of benefits like ease of updating dependencies, even if the APIs change, and allows you to evolve your components in your own pace.

    So I just followed the advice and I copy pasted BottomSheetScaffold into my project. Of course it did not work straight away because of a few missing classes and some minor API changes. At the end I was able to make it work by pulling and hacking the following classes and adding them to my project:

    • BottomSheetScaffold.kt
    • Drawer.kt
    • Strings.kt
    • Swipeable.kt

    I have created a gist with the source code if you want to try: https://gist.github.com/Marlinski/0b043968c2f574d70ee6060aeda54882

    You will have to change the import to make it work on your project as well as add the "-Xjvm-default=all" option by adding the following into your gradle file in the android{} section:

    android{ 
       ...
       kotlinOptions {
            freeCompilerArgs += ["-Xjvm-default=all"]
    
            // "-Xjvm-default=all" option added because of this error:
            // ... Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option
            // triggered by porting BottomSheetScaffold for Material3 on Swipeable.kt:844
       }
    }
    

    It works very well for me, will keep this solution until it is officially supported in material3.

    Hope it helps!