Reputation: 3076
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
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
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
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