Ralph Bergmann
Ralph Bergmann

Reputation: 3076

How to inject into var in Kotlin?

I try to implement Dagger2 into my Kotlin project but I have problems with the @Inject annotation.

In Java it looks like this and this works fine:

public class FooActivity extends Activity {

    @Inject
    @Named("accessTokenObservable")
    public Flowable<Optional<AccessToken>> accessTokenObservable;

    @Override
    protected void onCreate(@Nullable final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        App.getGraph().inject(this);
    }
}

But how I have to write the @Inject line in Kotlin?

When I use this one:

@Inject
@Named("accessTokenObservable")
var accessTokenObservable: Flowable<Optional<AccessToken>>? = null

I get this error message:

Error:Dagger does not support injection into private fields

If I use lateinit:

@Inject
@Named("accessTokenObservable")
lateinit var accessTokenObservable: Flowable<Optional<AccessToken>>

I get this error message:

Error:Flowable<Optional<AccessToken>> cannot be provided without
an @Provides- or @Produces-annotated method.

What is the right syntax to inject something in Kotlin?

Upvotes: 5

Views: 9142

Answers (3)

Ergin Ersoy
Ergin Ersoy

Reputation: 889

Do you provide Flowable<Optional<AccessToken>> accessTokenObservable somewhere in your code?

If not Error:Flowable<Optional<AccessToken>> cannot be provided without an @Provides- or @Produces-annotated method. can be produced. Because you are trying to inject object without provide it. In this case you need to provide in your injector class:

@Provide
@Named("accessTokenObservable")
fun provideAccessTokenObservable : Flowable<Optional<AccessToken>>{
    return yourAccessTokenObservable
}

then you need to inject your object in your activity

@Inject
@Named("accessTokenObservable")
lateinit var accessTokenObservable: Flowable<Optional<AccessToken>>

Upvotes: 1

Tuby
Tuby

Reputation: 3253

I just use

@Inject
lateinit var presenter: ItemsPresenter

override fun onCreate(savedInstanceState: Bundle?) {
    AndroidInjection.inject(this)
    super.onCreate(savedInstanceState)
    ...
}

Without any problems

Upvotes: 12

Mohsen Mirhoseini
Mohsen Mirhoseini

Reputation: 8882

You have to change your injection code like this:

@field:[Inject Named("accessTokenObservable")]
lateinit var accessTokenObservable: Flowable<Optional<AccessToken>>

, and it will be fixed.

Upvotes: 5

Related Questions