2016-07-26 33 views
1

Ich versuche Retrofit In meinem Projekt 2 mit Dolch zu implementieren und es gibt mir die folgenden Fehler:Android Dagger 2 fragt nach @Provides, während es sie gibt

Error:(22, 10) error: com.toranj.tyke.restApi.LotteryApiInterface cannot be provided without an @Provides- or @Produces-annotated method. 
com.toranj.tyke.restApi.LotteryApiInterface is injected at 
com.toranj.tyke.ui.MainActivity.LotteryApiInterface 
com.toranj.tyke.ui.MainActivity is injected at 
com.toranj.tyke.dagger.components.NetworkComponent.inject(activity) 

so hier ist mein LotteryApiInterface:

public interface LotteryApiInterface { 
    @GET("/lottery/search") 
    Call<List<Lottery>> getByCriteria(@Query("q") String query); 

    @GET("lottery/details") 
    Call<Lottery> getById(@Query("Id") String id); 
} 

und hier ist die LotteryComponent:

@PerActivity 
@Component(dependencies = NetworkComponent.class, modules = LotteryModule.class) 
public interface LotteryComponent { 
    void inject(MainActivity activity); 

} 

und da geht mein LotteryModule:

@Module 
public class LotteryModule { 

    @Provides 
    @PerActivity 
    public LotteryApiInterface providesLotteryApiInterface(Retrofit retrofit) { 
     return retrofit.create(LotteryApiInterface.class); 
    } 
} 

wenn ich reinigen> Rebuild das Projekt es mir den Fehler gibt, obwohl meine LotteryModule die @Provides Anmerkung für das Objekt hat.

Vermutlich vermisse ich hier etwas. Jede Hilfe wird geschätzt.

EDIT: Retrofit wird, wie unten in meiner Application-Klasse erstellt:

public class TykeApp extends Application { 

    private NetworkComponent networkComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     networkComponent = DaggerNetworkComponent.builder() 
       .appModule(new AppModule(this)) 
       .networkModule(new  NetworkModule("http://192.168.0.3:8080")) 
       .build(); 
    } 

    public NetworkComponent getNetworkComponent() { 
     return networkComponent; 
    } 
} 

NetworkComponent:

@Singleton 
@Component(modules = { AppModule.class, NetworkModule.class }) 
public interface NetworkComponent { 
    void inject(MainActivity activity); 

    Retrofit retrofit(); 
    OkHttpClient okHttpClient(); 
    SharedPreferences sharedPreferences(); 
} 

Network:

@Module 
public class NetworkModule { 

    String baseUrl; 

    public NetworkModule(String baseUrl) { 
     this.baseUrl = baseUrl; 
    } 

    @Provides 
    SharedPreferences provideSharedPreferences(Application application) { 
     return PreferenceManager.getDefaultSharedPreferences(application); 
    } 

    @Provides 
    OkHttpClient provideOkhttpClient() { 
     OkHttpClient.Builder client = new OkHttpClient.Builder(); 
     return client.build(); 
    } 

    @Provides 
    Retrofit provideRetrofit(OkHttpClient httpClient) { 
     return new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(baseUrl) 
       .client(httpClient) 
       .build(); 
    } 
} 

und dies ist der MainActivity:

public class MainActivity extends BaseActivity { 

    @Inject 
    Retrofit retrofit; 

    @Inject 
    LotteryApiInterface LotteryApiInterface; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ((TykeApp)getApplication()).getNetworkComponent().inject(this); 

     LotteryComponent lotteryComponent = DaggerLotteryComponent.builder() 
       .lotteryModule(new LotteryModule()) 
       .build(); 
     lotteryComponent.inject(this); 
    } 
} 

Als ich

@Inejct 
LotteryApiInterface LotteryApiInterface; 

verwende es führt die angegebene Fehlermeldung.

+0

Und wo erstellen Sie 'Retrofit' selbst? – Divers

+0

Retrofit wird in Application erstellt und es ist Singleton und es funktioniert ganz gut. Ich werde die Frage aktualisieren –

+0

Retrofit an diese Methode 'public LotteryApiInterface liefertLotteryApiInterface (Retrofit Retrofit) {' sollte mit Dolch – Divers

Antwort

2

Wenn Sie Feldeinkopplung in Dagger2 verwenden, dann die Komponente, die Sie verwenden component.inject(this); mit Bedürfnisse der Lage sein, zu bieten jede Abhängigkeit, die Sie mit @Inject markiert.

Dies bedeutet, dass in Ihrem Fall, Sie nicht

((TykeApp)getApplication()).getNetworkComponent().inject(this); 

Und stattdessen sollen Sie wert haben

LotteryComponent lotteryComponent = DaggerLotteryComponent.builder() 
      .networkComponent(((TykeApp)getApplication()).getNetworkComponent()) 
      .lotteryModule(new LotteryModule()) 
      .build(); 
    lotteryComponent.inject(this); 

haben sollte, aber es ist darauf hingewiesen, dass Ihr Netzwerkmodul

sein sollte
@Module 
public class NetworkModule { 

    String baseUrl; 

    public NetworkModule(String baseUrl) { 
     this.baseUrl = baseUrl; 
    } 

    @Provides 
    SharedPreferences provideSharedPreferences(Application application) { 
     return PreferenceManager.getDefaultSharedPreferences(application); 
    } 

    @Provides 
    @Singleton 
    OkHttpClient provideOkhttpClient() { 
     OkHttpClient.Builder client = new OkHttpClient.Builder(); 
     return client.build(); 
    } 

    @Provides 
    @Singleton 
    Retrofit provideRetrofit(OkHttpClient httpClient) { 
     return new Retrofit.Builder() 
       .addConverterFactory(GsonConverterFactory.create()) 
       .baseUrl(baseUrl) 
       .client(httpClient) 
       .build(); 
    } 
} 

Und Ihre NetworkComponent sollte

sein
@Singleton 
@Component(modules = { AppModule.class, NetworkModule.class }) 
public interface NetworkComponent { 
    Retrofit retrofit(); 
    OkHttpClient okHttpClient(); 
    SharedPreferences sharedPreferences(); 
} 
+0

woh ... fantastisch, es hat funktioniert. Danke für die Hilfe. Ich habe dich verstanden. Prost –