作者:qaz2502919927 | 来源:互联网 | 2023-02-04 20:53
我正在使用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();
}
}
还有这个:
@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;
}
}
我也做了这个组件:
@Singleton
@Component(modules = {AppModule.class,
FirebaseModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
这是应用程序中实现的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;
}
}
所以我在onCreate()
MainActivity的方法中尝试过这个:
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
在这一行:
HappyParkApp.getInstance().createAppComponent().inject(this);
我不知道如何解决它:错误是什么?这是错误的注射吗?
谢谢
1> David Medenj..:
无法从非@Nullable @Provides方法返回null
您尝试从未标记为null
的提供程序方法提供.@Nullable
看看getCurrentUser()
返回当前已登录的FirebaseUser,如果没有,则返回null.
因此,如果没有登录用户,这将是null
,使以下无效...
@Provides @Singleton
public FirebaseUser provideCurrentUser(){
return FirebaseAuth.getInstance().getCurrentUser(); // could be null!
}
所以要修复它你有两个选择:
FirebaseAuth
在应用程序代码中提供并获取用户,或
将提供商标记为 @Nullable
哪种方法更好取决于您的设置,但由于您将用户放在@Singleton
范围内的组件中,我建议不要提供给用户,因为它可能会在"Singleton"的生命周期内发生变化.
将其移动到不同的范围(例如@UserScope
或@PerUser
)或者只是在需要的地方抓取用户FirebaseAuth.getCurrentUser()
.你仍然可以提供FirebaseAuth
.
另请阅读此处的可空性.
我标记的方法可以提供null值作为@Nullable以及我提供此值的位置,但无论如何我得到这样的错误`...不可为空,但是由@Provides @ android.support.annotation提供. Nullable`.我究竟做错了什么?