-
-
Save kuno/ceaf72dcb74eeba80b2b89c299275862 to your computer and use it in GitHub Desktop.
A: Dagger.android 2.11 simple example with support for Singleton, PerActivity, PerFragment, and PerChildFragment scopes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// This is a super simplified example of how to use the new dagger.android framework | |
// introduced in Dagger 2.10. For a more complete, in-depth guide to dagger.android | |
// read https://proandroiddev.com/how-to-android-dagger-2-10-2-11-butterknife-mvp-part-1-eb0f6b970fd | |
// For a complete codebase using dagger.android 2.11, butterknife 8.7, and MVP, | |
// see https://github.com/vestrel00/android-dagger-butterknife-mvp | |
// Note that this example uses Dagger 2.11, where @ContributesAndroidInjector was | |
// introduced removing the need to define @Subcomponent classes. | |
// Could also extend DaggerApplication instead of implementing HasActivityInjector | |
// App.java | |
public class App extends Application implements HasActivityInjector { | |
@Inject | |
AppDependency appDependency; | |
@Inject | |
DispatchingAndroidInjector<Activity> activityInjector; | |
@Override | |
public void onCreate() { | |
super.onCreate(); | |
DaggerAppComponent.create().inject(this); | |
} | |
@Override | |
public AndroidInjector<Activity> activityInjector() { | |
return activityInjector; | |
} | |
} | |
// AppModule.java | |
@Module(includes = AndroidInjectionModule.class) | |
abstract class AppModule { | |
@PerActivity | |
@ContributesAndroidInjector(modules = MainActivityModule.class) | |
abstract MainActivity mainActivityInjector(); | |
} | |
// AppComponent.java | |
@Singleton | |
@Component(modules = AppModule.class) | |
interface AppComponent { | |
void inject(App app); | |
} | |
// Could also extend DaggerActivity instead of implementing HasFragmentInjector | |
// MainActivity.java | |
public final class MainActivity extends Activity implements HasFragmentInjector { | |
@Inject | |
AppDependency appDependency; // same object from App | |
@Inject | |
ActivityDependency activityDependency; | |
@Inject | |
DispatchingAndroidInjector<Fragment> fragmentInjector; | |
@Override | |
protected void onCreate(@Nullable Bundle savedInstanceState) { | |
AndroidInjection.inject(this); | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.main_activity); | |
if (savedInstanceState == null) { | |
addFragment(R.id.fragment_container, new MainFragment()); | |
} | |
} | |
@Override | |
public final AndroidInjector<Fragment> fragmentInjector() { | |
return fragmentInjector; | |
} | |
} | |
// MainActivityModule.java | |
@Module | |
public abstract class MainActivityModule { | |
@PerFragment | |
@ContributesAndroidInjector(modules = MainFragmentModule.class) | |
abstract MainFragment mainFragmentInjector(); | |
} | |
// Could also extend DaggerFragment instead of implementing HasFragmentInjector | |
// MainFragment.java | |
public final class MainFragment extends Fragment implements HasFragmentInjector { | |
@Inject | |
AppDependency appDependency; // same object from App | |
@Inject | |
ActivityDependency activityDependency; // same object from MainActivity | |
@Inject | |
FragmentDependency fragmentDepency; | |
@Inject | |
DispatchingAndroidInjector<Fragment> childFragmentInjector; | |
@SuppressWarnings("deprecation") | |
@Override | |
public void onAttach(Activity activity) { | |
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { | |
// Perform injection here before M, L (API 22) and below because onAttach(Context) | |
// is not yet available at L. | |
AndroidInjection.inject(this); | |
} | |
super.onAttach(activity); | |
} | |
@Override | |
public void onAttach(Context context) { | |
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { | |
// Perform injection here for M (API 23) due to deprecation of onAttach(Activity). | |
AndroidInjection.inject(this); | |
} | |
super.onAttach(context); | |
} | |
@Override | |
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, | |
Bundle savedInstanceState) { | |
return inflater.inflate(R.layout.main_fragment, container, false); | |
} | |
@Override | |
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { | |
super.onViewCreated(view, savedInstanceState); | |
if (savedInstanceState == null) { | |
addChildFragment(R.id.child_fragment_container, new MainChildFragment()); | |
} | |
} | |
@Override | |
public final AndroidInjector<Fragment> fragmentInjector() { | |
return childFragmentInjector; | |
} | |
} | |
// MainFragmentModule.java | |
@Module | |
public abstract class MainFragmentModule { | |
@PerChildFragment | |
@ContributesAndroidInjector(modules = MainChildFragmentModule.class) | |
abstract MainChildFragment mainChildFragmentInjector(); | |
} | |
// MainChildFragment.java | |
public final class MainChildFragment extends Fragment { | |
@Inject | |
AppDependency appDependency; // same object from App | |
@Inject | |
ActivityDependency activityDependency; // same object from MainActivity | |
@Inject | |
FragmentDependency fragmentDepency; // same object from MainFragment | |
@Inject | |
ChildFragmentDependency childFragmentDepency; | |
@Override | |
public void onAttach(Context context) { | |
AndroidInjection.inject(this); | |
super.onAttach(context); | |
} | |
@Override | |
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, | |
Bundle savedInstanceState) { | |
return inflater.inflate(R.layout.main_child_fragment, container, false); | |
} | |
} | |
// MainChildFragmentModule.java | |
@Module | |
public abstract class MainChildFragmentModule { | |
} | |
// PerActivity.java | |
@Scope | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface PerActivity { | |
} | |
// PerFragment.java | |
@Scope | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface PerFragment { | |
} | |
// PerChildFragment.java | |
@Scope | |
@Retention(RetentionPolicy.RUNTIME) | |
public @interface PerChildFragment { | |
} | |
// AppDependency.java | |
@Singleton | |
public final class AppDependency { | |
@Inject | |
AppDependency() { | |
} | |
} | |
// ActivityDependency.java | |
@PerActivity | |
public final class ActivityDependency { | |
@Inject | |
ActivityDependency() { | |
} | |
} | |
// FragmentDependency.java | |
@PerFragment | |
public final class FragmentDependency { | |
@Inject | |
FragmentDependency() { | |
} | |
} | |
// ChildFragmentDependency.java | |
@PerChildFragment | |
public final class ChildFragmentDependency { | |
@Inject | |
ChildFragmentDependency() { | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment