dagger2 non-@Nullable @Provides method
android, dagger-2, dependency-injection, firebase
Solution
Cannot return null from a non-@Nullable @Provides method
You try to provide `null` from a provider method that is not marked as `@Nullable`.
Have a look at getCurrentUser()
Returns the currently signed-in FirebaseUser or null if there is none.
So in case there is no signed in user, this will be `null`, making the following invalid...
@Provides @Singleton
public FirebaseUser provideCurrentUser(){
return FirebaseAuth.getInstance().getCurrentUser(); // could be null!
}
So to fix it you have 2 options:
- provide `FirebaseAuth` and grab the user in your application code, or
- mark the provider as `@Nullable`
Which approach is better depends on your setup, but since you put the user in a `@Singleton` scoped component I recommend not providing the user, as it is likely to change within the lifetime of "Singleton".
Either move it into a different Scope (e.g. `@UserScope` or `@PerUser`) or just grab the user where you need it using `FirebaseAuth.getCurrentUser()`. You can ofc still provide `FirebaseAuth`.
Also read about nullability here.
Problem
I'm at the beginning of use Dagger to my projects. I've made this modules: ``` @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(); } } ``` and this: ``` @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; } } ``` I've also made the component: ``` @Singleton @Component(modules = {AppModule.class, FirebaseModule.class}) public interface AppComponent { void inject(MainActivity activity); } ``` and this is the appComponent implemented in the application: ``` 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; } ``` } so I've tried to to this in `onCreate()` method of MainActivity: ``` HappyParkApp.getInstance().createAppComponent().inject(this); ``` and this before: ``` @Inject FirebaseUser user; @Inject DatabaseReference reference; @Inject FirebaseAuth mAuth; ``` but I'm getting this error: ``` Caused by: java.lang.NullPointerException: Cannot return null from a non-@Nullable @Provides method ``` at this line: ``` HappyParkApp.getInstance().createAppComponent().inject(this); ``` and I don't know how to fix it: what is the error? Is this a wrong injection? Thank you