Исключение нулевого указателя Dagger-2 (Android)
подробности
Исключение нулевого указателя в классе UseContex при использовании метода printToast() класса UseContex. Класс UseContex расширяет mainActivity. Если я печатаю тост в MainActivity, то он не содержит нулевого указателя на объект контекста, но то же самое указывает на UseContex, чем на ноль исключение указателя.
AppComponent
@Singleton @Component(modules = {AppModule.class})
public interface AppComponent {
void inject(DaggerApplication daggerApplication);
void inject(MainActivity mainActivity);
}
AppModule
@Module
public class AppModule {
private final DaggerApplication application;
public AppModule(DaggerApplication application) {
this.application = application;
}
@Singleton
@Provides
Context providesApplicationContext(){
return application;
}
@Singleton
@Provides
UseContex provideUsecontex(){
return new UseContex();
}
}
UseContex
public class UseContex extends MainActivity{
public void printToast(){
Log.e("User dao impl","Hello user dao");
Toast.makeText(context, "helo", Toast.LENGTH_SHORT).show();
}
}
Основная деятельность
public class MainActivity extends AppCompatActivity {
@Inject
UseContex useContex;
@Inject
public Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((DaggerApplication)getApplication()).getAppComponent().inject(this);
useContex.printToast();
}
}
DaggerApplication
public class DaggerApplication extends Application {
AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder().appModule(new
AppModule(this)).build();
appComponent.inject(this);
}
public AppComponent getAppComponent(){return appComponent;}
}
2 ответа
Кинжал не впрыскивает UseContex
подкласс, потому что AppComponent
не @provide
UseContex
, AppComponent
только @providing
MainActivity
и вы проходите в UseContex
как его полиморфный базовый класс и надеясь, что это работает. Вместо, @provide
UseContex
в вашем AppComponent
и Dagger введет ваши поля базового класса.
Он показывает нулевой указатель, потому что контекст не определен в классе UseContex. Вы должны использовать "getApplicationContext" вместо "context" в этой строке
Toast.makeText(context, "helo", Toast.LENGTH_SHORT).show();
замена
Toast.makeText(getApplicationContext, "helo", Toast.LENGTH_SHORT).show();