简体   繁体   中英

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?

I just use

@Inject
lateinit var presenter: ItemsPresenter

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

Without any problems

You have to change your injection code like this:

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

, and it will be fixed.

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>>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM