dagger2非@Nullable @Provides方法

时间:2017-05-03 14:44:02

标签: android firebase dependency-injection dagger-2

我正在使用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

我不知道如何解决它:错误是什么?这是错误的注射吗?

谢谢

2 个答案:

答案 0 :(得分:12)

  

无法从非@Nullable @Provides方法返回null

您尝试从标记为null的提供商方法提供@Nullable

查看getCurrentUser()

  

返回当前已登录的FirebaseUser,如果没有,则返回null。

因此,如果没有已登录的用户,则会null,导致以下内容无效...

@Provides @Singleton
public FirebaseUser provideCurrentUser(){
  return FirebaseAuth.getInstance().getCurrentUser(); // could be null!
}

所以要修复它,你有两个选择:

  • 提供FirebaseAuth并在您的应用程序代码中抓取用户,或
  • 将提供商标记为@Nullable

哪种方法更好取决于您的设置,但由于您将用户置于@Singleton范围的组件中,我建议为用户提供,因为它可能会在生命周期内发生变化“单身人士”。

将其移至不同的范围(例如@UserScope@PerUser),或者使用FirebaseAuth.getCurrentUser()抓取用户所需的位置。您仍然可以提供FirebaseAuth

read about nullability here

答案 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);
}