android - dagger2 注入(inject)不起作用 - SharedPreferences

标签 android dependency-injection mvp dagger-2

我正在尝试使用 Dagger2 进行依赖注入(inject). 它在构建阶段给出错误,并说无法注入(inject) SharedPreference 实例。

这是我的模块和组件。

应用模块

@Module
public class ApplicationModule {
    private Application app;
    private String PREF_NAME = "prefs";

    public ApplicationModule(Application app) {
        this.app = app;
    }

    @Singleton
    @Provides
    public Picasso getPicasso() {
        return new Picasso.Builder(app).build();
    }

    @Singleton
    @Provides
    public SharedPreferences getAppPreferences() {
        return app.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }
}

应用组件

@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(App app);
}

App.java

public class App extends Application {

    ApplicationComponent appComponent;

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

    public ApplicationComponent getAppComponent() {
        return appComponent;
    }

    public static App getAppInstance(Context context) {
        return (App) context.getApplicationContext();
    }

    private void createDaggerInjections() {

        appComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .build();
        appComponent.inject(this);

    }
}

登录模块

@Module
public class LoginModule {

    LoginView view;

    public LoginModule(LoginView view) {
        this.view = view;
    }

    @Provides LoginView getLoginView()
    {
        return view;
    }

    @Provides LoginPresenter getLoginPresenter(LoginView view)
    {
        return new LoginPresenterImpl(view);
    }

}

登录组件

@ActivityScope
@Component(
        dependencies = ApplicationComponent.class,
        modules = LoginModule.class)
public interface LoginComponent {
    void inject(LoginActivity activity);

    LoginPresenter getLoginPresenter();
}

LoginActivity.java

public class LoginActivity extends BaseActivity implements LoginView {

    private static final String TAG = "LoginActivity";
    @Inject
    SharedPreferences prefs;
-----
-----
-----
 @Override
    public void createDaggerInjections() {

        DaggerLoginComponent.builder().applicationComponent(App.getAppInstance(this).getAppComponent())
                .loginModule(new LoginModule(this))
                .build();
    }

这一行 @Inject SharedPreferences prefs; 给出如下错误。当我也尝试注入(inject) Picasso 实例时出现同样的错误。

/home/blackidn/proj/styling android 3/dagger 2/DaggerEx/app/src/main/java/com/mohammad/daggerex/App/App.java:8: error: cannot find symbol
import com.mohammad.daggerex.dagger.DaggerApplicationComponent;
                                   ^
  symbol:   class DaggerApplicationComponent
  location: package com.mohammad.daggerex.dagger
/home/blackidn/proj/styling android 3/dagger 2/DaggerEx/app/src/main/java/com/mohammad/daggerex/ui/Login/LoginComponent.java:16: error: android.content.SharedPreferences cannot be provided without an @Provides- or @Produces-annotated method.
    void inject(LoginActivity activity);
         ^
      com.mohammad.daggerex.ui.Login.LoginActivity.prefs
          [injected field of type: android.content.SharedPreferences prefs]

坚持这个并且不知道如何解决这个问题并继续前进。我错过了什么?任何帮助都会很棒。

最佳答案

您应该将 SharedPreferences 公开给 ApplicationComponent 中的 LoginComponent。否则无法注入(inject)。

@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(App app);
    SharedPreferences sharedPreferences();
}

关于android - dagger2 注入(inject)不起作用 - SharedPreferences,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33142026/

相关文章:

android - 按后退按钮导航到菜单

Android 将搜索栏恢复到原始位置(从右到左)

c# - 当我使用依赖注入(inject)读取我的 Azure 函数的应用程序设置时,配置为空

android - 谁在 mvp android 中调用 db 查询和 http get

android - 使用 Retrofit 测试 MVP Android

Android horizo​​ntalscrollview 中心锁

android - 在Android中连接蓝牙耳机后,如何在内置麦克风和耳机麦克风之间切换音频输入?

dependency-injection - iisreset后Unity注册失败

java - 如何限制 @Primary Bean 的上下文?

android - Model View Presenter 和依赖注入(inject)是否正在成为 Android 开发的新标准?