2017-02-26 5 views
3

私はKotlinプロジェクトにDagger2を実装しようとしていますが、私は@Inject注釈に問題があります。コトリンで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); 
    } 
} 

しかし、私はKotlinに@Inject行を記述する必要がどのように?

私はこの1つを使用する場合:

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

私は、このエラーメッセージが出ます:私は、このエラーメッセージが表示されます

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

::私はlateinitを使用している場合

Error:Dagger does not support injection into private fields 

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

Kotlinに何かを注入する正しい構文は何ですか?

+0

は、[このトピック](HTTPを見てみましょう、あなたの活動にあなたのオブジェクトを挿入する必要があります。この場合、 は、あなたのインジェクタクラスで提供する必要があります.com/questions/36199796/dagger-2-named-can-be-provide-a-provide-methodを提供することはできません)。名前付き注入には特殊な構文があります – Dimezis

+0

ありがとうございます@Dimezis –

答えて

2

あなたは、このようなあなたの注入コードに変更する必要があります。

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

を、そしてそれが修正されます。

11

私は何の問題も

+1

少し話題のニックピンクだが、https://google.github.io/dagger/android.htmlによると、 '' AndroidInjection.inject(this); ''は前に呼び出されるべきです'' super.onCreate(savedInstanceState); '' –

1

なければ

@Inject 
lateinit var presenter: ItemsPresenter 

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

を使用し、あなたのコード内のどこかにFlowable<Optional<AccessToken>> accessTokenObservableを提供していますか?

の場合 Error:Flowable<Optional<AccessToken>> cannot be provided without an @Provides- or @Produces-annotated method.が生成できます。あなたはそれを提供せずにオブジェクトを注入しようとしているからです。 // stackoverflowの:

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

は、あなたが

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