2017-11-04 13 views
0

EDITアンドロイドダガー:私はこの問題を解決@Injectコンストラクタ

ことなく、外部クラスを提供することはできません。下の私のポストを参照してください。

私はDaggerとKotlinを使用してAndroidアプリを書いています。

私は@ProvidesSimpleDateFormatモジュールを、持っているDateHelper

@Singleton 
class DateHelper @Inject constructor(var dateFormat: SimpleDateFormat) { 
... 
} 

私のクラスにjava.text.SimpleDateFormatクラスを注入します。

@Module 
class DateModule { 
    @Singleton 
    @Provides 
    fun dateFormat(): SimpleDateFormat { 
     return SimpleDateFormat("yyyy-MM-dd", Locale.US) 
    } 
} 

とダガーコンポーネント:

@Singleton 
@Component(modules = arrayOf(MyAppModule::class, DateModule::class)) 
interface MyAppComponent { 
    ... 
} 

最後に私のApplication:今

open class MyApplication : Application() { 
    private lateinit var myAppComponent: MyAppComponent 

    override fun onCreate() { 
     super.onCreate() 
     myAppComponent = createGraph() 
    } 

    open fun createGraph(): MyAppComponent { 
     return DaggerMyAppComponent.builder().myAppModule(MyAppModule(this)).build() 
    } 

    fun getAppComponent(): MyAppComponent { 
     return myAppComponent 
    } 

} 

、私は私のFragment@InjectDateHelperにしようとしている:

class CoffeeNoteFragment : Fragment(), DatePickerDialog.OnDateSetListener { 
    @Inject lateinit var dateHelper: DateHelper 
    ... 
    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     (activity.application as MyApplication).getAppComponent().inject(this) 
    } 
} 
私はこのエラーを取得していますなぜ私は @Providing SimpleDateFormatてるので、

は、残念ながら私は

error: [com.example.mateusz.coffeenotes.application.MyAppComponent.inject(com.example.mateusz.coffeenotes.CoffeeNoteFragment)] java.text.SimpleDateFormat cannot be provided without an @Inject constructor or from an @Provides-annotated method. 
    java.text.SimpleDateFormat is injected at 
     com.example.mateusz.coffeenotes.database.DateHelper.<init>(arg0) 
    com.example.mateusz.coffeenotes.database.DateHelper is injected at 
     com.example.mateusz.coffeenotes.CoffeeNoteFragment.dateHelper 
    com.example.mateusz.coffeenotes.CoffeeNoteFragment is injected at 
     com.example.mateusz.coffeenotes.application.MyAppComponent.inject(arg0) 

コンパイル時エラーを取得しています私は、理解していません。私がSimpleDateFormatクラスを所有していないので、明らかに@Injectコンストラクタを追加できません。

私が迷っているものは何ですか?

+0

これは私にとってうまく見えます。 '@ Named()'なんか? –

+0

私は問題を解決することができました。下の私のポストを参照してください。私は実際の問題に気付くのに十分な情報を提供していませんでしたが、エラーメッセージがMyAppComponentを指していたので、別のコンポーネントからエラーが発生していることを認識しませんでした。 –

答えて

0

は、私は、問題は、私はテストのために使用するさまざまなコンポーネントから発生して実現しなかった問題に

を解決しました。

私は私のテストのためのモック実装を提供する、src/debug/java/...TestComponentを有する:このコンポーネントはMyAppComponentを拡張

@Singleton 
@Component(modules = arrayOf(TestModule::class)) 
interface TestComponent : MyAppComponent 

ので、私もそれにバインディングを提供しなければなりません。明らかに私はDateModuleがここにありません。 に変更修正コンパイルエラー以下:

@Singleton 
@Component(modules = arrayOf(TestModule::class, DateModule::class)) 
interface TestComponent : MyAppComponent 

私は、実際の問題はTestComponent内にあるのに対しMyAppComponentは、バインディングが欠落していると述べ、コンパイル・エラー・メッセージによって誤解されました。

実際のエラーメッセージはTestComponentを参照する必要がありますか?

関連する問題