2017-11-04 4 views
0

EDITAndroid Dagger: Ich kann nicht eine externe Klasse ohne @Inject Konstruktor

das Problem gelöst liefern. Siehe meinen Beitrag unten.

Ich schreibe eine Android App mit Verwendung von Dolch und Kotlin.

möchte ich java.text.SimpleDateFormat Klasse in meiner Klasse DateHelper

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

Ich habe ein Modul injizieren, die @ProvidesSimpleDateFormat.

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

und ein Dolch Komponente:

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

meine Schließlich 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 
    } 

} 

Jetzt versuche ich zu @InjectDateHelper in mein Fragment:

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

Leider Kompilierzeitfehler Ich erhalte

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) 

Ich verstehe nicht, warum ich diesen Fehler, da ich @Providing die SimpleDateFormat bin. Natürlich kann ich @Inject Konstruktor nicht hinzufügen, da ich die SimpleDateFormat Klasse nicht besitze.

Irgendwelche Hilfe, was ich vermisse?

+0

Das sieht gut für mich aus, haben Sie vielleicht in einem '@ Qualifier', z. '@named()' oder etwas? –

+0

Ich habe es geschafft, das Problem zu beheben. Siehe meinen Beitrag unten.Ich habe nicht genügend Informationen zur Verfügung gestellt, um das eigentliche Problem zu bemerken, aber ich erkannte nicht, dass der Fehler von einer anderen Komponente kam, weil die Fehlermeldung auf MyAppComponent zeigte. –

Antwort

0

das Problem gelöst

ich nicht das Problem aus einer anderen Komponente aufgetreten ahnte, die ich zum Testen verwenden.

Ich habe einen TestComponent in src/debug/java/..., was für meine Tests Mock-Implementierungen bietet:

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

Da diese Komponente MyAppComponent erstreckt, muss ich auch Bindungen an sie liefern. Klar vermisse ich die DateModule hier. Ändern auf unter fixiert den Übersetzungsfehler:

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

ich durch die Kompilierung Fehlermeldung verleiten wurde, in dem es hieß, dass MyAppComponent die Bindung fehlt, während das eigentliche Problem innerhalb TestComponent liegt.

Ist meine Argumentation richtig, dass die eigentliche Fehlermeldung sich auf TestComponent beziehen sollte?

Verwandte Themen