dagger2 注入不起作用 - SharedPreferences
dagger2 injection not working - SharedPreferences
我正在尝试使用 Dagger2 进行依赖注入。
它在构建阶段出错,并说无法注入 SharedPreference 实例。
这是我的模块和组件。
Application Module
@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);
}
}
ApplicationComponent
@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);
}
}
Login Module
@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);
}
}
LoginComponent
@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;
报错如下。当我也尝试注入 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。否则无法注入。
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(App app);
SharedPreferences sharedPreferences();
}
匕首 2 更新:
@Subcomponent 可以在不需要执行此操作的情况下使用,如上下文所示:(ChatComponent 是具有自定义范围的子组件)
我正在尝试使用 Dagger2 进行依赖注入。 它在构建阶段出错,并说无法注入 SharedPreference 实例。
这是我的模块和组件。
Application Module
@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);
}
}
ApplicationComponent
@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);
}
}
Login Module
@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);
}
}
LoginComponent
@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;
报错如下。当我也尝试注入 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。否则无法注入。
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(App app);
SharedPreferences sharedPreferences();
}
匕首 2 更新:
@Subcomponent 可以在不需要执行此操作的情况下使用,如上下文所示:(ChatComponent 是具有自定义范围的子组件)