2016-06-22 2 views
0

Я следую за Dagger2 образец TODO приложение, но имеет 2 ошибки.dagger2 не может найти символ

Ошибка1: не найден символ DaggerNetComponent. (Который на самом деле есть)
Error2: Sharedpreference не может быть обеспечен без @ поставщики аннотированного метода (который я думаю, что результаты Error1)

А вот мой длинный, но простой код:.
три модуля:

@Module 
public class AppModule { 
    private final Application mApplication; 

    AppModule(Application application) { 
     mApplication = application; 
    } 

    @Provides 
    Application provideApplication() { 
     return mApplication; 
    } 
} 

@Module 
public class LoadingModule { 
    public final LoadingContract.View mView; 

    public LoadingModule(LoadingContract.View mView) { 
     this.mView = mView; 
    } 

    @Provides 
    LoadingContract.View provideLoadingContractView() { 
     return mView; 
    } 
} 

@Module 
public class NetModule { 

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


И два компонента:

@Singleton 
@Component(modules = {AppModule.class, NetModule.class}) 
public interface NetComponent { 
} 

@FragmentScoped 
@Component(dependencies = NetComponent.class, modules = LoadingModule.class) 
public interface LoadingComponent { 
    void inject(LoadingActivity loadingActivity); 
} 


я получаю NetComponent в MyApplication:

mNetComponent = DaggerNetComponent.builder() 
       .appModule(new AppModule(this)) 
       .netModule(new NetModule()) 
       .build(); 


и LoadingComponent в LoadingActivity:

DaggerLoadingComponent.builder() 
       .netComponent(((MyApplication)getApplication()).getNetComponent()) 
       .loadingModule(new LoadingModule(loadingFragment)) 
       .build() 
       .inject(this); 


Единственное, что я хочу LoadingComponent впрыснуть это LoadingPresenter.
Также в LoadingActivity:

@Inject LoadingPresenter mLoadingActivityP; 


И это, как LoadingPresenter построены:

public class LoadingPresenter implements LoadingContract.Presenter { 
    private SharedPreferences sharedPreferences; 
    private LoadingContract.View loadingView; 

    @Inject 
    public LoadingPresenter(LoadingContract.View loadingView, SharedPreferences sharedPreferences) { 
     this.loadingView = loadingView; 
     this.sharedPreferences = sharedPreferences; 
    } 

    @Inject 
    void setupListeners() { 
     loadingView.setPresenter(this); 
    } 

    public boolean checkLoginStatus() { 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     return sharedPreferences.getBoolean("loginStatus", false); 
    } 

    @Override 
    public void start() { 
    } 
} 


Конец моей программы.
Это раздражало меня в течение нескольких дней. Любая помощь приветствуется.

+0

Я думаю, вам может потребоваться установить «общедоступную» доступность ко всем методам в ваших модулях. – Chisko

+0

@Cheskos Я пробовал, но это не сработало. Спасибо, в любом случае. – Antelope

+0

попробуйте очистить и перестроить ваш проект. Иногда помогает – Chisko

ответ

4

У вас есть причинность ваших ошибок назад. Классы Dagger* - это конечный результат обработчика аннотации. Поскольку у вас была ошибка на вашем графике, процессор Dagger не смог завершить, поэтому выход отсутствовал.

Вторая ошибка заключается в том, что вы запрашиваете SharedPreferences из компонента, который не имеет привязки. Поскольку вы выбрали зависимые компоненты, а не подкомпоненты, все привязки из ваших зависимостей не унаследованы. Для того, чтобы ваши LoadingComponent использовали привязки от NetComponent, они должны быть выставлены на интерфейсе компонента. Добавление SharedPreferences sharedPreferences(); в NetComponent или переключение на подкомпоненты должно устранить вашу проблему.

Для получения дополнительной информации см. @Component docs и page on subcomponents in the user's guide.

+0

Спасибо большое! Но есть еще одна проблема ... Можете ли вы проверить http://stackoverflow.com/questions/37981293/dagger2-gc-overhead-limit-exceeded, если вы не заняты? – Antelope

Смежные вопросы