如何在Kotlin中注入var?

时间:2017-02-26 22:38:02

标签: java android kotlin dagger-2

我尝试将Dagger2实现到我的Kotlin项目中,但我对@Inject注释有问题。

在Java中看起来像这样,这很好用:

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);
    }
}

但我如何在Kotlin写下@Inject行?

当我使用这个时:

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

我收到此错误消息:

Error:Dagger does not support injection into private fields

如果我使用lateinit

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

我收到此错误消息:

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

在Kotlin注入一些东西的正确语法是什么?

3 个答案:

答案 0 :(得分:11)

我只是用

@Inject
lateinit var presenter: ItemsPresenter

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

没有任何问题

答案 1 :(得分:3)

你必须改变你的注射代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul class="list">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

<ul class="list">
    <li>One</li>
    <li>Two</li>
</ul>

,它将被修复。

答案 2 :(得分:1)

您是否在代码中的某处提供了Flowable<Optional<AccessToken>> accessTokenObservable

如果没有 可以制作Error:Flowable<Optional<AccessToken>> cannot be provided without an @Provides- or @Produces-annotated method.。因为你试图在没有提供的情况下注入对象。 在这种情况下,您需要在您的注入器类中提供:

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

然后你需要在你的活动中注入你的对象

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