Android Dagger 2在那里时要求@Provides

阿拉什·梅恩

我正在尝试使用匕首2在我的项目中实现Retrofit,它给了我以下错误:

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)

所以这是我的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);
}

这是LotteryComponent

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

}

然后是我的LotteryModule

@Module
public class LotteryModule {

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

当我执行清理>重建项目时,即使我的LotteryModule具有对象的@Provides批注,它也会给我错误。

可能我在这里错过了一些东西。任何帮助表示赞赏。

编辑:在我的应用程序类中创建了改造,如下所示:

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

NetworkModule:

@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();
    }
}

这是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);
    }
}

当我使用

@Inejct 
LotteryApiInterface LotteryApiInterface; 

它将抛出给定的错误消息。

史诗熊猫力量

在Dagger2中使用字段注入时,component.inject(this);您一起使用的组件需要能够提供您标记为的每个依赖项@Inject

这意味着在您的情况下,您不应该拥有

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

相反,你应该有

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

但值得注意的是,您的网络模块应

@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();
    }
}

而且您的NetworkComponent应该是

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Android Dagger 2:注入与提供

来自分类Dev

Android Dagger 2 POJO字段注入null

来自分类Dev

Android Dagger 2编译错误

来自分类Dev

带有Dagger 2的Android纯Junit

来自分类Dev

Android上的Dagger 2,缺少错误消息

来自分类Dev

Dagger 2和Android数据绑定冲突

来自分类Dev

Android活动之间的Dagger 2 Singleton

来自分类Dev

Dagger 2和Android数据绑定冲突

来自分类Dev

Dagger-2 (android) 的空指针异常

来自分类Dev

Android Dagger2 依赖注入

来自分类Dev

Android Kotlin dagger 2 ViewModel 注入错误

来自分类Dev

未注入 Android Dagger2 字段

来自分类Dev

跨 Android 模块的 Dagger 2 子组件

来自分类Dev

使用 Dagger 2 进行改造 - android

来自分类Dev

WorkManager Java Android Dagger2

来自分类Dev

Android Dagger和Firebase

来自分类Dev

Android中的Dagger范围

来自分类Dev

Dagger不会为Android生成Dagger类

来自分类常见问题

没有@Provides注释的方法无法提供(Android Kotlin中的Dagger 2)

来自分类Dev

Android Dagger 2和MVP注入到注入的对象内部

来自分类Dev

使用Dagger 2进行Android单元测试

来自分类Dev

Dagger 2第三方注入Android

来自分类Dev

在Android Dagger 2中找不到DaggerAppComponent和AppComponent类

来自分类Dev

Android 中的 Dagger2 范围和 RepositoryPattern

来自分类Dev

android dagger2注入错误无法投射

来自分类Dev

Android 使用 Dagger 2 实现 HostSelectionInterceptor 以动态更改 url

来自分类Dev

Android Dagger2,单例交叉组件

来自分类Dev

android studio 中未生成 Dagger 2 组件

来自分类Dev

Android NDK链接V8静态库:找不到符号,但它们在那里