dagger2非@Nullable @Provides方法

ste*_*206 8 android dependency-injection firebase dagger-2

我正在使用Dagger开始我的项目.我制作了这个模块:

@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();
}
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

@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;
}
}
Run Code Online (Sandbox Code Playgroud)

我也做了这个组件:

@Singleton
@Component(modules = {AppModule.class,
                      FirebaseModule.class})
public interface AppComponent {

    void inject(MainActivity activity);
}
Run Code Online (Sandbox Code Playgroud)

这是应用程序中实现的appComponent:

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;
}
Run Code Online (Sandbox Code Playgroud)

}

所以我在onCreate()MainActivity的方法中尝试过这个:

HappyParkApp.getInstance().createAppComponent().inject(this);
Run Code Online (Sandbox Code Playgroud)

而这之前:

 @Inject
FirebaseUser user;

@Inject
DatabaseReference reference;

@Inject
FirebaseAuth mAuth;
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

 Caused by: java.lang.NullPointerException: Cannot return null from a non-@Nullable @Provides method
Run Code Online (Sandbox Code Playgroud)

在这一行:

 HappyParkApp.getInstance().createAppComponent().inject(this);
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dav*_*jak 14

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

您尝试从未标记为null的提供程序方法提供.@Nullable

看看getCurrentUser()

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

因此,如果没有登录用户,这将是null,使以下无效...

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

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

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

哪种方法更好取决于您的设置,但由于您将用户放在@Singleton范围内的组件中,我建议不要提供给用户,因为它可能会在"Singleton"的生命周期内发生变化.

将其移动到不同的范围(例如@UserScope@PerUser)或者只是在需要的地方抓取用户FirebaseAuth.getCurrentUser().你仍然可以提供FirebaseAuth.

另请阅读此处的可空性.

  • 我标记的方法可以提供null值作为@Nullable以及我提供此值的位置,但无论如何我得到这样的错误`...不可为空,但是由@Provides @ android.support.annotation提供. Nullable`.我究竟做错了什么? (4认同)

sey*_*ari 6

如果您使用 @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);
}
Run Code Online (Sandbox Code Playgroud)