![image](https://private-user-images.githubusercontent.com/29736164/285312161-82b0c6e0-5910-410b-bb7b-58ad7864857a.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDkyODYzMzgsIm5iZiI6MTcwOTI4NjAzOCwicGF0aCI6Ii8yOTczNjE2NC8yODUzMTIxNjEtODJiMGM2ZTAtNTkxMC00MTBiLWJiN2ItNThhZDc4NjQ4NTdhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAzMDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMzAxVDA5NDAzOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUyZTkxZjA5MjQ0MDU5MDMxZDQ3NmNjMjU3YjNlYjQzOTAwMWU0NWYyNTFkZjYwNzdkZjFiMWQ3NDZiZTY2MTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.Ae97tRQFPJuB240FhqFDnpsZRBdrvq-eEEGvO9bxUG8)
Compose Multiplatform Pokedex app. [WIP]
- install JDK 17 on your machine
- add
local.properties
file to the project root and set a path to Android SDK there
To run the application on android device/emulator:
- open project in Android Studio and run imported android run configuration
To build the application bundle:
- run
./gradlew :androidApp:assembleDebug
- find
.apk
file inandroidApp/build/outputs/apk/debug/androidApp-debug.apk
To run the application on iPhone device/simulator:
- Open
iosApp/iosApp.xcproject
in Xcode and run standard configuration - Or use Kotlin Multiplatform Mobile plugin for Android Studio
data/
ktorfit api
response models
repository
domain/
domain models
mappers
presentation/
steps
components
strings
- UI: Compose Multiplatform
- Navigation: Voyager
- Strings I18N/L10N: Lyricist
- Icons: Compose Icons
- Network: Ktor + Ktorfit
- Dependency Injection: Kodein + Custom Voyager Scopes
- Image Loading: Compose ImageLoader (Coil is not yet Multiplatform)
- Json parsing: Kotlinx Serialization
- ViewModel + State: Custom Implementation
- UI Integration Test: Maestro
- Foundation Core: Holds custom pure Kotlin functions, currently, the place of the
safeCatching
extension for avoiding Coroutine Scopes not being able to cancel when code called fromrunCatching
. - Foundation Theme: The Compose Material 3 Theming + Platform System theme lookup
- Foundation Swipe Back: Custom component for support Navigation Swipe Back in iOS
- Foundation Serialization: Singleton with default Kotlinx.serialization configuration
- Foundation Network: Setup of Ktor HttpClient and Ktorfit build function
- Foundation Components: Commum Compose Components like, HeaderBar, Error State View, Layout and LazyList Pagination utils
- Foundation Error: The ErrorState model and error mapping
- Foundation Kodein: Custom Kodein Scopes for Voyager Navigator and Screen lifecycle, this make possible to have a dependency that survives until the Navigator or the Screen survives.
- Foundation Step ViewModel: A Custom ViewModel implementation that is opinionated that holds the UI State and the Business State, similar to BloC Cubit
- Foundation Navigation: It has multiple responsibilities, Setup Voyager Navigator with the Kodein Graph + Context, Defines and Provide the Scaffold Composition Local API and most important, defines the Step and StepStateful.
- composeApp: The Compose Main Application Module, it where is has the Main Composable
- androidApp: The Android App with the Activity that initialize the Main Composable from
composeApp
- iosUmbrella: The module that generates the Framework and exposes the Main Composable from
composeApp
as a UiViewController - iosApp: A iOS App using Swift UI that has a build phase for building de
iosUmbrella
module and initializing the UI by consuming the UiViewController from theiosUmbrella
module.
- Gradle: Convention plugins, Kotlin Scripting, Version Catalog and Typesafe Project Accessor
![image](https://private-user-images.githubusercontent.com/29736164/284579369-0654b187-ea0f-4f31-97be-8445d24e8325.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDkyODYzMzgsIm5iZiI6MTcwOTI4NjAzOCwicGF0aCI6Ii8yOTczNjE2NC8yODQ1NzkzNjktMDY1NGIxODctZWEwZi00ZjMxLTk3YmUtODQ0NWQyNGU4MzI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAzMDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMzAxVDA5NDAzOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTJhOGQ3ZDk4MjRkZTdkZTI5OWYyODdhMWM1N2Q2N2I5M2Q5ZDE5OWZhMjY4ZjcwMzA3ZjY3ZGJkMDQyOWNlM2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.U7B5iRwdsIOzq6XeIsFewEgeyo98e05EObh7R8BXRaI)
![image](https://private-user-images.githubusercontent.com/29736164/285231311-52c3517e-a040-46f6-ac81-652a96cc4060.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDkyODYzMzgsIm5iZiI6MTcwOTI4NjAzOCwicGF0aCI6Ii8yOTczNjE2NC8yODUyMzEzMTEtNTJjMzUxN2UtYTA0MC00NmY2LWFjODEtNjUyYTk2Y2M0MDYwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAzMDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMzAxVDA5NDAzOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWUzNWQzN2MwNmNjOTI4NzFlMWI1MTkwYWQ0NjEyN2FlZTE4YTVkYzM0NTYwMmY1OWEyNTUwMGJlMDQ3NWI3NzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.cxFGTl3Apmeua4L1BdSwfWaVluYuks7c6WtpXKWMN-E)
![image](https://private-user-images.githubusercontent.com/29736164/285306566-e18f8653-90c2-4457-86cb-b3605accd364.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MDkyODYzMzgsIm5iZiI6MTcwOTI4NjAzOCwicGF0aCI6Ii8yOTczNjE2NC8yODUzMDY1NjYtZTE4Zjg2NTMtOTBjMi00NDU3LTg2Y2ItYjM2MDVhY2NkMzY0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDAzMDElMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwMzAxVDA5NDAzOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBlODQ0MGIxMjMzYmFhNDkwZjFiNGFiY2FhODhjYTc1NGY1MjIzZTA5ODY4MjU1YWViYmU4MGZkNmQ5ODViOWUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.uAJa_5utD0WBnurhSmf7nAgr2lQPcPPUcN9eShNM9Mc)