Slide 1

Slide 1 text

Dagger2 and Android Lifecycle with Kotlin @takuji31

Slide 2

Slide 2 text

@takuji31 (Takuji Nishibayashi)

Slide 3

Slide 3 text

Loves Kotlin

Slide 4

Slide 4 text

Dagger2

Slide 5

Slide 5 text

de facto standard of DI container for Android (may be)

Slide 6

Slide 6 text

Compile )me dependency resolu)on

Slide 7

Slide 7 text

Scoped singleton

Slide 8

Slide 8 text

Example of use

Slide 9

Slide 9 text

Inject context

Slide 10

Slide 10 text

Inject presenter

Slide 11

Slide 11 text

Inject Realm

Slide 12

Slide 12 text

Two Headaches for Android of the life cycle with injected instances

Slide 13

Slide 13 text

Headaches • Handle lifecycle events • Retain some instance during configura7on change

Slide 14

Slide 14 text

Handle lifecycle events

Slide 15

Slide 15 text

Stop UI refreshing in presenter

Slide 16

Slide 16 text

Cancel API request

Slide 17

Slide 17 text

Close Realm instance

Slide 18

Slide 18 text

Unsubscribe RxJava subscrip1on

Slide 19

Slide 19 text

Retain some instance during screen rota0on

Slide 20

Slide 20 text

Keep API request

Slide 21

Slide 21 text

Loaded model instances

Slide 22

Slide 22 text

But, Loader is difficult !

Slide 23

Slide 23 text

Solu%on

Slide 24

Slide 24 text

Headaches • Handle lifecycle events ! • Retain some instance during configura7on change

Slide 25

Slide 25 text

Create lifecycle provider

Slide 26

Slide 26 text

Lifecycle provider interface ActivityLifecycle { fun onCreate(savedInstanceStete: Bundle?) {} fun onSaveInstanceState(outState: Bundle?) {} fun onDestroy() {} //... }

Slide 27

Slide 27 text

Lifecycle provider object Lifecycles { fun activity(vararg lifecycles: ActivityLifecycle): ActivityLifecycle { return object : ActivityLifecycle { override fun onCreate(savedInstanceStete: Bundle?) { lifecycles.forEach { it.onCreate(savedInstanceStete = savedInstanceStete) } } override fun onStart() { lifecycles.forEach { it.onStart() } } //... } }

Slide 28

Slide 28 text

Provide Lifecycle provider @Module class UserModule() { @Provides @PerActivity fun lifecycle(presenter: UserPresenter) : ActivityLifecycle { return presenter //or return Lifecycles.activity(presenter, some, lifecycle, objects) } }

Slide 29

Slide 29 text

Use lifecycle provider class UserActivity : AppCompatActivity() { @Inject lateinit var lifecycle : ActivityLifecycle var component : UserComponent by Delegates.notNull() override fun onCreate(savedInstanceState: Bundle?) { lifecycle.onCreate(savedInstanceStete = savedInstanceState) } override fun onDestroy() { lifecycle.onDestroy() } }

Slide 30

Slide 30 text

Headaches • Handle lifecycle events • Retain some instance during configura7on change !

Slide 31

Slide 31 text

Use retain fragment for keep component

Slide 32

Slide 32 text

Retain fragment class UserComponentFragment : Fragment() { var component: UserComponent? = null init { retainInstance = true } companion object { val TAG = "UserComponentFragment" } }

Slide 33

Slide 33 text

Use retain fragment class UserActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { var storeFragment = supportFragmentManager .findFragmentByTag(UserComponentFragment.TAG) as? UserComponentFragment if (storeFragment == null) { storeFragment = UserComponentFragment() supportFragmentManager .beginTransaction() .add(storeFragment, UserComponentFragment.TAG) .commit() } if (storeFragment.component == null) { //init component } storeFragment.component.inject(this) } }

Slide 34

Slide 34 text

see. takuji31/Dagger2Android

Slide 35

Slide 35 text

Enjoy Dagger2 and Android life !