Skip to content

Getting started

Maven Central

Traditionally, you need to add dependency to your project. Currently, there are two types of artifacts:

  • Core - only necessary tools for your projects
  • MVVM - Model-View-ViewModel architecture tools + Core components
Artifact Purpose Dependency
Core Only necessary tools for your projects implementation "dev.inmo:navigation.core:$navigation_version"
MVVM Model-View-ViewModel architecture tools + Core components implementation "dev.inmo:navigation.mvvm:$navigation_version"

Initialization

After you have added your dependency, you should initialize navigation.

There are several important things:

  1. Config - it is an instance of any class which extending the NavigationNodeDefaultConfig in common case
  2. Factory - usually object which may create a node or some required part for node

For example: lets imagine that we have a node Main. Here what should we do to create a node and make it workable in navigation:

data class MainConfig(
    // this id will be used to search an html element by id in JS
    // and Fragment by tag in Android
    override val id: String = "main"
) : NavigationNodeDefaultConfig

JS part

// Core variant without MVVM or Compose
class MainNode(
    config: MainConfig,
    chain: NavigationChain<NavigationNodeDefaultConfig>,
) : JsNavigationNode<MainConfig, NavigationNodeDefaultConfig>(
    chain,
    config
) {
    // Some code
    // In htmlElementStateFlow will be found `HTMLElement` where node should be binded
}
// MVVM Compose variant
class MainNodeView(
    config: MainConfig,
    chain: NavigationChain<NavigationNodeDefaultConfig>,
) : View<MainConfig, NavigationNodeDefaultConfig>(
    config,
    chain
) {
    // Some code
    // In htmlElementStateFlow will be found `HTMLElement` where node should be binded

    @Composable
    override onDraw() {
        Text("Hello world")
    }
}

object MainNodeFactory : NavigationNodeFactory<NavigationNodeDefaultConfig> {
    override fun createNode(
        navigationChain: NavigationChain<Base>,
        config: Base
    ): NavigationNode<out Base, Base>? = if (config is MainConfig) {
        MainNode(config, chain) // Or `MainNodeView(config, chain)` for MVVM
    } else {
        null
    }
}

Android

In Android there is one important note: you will not directly work with nodes. In fact it will be required to create special NodeFragment:

// Core variant
class MainFragment : NodeFragment<MainConfig, NavigationNodeDefaultConfig>() {
    // Your code
    // Here will be available: node with type `AndroidFragmentNode`, config: `MainConfig`
}

Initialization is different on the platforms, so, lets take a look at each one.

JS

In JavaScript it looks like:

initNavigation(

)