2017-02-26 52 views
3

我尝试将Dagger2实施到我的Kotlin项目中,但我在@Inject注释中遇到问题。如何注入Kotlin中的var?

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

但我怎么也写在科特林的@Inject线?

当我用这一个:

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

我收到此错误信息:如果我使用lateinit

Error:Dagger does not support injection into private fields 

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

我收到此错误信息:

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

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

+0

看看本主题(HTTP://计算器的.com /问题/ 36199796 /匕首-2-命名不能待提供,而无需-A-提供方法)。命名注射有一些特殊的语法 – Dimezis

+0

谢谢@Dimezis –

回答

2

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

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

,这将是固定的。

11

我只是用

@Inject 
lateinit var presenter: ItemsPresenter 

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

没有任何问题

+1

稍微偏离主题nitpick,但根据https://google.github.io/dagger/android.html''AndroidInjection.inject(this);''应该之前调用'' super.onCreate(savedInstanceState); '' –

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