/componentizationArch

Primary LanguageKotlinApache License 2.0Apache-2.0

Componentization Architecture v2 - [ReComponents]

A reactive, declarative, lifecycle aware, testable and reusable way of using UI components on Android using Redux.

Blog Post

Fragment is not your view

Installation

dependencies {
    // Netflix's ReComponents 0.0.1 Beta
    api(name:'recomponents-0.0.1', ext:'aar')
}

Fragment / Activity

private val store = StoreImpl(
    reducer = ::appReducer,
    initialState = AppState(),
    middleware = listOf(::appMiddleware)
)

class YourActivity : AppCompatActivity() {
    private val uiComponentManager by lazy {
        ViewModelProviders.of(this,
            object : ViewModelProvider.Factory {
                @Suppress("UNCHECKED_CAST")
                override fun <T : ViewModel?> create(modelClass: Class<T>): T {
                    return UIComponentManager(store) as T
                }
            }
        )[UIComponentManager::class.java]
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.linearlayout_main)

        initComponents(findViewById(R.id.root))
    }
    
    private fun initComponents(container: ViewGroup) {
        with(uiComponentManager) {
            subscribe(YourComponent(container)) {
                YourComponentState(
                    ...
                )
            }
            
            ...
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        uiComponentManager.store.unsubscribeAll()
    }

Component

data class YourComponentState(
    ...
)

class YourComponent(
    container: ViewGroup
) : UIComponent<YourComponentState>() {
    override fun render(state: MyComponentState) {}
}

Complete Code Samples

Activity

Redux + Components

Components & RecyclerViews

References

ReKotlin

Netflix’s Android Componentization Architecture V1 - Droidcon NYC 2018 Talk

Netflix’s Android Componentization Architecture V1 - Droidcon SF 2018 Talk