我正在使用Dagger开始我的项目。 我制作了这个模块:
public class Class1 {
public static void main(String[] args) {
new Class1().test(); // see here I couldn't do "Class2 class2 = new Class2(this);" because "this" cannot be used in "static" context, so I had to create an object of Class1
}
private void test() {
Class2 class2 = new Class2(this); // here this means current object of "Class1"
}
}
public class Class2 {
private Class1 class1;
Class2(Class1 _class1){
this.class1 = _class1; // here "this" means the object of Class2.
}
}
和此:
@Module
public class FirebaseModule {
@Provides @Singleton
public FirebaseUser provideCurrentUser(){
return FirebaseAuth.getInstance().getCurrentUser();
}
@Provides @Singleton
public DatabaseReference provideDatabaseReference(){
return FirebaseDatabase.getInstance().getReference();
}
@Provides @Singleton
public FirebaseAuth provideFirebaseAuth(){
return FirebaseAuth.getInstance();
}
}
我也制作了组件:
@Module
public class AppModule
{
private HappyParkApp app;
public AppModule(HappyParkApp app) {
this.app = app;
}
@Provides
public HappyParkApp providesApp()
{
return this.app;
}
@Provides
public Context getAppContext(){
return this.app;
}
}
这是应用程序中实现的appComponent:
@Singleton
@Component(modules = {AppModule.class,
FirebaseModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
}
所以我在MainActivity的public class HappyParkApp extends Application {
private AppComponent appComponent;
private static HappyParkApp instance = new HappyParkApp();
@Override
public void onCreate() {
super.onCreate();
createAppComponent();
}
public static HappyParkApp getInstance() {
return instance;
}
public AppComponent createAppComponent() {
if(appComponent == null){
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.firebaseModule(new FirebaseModule()).build();
}
return appComponent;
}
方法中尝试过这个:
onCreate()
之前:
HappyParkApp.getInstance().createAppComponent().inject(this);
但是我收到了这个错误:
@Inject
FirebaseUser user;
@Inject
DatabaseReference reference;
@Inject
FirebaseAuth mAuth;
在这一行:
Caused by: java.lang.NullPointerException: Cannot return null from a non-@Nullable @Provides method
我不知道如何解决它:错误是什么?这是错误的注射吗?
谢谢
答案 0 :(得分:12)
无法从非@Nullable @Provides方法返回null
您尝试从未标记为null
的提供商方法提供@Nullable
。
返回当前已登录的FirebaseUser,如果没有,则返回null。
因此,如果没有已登录的用户,则会null
,导致以下内容无效...
@Provides @Singleton
public FirebaseUser provideCurrentUser(){
return FirebaseAuth.getInstance().getCurrentUser(); // could be null!
}
所以要修复它,你有两个选择:
FirebaseAuth
并在您的应用程序代码中抓取用户,或@Nullable
哪种方法更好取决于您的设置,但由于您将用户置于@Singleton
范围的组件中,我建议不为用户提供,因为它可能会在生命周期内发生变化“单身人士”。
将其移至不同的范围(例如@UserScope
或@PerUser
),或者使用FirebaseAuth.getCurrentUser()
抓取用户所需的位置。您仍然可以提供FirebaseAuth
。
答案 1 :(得分:1)
如果使用@Nullable注释您的提供者方法,并且忘记在想要使用该对象时使用@Nullable,则dagger将抛出错误(is not nullable but is being provided by @Provides @android.support.annotation.Nullable
)
如果你提供一个可以为空的对象,那么只需使用确保将@Nullable添加到使用该对象作为参数的每个方法
前:
@Nullable
@Provides
static Object provideHomePost(MainActivity activity){
return activity.getObject();
}
@Provides
static Presenter providePresenterFactory(@Nullable HomePost post) {
return new CommentPresenterImpl(post);
}