java inject Android,java – Dagger 2.11:使用@ContributesAndroidInjector时的Local Singleton

Component Application

/ \

Subcomponent DrawerActivity Subcomponent SubActivity

|

Subcomponent DrawerFragment

在SubActivity和DrawerActivity中,我使用标记为@Singleton的相同存储库实例.

@Singleton

@Component(modules = {

AndroidInjectionModule.class,

AppModule.class,

ActivityBuilderModule.class

})

public interface AppComponent {

@Component.Builder

interface Builder{

@BindsInstance Builder application(Application application);

AppComponent build();

}

void inject(App app);

}

@Module

public abstract class ActivityBuilderModule {

@PerActivity

@ContributesAndroidInjector(modules = {DrawerActivityModule.class,

FragmentBuilderModule.class})

abstract DrawerActivity bindDrawerActivity();

@PerActivity

@ContributesAndroidInjector(modules = {DrawerActivityModule.class})

abstract SubActivity bindSubActivity();

}

@Module

public abstract class FragmentBuilderModule {

@PerFragment

@ContributesAndroidInjector(modules = DrawerFragmentModule.class)

abstract DrawerFragment provideDrawerFragment();

}

@Singleton

public class Repository{

private SomeClass mSomeClass;

@Inject

public VehicleRepositoryImpl(SomeClass someClass) {

mSomeClass = someClass;

}

}

public class App extends Application implements HasActivityInjector{

@Inject

DispatchingAndroidInjector dispatchingAndroidInjector;

@Override

public void onCreate() {

super.onCreate();

if (BuildConfig.DEBUG) {

Timber.plant(new Timber.DebugTree());

}

AppComponent component = DaggerAppComponent.builder().application(this)

.build();

component.inject(this);

}

@Override

public AndroidInjector activityInjector() {

return dispatchingAndroidInjector;

}

}

public class DrawerActivity extends AppCompatActivity implements HasSupportFragmentInjector{

@Inject

DispatchingAndroidInjector fragmentDispatchingAndroidInjector;

@Override

public AndroidInjector supportFragmentInjector() {

return fragmentDispatchingAndroidInjector;

}

@Override

protected void onCreate(Bundle savedInstanceState) {

AndroidInjection.inject(this);

super.onCreate(savedInstanceState);

}

}

public class DrawerFragment extends Fragment {

@Inject

ViewModelFactory mViewModelFactory; //repository gets injected into factory

@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

AndroidSupportInjection.inject(this);

super.onCreate(savedInstanceState);

}

}

public class SubActivity extends AppCompatActivity{

@Inject

Repository mRepository;

@Override

protected void onCreate(Bundle savedInstanceState) {

AndroidInjection.inject(this);

super.onCreate(savedInstanceState);

}

}

我现在需要添加用户管理.这需要LoginActivity.我不希望存储库在LoginActivity中可用.所以我想为DrawerActivity / Subactivity / DrawerFragement创建一个本地单例范围“UserScope”

Component Application

/ \

@UserScope @LoginScope

Subcomponent DrawerActivity SubComponent LoginActivity

| \

Subcomponent DrawerFragment Subcomponent SubActivity

如何使用新的@ContributesAndroidInjector注释实现此目的?

解决方法:

我在这个回购中解决了我的问题:

非常感谢它的贡献者!

更新1:添加了代码示例.

该图提供了代码示例的粗略概念.

Component Application

/ \

@UserScope @LoginScope

Subcomponent UserComponent SubComponent LoginActivity

| \

Subcomponent DrawerActivity Subcomponent SubActivity

|

SubComponent DrawerFragment

代码示例(如果缺少某些内容请在评论中告诉我):

1.匕首设置

AppComponent是Dagger图的根:

@Singleton

@Component(modules = {

AndroidSupportInjectionModule.class,

AppModule.class,

AppBindingModule.class

})

public interface AppComponent extends AndroidInjector {

@Component.Builder

interface Builder{

@BindsInstance Builder application(Application application);

AppComponent build();

}

void inject(MyApp app);

UserComponent.Builder userBuilder();

UserManager getUserManager();

}

绑定其子组件的模块:

