Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dagger just got better

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on. →

Dagger just got better

New features in the latest Dagger dependency injection library.

Avatar for Dino Bikić

Dino Bikić

October 04, 2017

More Decks by Dino Bikić

Other Decks in Programming

Transcript

  1. @Module public class BestModule { @Provides BestObjectEver bestObjectEver() { return

    new BestObjectEver(); } @Provides MasterObject masterObject() { return new MasterObject(); } @Provides GodObject godObject() { return new GodObject(); } }
  2. public class BestAppEver extends Application { static BestComponent bestComponent; public

    void onCreate() { super.onCreate(); bestComponent = DaggerBestComponentEver.create(); } }
  3. public class BestActivityEver extends Activity { @Inject BestObjectEver bestObjectEver; public

    void onCreate() { super.onCreate(); BestAppEve.bestComponent } }
  4. public class BestActivityEver extends Activity { @Inject BestObjectEver bestObjectEver; public

    void onCreate() { super.onCreate(); BestAppEve.bestComponent.instantiate() } }
  5. public class BestActivityEver extends Activity { @Inject BestObjectEver bestObjectEver; public

    void onCreate() { super.onCreate(); BestAppEve.bestComponent.instantiate() .inject(BestActivityEver.this); } }
  6. @Module public class SchedulersModule { @Provides public Scheduler main() {

    return AndroidSchedulers.mainThread(); } @Provides public Scheduler io() { return Schedulers.io(); } }
  7. @Module public class SchedulersModule { @Provides @MainThread public Scheduler main()

    { return AndroidSchedulers.mainThread(); } @Provides @Io public Scheduler io() { return Schedulers.io(); } }
  8. @Component(modules = { AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class}) public interface AppComponent {

    @Component.Builder interface Builder { @BindsInstance Builder application(Application application); } }
  9. @Component(modules = { AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class}) public interface AppComponent {

    @Component.Builder interface Builder { @BindsInstance Builder application(Application application); AppComponent build(); } }
  10. @Component(modules = { AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class}) public interface AppComponent {

    @Component.Builder interface Builder { @BindsInstance Builder application(Application application); AppComponent build(); } void inject(AndroidSampleApp app); }
  11. @Module public abstract class ActivityBuilder { @Binds @IntoMap @ActivityKey(MainActivity.class) abstract

    AndroidInjector.Factory<? extends Activity> bindMainActivity(MainActivityComponent.Builder builder); }
  12. @Module public abstract class ActivityBuilder { @Binds @IntoMap @ActivityKey(MainActivity.class) abstract

    AndroidInjector.Factory<? extends Activity> bindMainActivity(MainActivityComponent.Builder builder); @Binds @IntoMap @ActivityKey(DetailActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindDetailActivity(DetailActivityComponent.Builder builder); }
  13. @Module(subcomponents = { MainActivityComponent.class, DetailActivityComponent.class}) public class AppModule { @Provides

    @Singleton Context provideContext(Application application) { return application; } }
  14. @Module public class MainActivityModule { @Provides MainView provideMainView(MainActivity mainActivity){ return

    mainActivity; } @Provides MainPresenter provideMainPresenter(MainView mainView, ApiService apiService){ return new MainPresenterImpl(mainView, apiService); } }
  15. public class AndroidSampleApp extends Application implements HasActivityInjector { @Inject DispatchingAndroidInjector<Activity>

    activityDispatchingAndroidInjector; @Override public DispatchingAndroidInjector<Activity> activityInjector() { return activityDispatchingAndroidInjector; } }
  16. public class MainActivity extends Activity { @Override protected void onCreate(Bundle

    savedInstanceState) { AndroidInjection.inject(this); super.onCreate(savedInstanceState); } }
  17. 
 @ProductionComponent(
 dependencies = AppComponent.class,
 modules = ApiProducerModule.class
 )
 public

    interface AppProductionComponent { 
 ListenableFuture<UserManager> userManager();
 
 ListenableFuture<UserModule.Factory> userModuleFactory();
 }
  18. appProductionComponent = splashActivity.getAppProductionComponent();
 Futures.addCallback(appProductionComponent.userManager(), new FutureCallback<UserManager>() {
 @Override
 public void

    onSuccess(UserManager result) {
 SplashActivityPresenter.this.userManager = result;
 }
 
 @Override
 public void onFailure(Throwable t) {
 
 }
 });
  19. • PRO • Background, baby! • CONS • Guava →

    15k methods • More complicated code PRODUCERS
  20. @Module
 public class AppModule {
 
 @Provides
 @Singleton
 Retrofit retrofit()

    {
 Retrofit retrofit = new Retrofit();
 retrofit.init();
 return retrofit;
 }
 
 }
  21. @Module
 public class AppModule {
 
 @Provides
 @Singleton
 Retrofit provideHeavyExternalLibrary()

    {
 Retrofit retrofit = new Retrofit();
 retrofit.init();
 return retrofit;
 }
 
 @Provides
 @Singleton
 Observable<Retrofit> provideRetrofitObservable(
 final Lazy<Retrofit> retrofit) {
 return Observable.fromCallable(retrofit::get)
 .subscribeOn(Schedulers.io())
 .observeOn(AndroidSchedulers.mainThread());
 }
 }
  22. public class MainActivity extends AppCompatActivity {
 
 @Inject
 Observable< Retrofit

    > retrofitObservable;
 
 Retrofit retrofit;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(); 
 }
 }
  23. public class MainActivity extends AppCompatActivity {
 
 @Inject
 Observable< Retrofit

    > retrofitObservable;
 
 Retrofit retrofit;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(); 
 retrofitObservable.subscribe(
 );
 }
 }
  24. public class MainActivity extends AppCompatActivity {
 
 @Inject
 Observable<Retrofit> retrofitObservable;


    
 Retrofit retrofit;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(); 
 retrofitObservable.subscribe(
 retrofit -> retrofit = retrofit,
 throwable -> {}
 );
 }
 }
  25. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent

    plus(FirstModule firstModule, SecondModule secondModule);
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 }
  26. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent

    plus(FirstModule firstModule, SecondModule secondModule);
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 void inject(MainActivity mainActivity);
 }
  27. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent.Builder

    firstComponentBuilder();
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 }
  28. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent.Builder

    firstComponentBuilder();
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 @Subcomponent.Builder
 interface Builder {
 }
 
 void inject(MainActivity mainActivity);
 
 }
  29. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent.Builder

    firstComponentBuilder();
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 @Subcomponent.Builder
 interface Builder {
 FirstComponent.Builder firstModule(FirstModule firstModule);
 }
 
 void inject(MainActivity mainActivity);
 
 }
  30. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent.Builder

    firstComponentBuilder();
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 @Subcomponent.Builder
 interface Builder {
 FirstComponent.Builder firstModule(FirstModule firstModule);
 FirstComponent.Builder secondModule(SecondModule secondModule);
 
 }
 
 void inject(MainActivity mainActivity);
 
 }
  31. @Component(modules = {AppModule.class, UtilsModule.class})
 @Singleton
 public interface AppComponent {
 FirstComponent.Builder

    firstComponentBuilder();
 }
 
 @FirstScope
 @Subcomponent(modules = {FirstModule.class, SecondModule.class})
 public interface FirstComponent {
 
 @Subcomponent.Builder
 interface Builder {
 FirstComponent.Builder firstModule(FirstModule firstModule);
 FirstComponent.Builder secondModule(SecondModule secondModule);
 FirstComponent build();
 }
 
 void inject(MainActivity mainActivity);
 
 }
  32. @Provides User currentUser(AuthManager authManager) {
 return authManager.currentUser();
 }
 
 @Provides

    @Singleton User currentUser(AuthManager authManager) {
 return authManager.currentUser();
 }

  33. @Module
 public class TranslatorsModule {
 
 @Provides
 @Singleton
 public Translator

    provideGoogleTranslator(){
 return new GoogleTranslator();
 }
 }
  34. @Module
 public class TranslatorsModule {
 
 @Provides(type = Provides.Type.SET)
 @Singleton


    public Translator provideGoogleTranslator(){
 return new GoogleTranslator();
 }
 }
  35. @Module
 public class TranslatorsModule {
 
 @Provides(type = Provides.Type.SET)
 @Singleton


    public Translator provideGoogleTranslator() {
 return new GoogleTranslator();
 } 
 
 ...
 
 @Provides(type = Provides.Type.SET)
 @Singleton
 public Translator provideLongmanTranslator() {
 return new LongmanTranslator();
 }
 }