2017-05-19 16 views
3

これまでに動作する新しいDagger Android injection thingを使用しようとしています。モジュールを設定する必要があります

今、私は自分のニーズにそれを広げたいと思います。私MainActivityModule

私はTestModuleを追加しました:

@Module 
internal abstract class TestModule { 

    @Provides 
    internal fun provideTest(): String { 
     return "foo bar" 
    } 
} 

しかし、私はこのエラーを取得する:

@Module 
abstract class MainActivityModule { 

    @ActivityScope 
    @ContributesAndroidInjector(modules = arrayOf(TestModule::class)) 
    internal abstract fun contributeMainActivityInjector(): MainActivity 
} 

TestModuleは本当に簡単ですTestModule must be set

私は生成されたソースコードに見えました私は何をしなければならないかのヒントを見つけることができません。私はあなたがGitHubで完全なアプリを見つけることができますか?あまりにもグーグルで、この検索が、

、私は忘れてしまった何

:-(だけの簡単な例を見つけました。

を編集

ジェフ・ボウマンとしてprovideTest()をサイード静的である必要があります私はこのようなJavaクラスを作成する場合:。

@Module 
public class TestModule { 

    @Provides 
    static String provide() { 
     return "foo bar"; 
    } 
} 

それが動作

最終的な質問:コトルでこれを作る方法?これは動作しません:

@Module 
internal abstract class TestModule { 

    companion object { 

     @Provides 
     @JvmStatic 
     internal fun provideTest(): String { 
      return "foo bar" 
     } 
    } 
} 

私は静的メソッドを作成する別の方法が必要です。

+0

Javaでは、 '@ Provides'メソッドが静的であると期待します。つまり、' TestModule'インスタンスを使用しないことを意味します。しかし、[Kotlinはそのような静的メソッドをサポートしていません](https://kotlinlang.org/docs/reference/classes.html#companion-objects)。私は本当の答えを提供するためにKotlinにはあまりよく慣れていませんが、 'provideTest'は静的ではないので、Daggerはインスタンスを必要とし、パブリックの引数のないコンストラクタを使ってTestModuleをインスタンス化できるとは思われません。 –

答えて

5

葉私はstatic方法を取得するKotlinの方法がcompanion object方法を置くことですが、今ダガーが@Provides@Moduleでのみ使用することができるというエラーがスローされます

:-)解決策を見つけました。この問題を解決するために、私はあまりにも

@Module 
internal abstract class TestModule { 

    @Module 
    companion object { 

     @Provides 
     @JvmStatic 
     internal fun provideTest(): String { 
      return "foo bar" 
     } 
    } 
} 
0

代替ソリューションcompanion objectを注釈付き、それはあなたが/モックテストで依存関係を置き換え、クラス抽象を避けることであろう、そして維持する必要がある場合のビットクリーナーは静的ではありません提供します

@Module 
internal class TestModule { 

    @Provides 
    internal fun provideTest(): String { 
     return "foo bar" 
    } 

} 
関連する問題