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
返回当前已登录的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.
另请阅读此处的可空性.
如果您使用 @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)
| 归档时间: |
|
| 查看次数: |
5162 次 |
| 最近记录: |