GithubHelp home page GithubHelp logo

kmm's Introduction

moko-template
GitHub license kotlin-version

Mobile Kotlin multiplatform project template

A sample project that helps to start building a Mobile Kotlin Multiplatform application. It establishes an architecture optimized for building cross-platform mobile applications through separation of concerns between the UI and business logic.

Table of Contents

Features

  • Kotlin Multiplatform's motto is Don't Repeat Yourself. Share the business logic code written in Kotlin between Android and iOS apps. 100% native UI and performance (shared code compiles into native libraries);
  • Kotlin Gradle DSL – Configure project with flexible Kotlin Gradle DSL;
  • Modular-bazed architecture – Implement app features independently of each other. Inject dependencies into features at compile-time through the use of the Factory class;
  • Parallel build of modules – Feature modules and the domain module don't depend on each other. This provides caching of build artifacts for each module and results in better compilation time;
  • Dependencies definition in buildSrc - Simplify dependency management across modules;
  • Ready to use - Template project includes all moko libraries and supports most common use cases:
    • ViewModels;
    • LiveData;
    • Resource management;
    • Runtime permissions access;
    • Media access;
    • UI lists management from shared code;
    • Network layer generation from OpenAPI.

Modules

Legend

The color describes different modules and the shape - the type of an element (class|interface). legend

Modules scheme

modules scheme This scheme shows the structure of the project:

  • We have two applications that represent the View application layer:
    • android-app written in Kotlin uses Activity and Fragment;
    • ios-app written in Swift uses UIViewController with Storyboards.
  • Both applications depend on mpp-library (Kotlin Multiplatform) that provides access to ViewModel's of each feature through SharedFactory. The library is responsible for setting up connections between the feature and domain modules.
  • mpp-library consists of modules:
    • domain (Kotlin Multiplatform) - contains the domain entities, repositories, server API classes, and DomainFactory that creates instances for all of them;
    • feature (Kotlin Multiplatform). Every feature contains corresponding ViewModel, Factory, models, and interfaces it expects to be injected from the parent module. In this example:
      • config contains an config feature's ViewModel, data store interface and ConfigFactory that create instances of ViewModel;
      • list contains a items list feature's ViewModel, data source interface, list items factory interface, and ListFactory that create instances of ViewModel.

Config module scheme

config module scheme The connections between the feature:config classes and the domain classes implemented in the mpp-library module.

List module scheme

list module scheme The connections between the feature:list classes and the domain classes implemented in the mpp-library module.
SharedFactory.NewsUnitsFactory interface is implemented on both platforms - Android (android-app) and iOS (ios-app).

Screenshots

Android iOS
android-app ios-app
android-app ios-app

How to Run

Android - just open repository root directory in Android Studio and press Run.
iOS - run pod install in directory ios-app. Then open ios-app/ios-app.xcworkspace and press Run on simulator/device.

Project setup

Setup your own ApplicationId

Just like in other native apps
In android-app/build.gradle.kts change org.example.app in the following line:

applicationId = "org.example.app"

In Xcode project settings change Bundle Identifier.

Setup your own project name

Just like in other native apps
In android-app/src/main/res/values/strings.xml change value of app_name.
In Xcode project settings change Display name.

Setup your own app icon

Just like in other native apps
Put your android icon to android-app/src/main/res and setup usage in android-app/src/main/AndroidManifest.xml.
Put your iOS icon to ios-app/src/Assets.xcassets/AppIcon.appiconset.

Create new feature module

Create a file mpp-library/feature/myfeature/build.gradle.kts with the following content:

plugins {
    plugin(Deps.Plugins.androidLibrary)
    plugin(Deps.Plugins.kotlinMultiplatform)
    plugin(Deps.Plugins.mobileMultiplatform)
}

Add module to buildSrc/src/main/kotlin/Deps.kt:

object Deps {
    ...

    object Modules {
        ...

        object Feature {
            ...

            val myfeature = MultiPlatformModule(
                name = ":mpp-library:feature:myfeature",
                exported = true
            )
        }
    }
}

Add module to settings.gradle.kts:

include(":mpp-library:feature:myfeature")

Add dependency to module from the mpp-library in mpp-library/build.gradle.kts:

val mppModules = listOf(
    ...
    Modules.MultiPlatform.Feature.myfeature
)

Contributing

All development of template is performed in the master branch. Please send PRs with bug fixes to the master branch.

Please refer to the contributing guide for more details.

Thanks

We test Apple Silicon support with MacStadium. macstadium

License

Copyright 2019 IceRock MAG Inc

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

kmm's People

Contributors

sytler avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.