@Module(subcomponents = UserComponent.class)

public abstract class AppBindingModule {

@ContributesAndroidInjector(modules = LoginModule.class)

@LoginScope

abstract LoginActivity loginActivity();

}

UserComponent保存仅在用户登录时使用的类的实例.UserModule.class中提供的所有类在其他子组件(如活动和片段组件)中可用作“LocalSingletons”.

@UserScope

@Subcomponent(modules = {

UserBindingModule.class,

UserModule.class,

AndroidSupportInjectionModule.class

})

public interface UserComponent extends AndroidInjector {

void inject(UserManager userManager);

@Subcomponent.Builder

interface Builder{

UserComponent build();

}

}

UserBindingModule定义哪些活动子组件属于UserComponent.

@Module

public abstract class UserBindingModule {

@ContributesAndroidInjector(modules = {DrawerBindingModule.class, AndroidSupportInjectionModule.class})

abstract DrawerActivity bindDrawerActivity();

@ContributesAndroidInjector

abstract SubActivity bindSubActivity();

}

DrawerBindingModule定义哪些片段子组件属于DrawerActivityComponent.

@Module

public abstract class DrawerBindingModule {

@DrawerFragmentScope

@ContributesAndroidInjector(modules = DrawerFragmentModule.class)

abstract DrawerFragment provideDrawerFragment();

}

UserManager处理用户登录/注销以及所有进一步的活动注入.

@Singleton

public class UserManager implements HasActivityInjector {

private final UserComponent.Builder userComponentBuilder;

@Inject

DispatchingAndroidInjector activityInjector;

private UserComponent userComponent;

@Inject

public UserManager(UserComponent.Builder builder) {

this.userComponentBuilder = builder;

}

public void logIn(){

createUserSession();

}

private void createUserSession() {

userComponent = userComponentBuilder.build();

userComponent.inject(this);

}

public boolean isLoggedIn() {

return userComponent != null;

}

public void logOut() {

userComponent = null;

}

@Override

public AndroidInjector activityInjector() {

return activityInjector;

}

}

2. App Activity Fragment类

public class MyApp extends Application implements HasActivityInjector{

@Inject

DispatchingAndroidInjector dispatchingAndroidInjector;

@Inject

UserManager mUserManager;

@Override

public void onCreate() {

super.onCreate();

if (BuildConfig.DEBUG) {

Timber.plant(new Timber.DebugTree());

}

AppComponent component = DaggerAppComponent.builder().application(this)

.build();

component.inject(this);

}

@Override

public AndroidInjector activityInjector() {

return mUserManager.activityInjector();

}

}

public class LoginActivity extends AppCompatActivity {

Intent mOpenDrawerActivity;

private ActivityLoginBinding binding;

@Inject

UserManager mUserManager;

@Override

protected void onCreate(Bundle savedInstanceState) {

AndroidInjection.inject(this);

super.onCreate(savedInstanceState);

...

}

void openDrawerActivity(){

mUserManager.logIn();

mOpenDrawerActivity = new Intent(this, DrawerActivity.class);

startActivity(mOpenDrawerActivity);

finish();

}

}

public class DrawerActivity extends BaseUserActivity implements HasSupportFragmentInjector{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

...

}

private void onLogout(){

logoutUser();

}

}

public abstract class BaseUserActivity extends BaseActivity {

@Inject

UserManager userManager;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if (!userManager.isLoggedIn()) {

finishView();

}

}

@Override

protected void androidInject() {

AndroidInjection.inject(this);

}

protected void logoutUser() {

userManager.logOut();

finishView();

}

}

public abstract class BaseActivity extends AppCompatActivity implements HasSupportFragmentInjector {

@Inject

DispatchingAndroidInjector injector;

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

androidInject();

super.onCreate(savedInstanceState);

}

protected void androidInject() {

AndroidInjection.inject(this);

}

public void finishView() {

startActivity(new Intent(this, LoginActivity.class));

finish();

}

@Override

public AndroidInjector supportFragmentInjector() {

return injector;

}

}

标签:java,android,dagger-2

来源: https://codeday.me/bug/20190622/1263693.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值