Skip to content
This repository has been archived by the owner on Jul 3, 2023. It is now read-only.
/ Alfred Public archive

Android ViewModel instantiation made effortless.

License

Notifications You must be signed in to change notification settings

MrHadiSatrio/Alfred

Repository files navigation

Alfred – Android ViewModel instantiation made effortless

JitPack

Alfred, your trusty View Model butler.

Why should I use it?

   // It's so you can just do this...
   
   SomeViewModel viewModel = SomeViewModelProvider.get(this, "...", 0L);
   // Instead this...
   
   SomeViewModel viewModel = SomeViewModelProviders.of(this).get(SomeViewModel.class);
   viewModel.setMessage("...");
   viewModel.setEffGiven(1L);
   // Or this...
   
   SomeViewModel viewModel = ViewModelProviders.of(this, new CustomViewModelFactory("...", 1000L)).get(SomeViewModel.class);
   
   ...
   
   public final class CustomViewModelFactory implements ViewModelProvider.Factory {
   
       // About 28 lines of code here (given your ViewModel takes 2 arguments like above).
   }

Usage guide

Getting Alfred to simplify your ViewModel instantiation is simple:

  1. Make sure your ViewModel has a constructor containing all the things it needs supplied as parameters:
   public final class SomeViewModel extends ViewModel {
   
      private final int someInt;
      private final String someString;
      private final SomeClass someClass;
      
      public SomeViewModel(int anInt, String aString, SomeClass yourClass) {
         // Initiate the fields..
      }
      
      ...
   }
  1. Annotate the class with @GeneratedProvider:
   @GeneratedProvider
   public final class SomeViewModel extends ViewModel {
      ...
   }
  1. Build and voila!
   SomeViewModel viewModel = SomeViewModelProvider.get(99, "Problems", new ViewModelsAintOne());

Current limitation

As of its current state, Alfred is limited to process only the first constructor declared on each ViewModel. You could override this behavior by explicitly annotating the constructor you want it to process instead with @Main:

   @GeneratedProvider
   public final class SomeViewModel extends ViewModel {
   
      private final int someInt;
      private final String someString;
      private final SomeClass someClass;
      private final SomeEnum someEnum;
      
      public SomeViewModel(int anInt, String aString, SomeClass yourClass) {
         this(anInt, aString, yourClass, SomeEnum.NONE);
      }
      
      @Main /* Tells Alfred to process this instead of the first one above. */
      public SomeViewModel(int anInt, String aString, SomeClass yourClass, SomeEnum someEnum) {
         ...
      }
      
      ...
   }

Please note that there could only be one @Main-annotated constructor declared in your ViewModel.

Including Alfred to your project

Include Alfred to your Gradle project by adding it as a dependency in your build.gradle:

   apply plugin: 'com.neenbedankt.android-apt'

   repositories {
       maven { url "https://jitpack.io" }
   }

   dependencies {
       compile 'com.hadisatrio.Alfred:annotations:v1.0.0-RC.3'
       apt 'com.hadisatrio.Alfred:compiler:v1.0.0-RC.3'
   }

You'll also need android-apt in your project. See how to do it here.

Contributions

Any kind of contribution will be appreciated. PR away!

License

Alfred is published under the Apache License 2.0.


p.s., Please let me know if you're using Alfred in your projects. Drop an email at hi[you-know-what-to-put-here]hadisatrio.com. ;)