我创建了一个gist,突出了我遇到的问题。我正在使用一个应用程序模块为我提供Firebase
依赖注入其他地方。
当我尝试在数据层中@Inject Firebase mFirebase
时,永远不会满足依赖性。
我正在尝试将Context
保留在其他图层之外,但Firebase
服务依赖于它。我有兴趣学习任何其他模式,以帮助保持Android
课程不受我的业务逻辑的影响。
FirebaseService.java
public class FirebaseService {
@Inject Firebase mFirebaseRef; //NEVER GET'S INJECTED!
@Override
public LoginResult signinWithEmail(final String email, final String password) {
mFirebaseRef.dostuff(); //THIS REFERENCE DOESN'T GET INJECTED!
}
}
ApplicationModule
@Provides
@Singleton
Firebase provideFirebase(@ApplicationContext Context context) {
Firebase.setAndroidContext(context);
return new Firebase(Util.FIREBASE_URL);
}
ApplicationComponent
@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
@ApplicationContext Context context();
Application application();
Firebase firebase();
}
MyActivity
public class MyActivity extends AppCompatActivity {
private ActivityComponent mActivityComponent;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public ActivityComponent getActivityComponent() {
if (mActivityComponent == null) {
mActivityComponent = DaggerActivityComponent.builder()
.activityModule(new ActivityModule(this))
.applicationComponent(MyApplication.get(this).getComponent())
.build();
}
return mActivityComponent;
}
完整的代码示例位于github
答案 0 :(得分:4)
使用@Inject
注释字段不足以使字段注入工作。没有任何魔法,你只需要告诉Dagger进行注射。
首先,将此方法添加到ApplicationComponent
:
void inject(FirebaseService firebaseService);
然后,从您的FirebaseService
调用此方法(我猜这是Android服务,因此请将其添加到onCreate
方法):
applicationComponent.inject(this);
这应该可以解决问题。对类似问题here有一个很好的答案。
修改强>
我查看了您的存储库,我认为在这种情况下您甚至不需要现场注入。您可以通过构造函数提供Firebase
依赖项。这是您的@Provides
方法:
@Provides
@Singleton
LoginService provideLoginService() {
return new FirebaseLoginService();
}
将Firebase
作为参数添加到其中并将其传递给FirebaseLoginService
构造函数:
@Provides
@Singleton
LoginService provideLoginService(Firebase firebase) {
return new FirebaseLoginService(firebase);
}
构造函数:
public FirebaseLoginService(Firebase firebase) {
this.mFirebaseRef = firebase;
}
从@Inject
字段中删除mFirebaseRef
注释,因为不再需要它。
这是相应的pull request。