【问题标题】:Android error: cannot find symbol class DaggerAppComponentAndroid 错误:找不到符号类 DaggerAppComponent
【发布时间】:2019-01-26 07:06:44
【问题描述】:

我的同事根据这个repository开发了一个应用程序,我应该做一些改变

在我的情况下,经过一些更改并删除 Google Room 库后,我遇到了这个问题:

错误:找不到符号类 DaggerApplicationComponent

多次重建后仍然无法生成项目

dagger2Version = '2.20'

implementation "com.google.dagger:dagger:$rootProject.dagger2Version"
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.dagger2Version"
implementation "com.google.dagger:dagger-android:$rootProject.dagger2Version"
implementation "com.google.dagger:dagger-android-support:$rootProject.dagger2Version"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.dagger2Version"

Application Class

import javax.inject.Inject;

import dagger.android.DispatchingAndroidInjector;
import dagger.android.HasActivityInjector;
import uk.co.chrisjenx.calligraphy.CalligraphyConfig;

public class MvvmApp extends Application implements HasActivityInjector {

    @Inject
    DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;

    @Inject
    CalligraphyConfig mCalligraphyConfig;

    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return activityDispatchingAndroidInjector;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        DaggerAppComponent.builder()
                .application(this)
                .build()
                .inject(this);
        BluetoothCollector.getInstance(this);
        AppLogger.init();

        AndroidNetworking.initialize(getApplicationContext());
        CalligraphyConfig.initDefault(mCalligraphyConfig);
    }


    @Override
    public void onTerminate() {
        BluetoothCollector.getInstance(this).disconnect();
        super.onTerminate();
    }
}

AppComponent interface

import javax.inject.Singleton;

import dagger.BindsInstance;
import dagger.Component;
import dagger.android.AndroidInjectionModule;

@Singleton
@Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ActivityBuilder.class})
public interface AppComponent {

    void inject(MvvmApp app);

    @Component.Builder
    interface Builder {

        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }
}

ActivityBuilder Class 进口匕首.模块; 导入 dagger.android.ContributesAndroidInjector;

@Module
public abstract class ActivityBuilder {

    @ContributesAndroidInjector(modules = {
            FeedActivityModule.class,
            BlogFragmentProvider.class,
            OpenSourceFragmentProvider.class})
    abstract FeedActivity bindFeedActivity();

    @ContributesAndroidInjector(modules = LoginActivityModule.class)
    abstract LoginActivity bindLoginActivity();

    // ...

    @ContributesAndroidInjector(modules = SettingsActivityModule.class)
    abstract SettingsActivity bindPageSixActivity();

    @ContributesAndroidInjector(modules = ChoosingModeActivityModule.class)
    abstract ChoosingModeActivity bindChoosingModeActivity();

}

错误日志:

错误:[Dagger/MissingBinding] com.packagename.data.DataManager 不能在没有 @Provides-annotated 方法的情况下提供。

com.packagename.data.DataManager 注入于

com.packagename.ui.feed.FeedActivityModule.provideFeedViewModel(dataManager, ...)

com.packagename.ui.feed.FeedViewModel 注入于

com.packagename.ui.feed.FeedActivity.mFeedViewModel

com.packagename.ui.feed.FeedActivity 被注入

dagger.android.AndroidInjector.inject(T) [com.packagename.di.component.AppComponent ? com.packagename.di.builder.ActivityBuilder_BindFeedActivity.FeedActivitySubcomponent]

FeedActivityModule

import dagger.Module;
import dagger.Provides;

@Module
public class FeedActivityModule {

    @Provides
    FeedPagerAdapter provideFeedPagerAdapter(FeedActivity activity) {
        return new FeedPagerAdapter(activity.getSupportFragmentManager());
    }

    @Provides
    FeedViewModel provideFeedViewModel(DataManager dataManager, SchedulerProvider schedulerProvider) {
        return new FeedViewModel(dataManager, schedulerProvider);
    }
}

FeedViewModel

public class FeedViewModel extends BaseViewModel/*<FeedNavigator>*/ {

    public FeedViewModel(DataManager dataManager, SchedulerProvider schedulerProvider) {
        super(dataManager, schedulerProvider);
    }
}

【问题讨论】:

    标签: android dagger-2 dagger


    【解决方案1】:

    问题是您没有注入 DataManager 类,因此您需要通过构造函数注入来注入 DataManager,或者您必须在 AppComponent 中使用 @Provides 注释提供它,并且您应该使用 AndroidSupportInjectionModule.class 代替 AndroidInjectionModule.class 作为 When您的活动正在扩展 AppCompatActivity,然后使用 AndroidSupportInjection。

    @Component(modules = {AndroidSupportInjectionModule.class, AppModule.class, ActivityBuilder.class})
    public interface AppComponent {
    
        void inject(AppApplication networkApplication);
    
        @Component.Builder
        interface Builder {
            @BindsInstance
            Builder application(AppApplication application);
    
            AppComponent build();
        }
    
    }
    

    【讨论】:

    • 你必须检查日志中的错误然后才能解决它一定有错误
    • 我添加了更多细节
    • FeedActivityModule 可以发这个课程吗
    • 我终于做到了。
    • 问题是你没有注入 DataManager 类,所以你需要通过构造函数注入来注入 DataManager 或者你必须在 AppComponent 中使用 @Provides 注释提供它希望这能工作
    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 2017-10-01
    • 2018-12-15
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多