Search code examples
androiddependency-injectionkotlinkodein

kodein, inject data to simple class


i'm new on kotlin and kodein development. I want to inject data to a simple class which extends nothing.

I have my MainActivity which extends KodeinAppCompatActivity(), my fragment which extends KodeinSupportFragment() calls a function from my simple class CallType. But this function must to change a boolean from an other simple class ConnectivitySate. I don't want to use static value.

Below, my code :

    class App : Application(), KodeinAware {

override val kodein by Kodein.lazy {
    import(autoAndroidModule(this@App))

    bind<CallType>() with instance(CallType())
    bind<ConnectivityState>() with instance(ConnectivityState())
    bind<ContactData>() with instance(ContactData())

}

override fun onCreate() {
    super.onCreate()
    registerActivityLifecycleCallbacks(androidActivityScope.lifecycleManager)
}        

MainActivity :

    class MainActivity : KodeinAppCompatActivity() {        

My Fragment :

class JournalFragment : KodeinSupportFragment(){

  private val callType: CallType by instance()

  @SuppressLint("MissingSuperCall")
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    initializeInjector()
}

  override fun onCreateView(inflater: LayoutInflater?, container: 
          ViewGroup?,savedInstanceState: Bundle?): View? {

      // !! CALL MY FUNCTION !!
      callType.call(callType.callNumber)

  }

 ....

 @SuppressLint("MissingSuperCall")
 override fun onDestroy() {
    super.onDestroy()
    destroyInjector()
}

My simple class :

class CallType {

fun call(number: String) {

   // !! I want to change gsmState value from ConnectivityState class
   connectivityState.gsmState = true

}

My ConnectivityState class :

class ConnectivityState {

    var gsmState = false

}

It is an example among many others, because in lots of situations, i'm blocked like that. I have try lots of things but i always have like error : value not injected

Thank you very much for your reply..


Solution

  • When you call super.onCreate(), it calls onCreateView, so the line callType.call(callType.callNumber) is called before initializeInjector().

    Note that you should always call initializeInjector() before calling super.onCreate():

    override fun onCreate(savedInstanceState: Bundle?) {
        initializeInjector()
        super.onCreate(savedInstanceState)
    }