当前位置: 首页 > 知识库问答 >
问题:

用匕首2为Android MVP设置模块和组件-多碎片活动

凌智
2023-03-14

我已经和匕首2一起工作了一段时间,我还在试图弄清楚一些事情。我仍然不能很好地管理的一件事是为不同的情况设置模块和组件,比如一个有几个片段的活动。我看过很多实现,大多数时候都有点不同。

所以,让我公开我目前的应用程序结构使用MVP,我想要一些意见,如果我的实现是好的或不是。

@Module
public final class ApplicationModule {

private Context mContext;


public ApplicationModule(Context context){
    mContext = context;
}


public ApplicationModule(){
    mContext = null;
}

@Provides
Context provideContext(){
    return mContext;
}

@Singleton
@Provides
public SharedPreferences getAppPreferences(){
    return mContext.getSharedPreferences("CalorieApp",Context.MODE_PRIVATE);
 }
}

@Singleton
@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {

void inject(MainApplication mainApplication);

SharedPreferences sharedPreferences();

}
@Module
public class ActivityModule {

private Activity activity;

public ActivityModule(Activity activity){
    this.activity = activity;
}

@Provides
Activity provideActivity(){
    return  activity;
 }
}

@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = 
  ActivityModule.class)
public interface ActivityComponent {

void inject(WelcomeActivity welcomeActivity);

void inject(MainActivity mainActivity);
}

现在,MainActivity有3个片段,我将为片段创建3个模块和1个组件

@Module
public class HomeFragmentModule {

private HomeFragmentContract.View mView;

public HomeFragmentModule(HomeFragmentContract.View view){
    mView = view;
}

@Provides
HomeFragmentContract.View provideHomeFragmentView(){
    return mView;
  }

}

@Module
public class ChartsFragmentModule {

private ChartsFragmentContract.View mView;

public ChartsFragmentModule(ChartsFragmentContract.View view){
    mView = view;
}

@Provides
ChartsFragmentContract.View provideChartsFragmentView(){
    return mView;
}
}

@Module
public class ProfileFragmentModule {

private ProfileFragmentContract.View mView;

public ProfileFragmentModule(ProfileFragmentContract.View view){
    mView = view;
}

@Provides
ProfileFragmentContract.View provideProfileFragmentContract(){
    return mView;
}

}

@PerFragment
@Component(dependencies = ActivityComponent.class ,
    modules = {ChartsFragmentModule.class, HomeFragmentModule.class, 
ProfileFragmentModule.class})
public interface FragmentComponent {

void inject(ChartsFragment chartsFragment);

void inject(HomeFragment homeFragment);

void inject(ProfileFragment profileFragment);
}

然后我必须实例化Dagger,首先在我的应用程序类中,然后在每个活动和片段中

applicationComponent = DaggerApplicationComponent.builder()
            .applicationModule(new ApplicationModule(this))
            .build();

例如,在WelcomeActivity中,我将其实例化如下:

    DaggerActivityComponent.builder()
            .activityModule(new ActivityModule(this))
            .applicationComponent(((MainApplication) 
getApplication()).getApplicationComponent())
            .build()
            .inject(this);
    DaggerFragmentComponent.builder()
            .homeFragmentModule(new HomeFragmentModule(this))              
    .activityComponent(((MainActivity)getActivity()).getActivityComponent())
            .build()
            .inject(this);

谢谢。

共有1个答案

海翼
2023-03-14

你的设置相当不错。绝对是我见过的最好的。

我想建议一些小的改变,从长远来看,这些改变会让你的生活变得更容易。

子组件而不是组件依赖关系:

    null

然而,即使使用MVC/MVP的另一种方法(或者根本没有),如果从概念上考虑的话--活动和片段具有非常相似的功能。

因此,我建议有一个单一的组件,注入活动和碎片。

每个片段不需要一个模块:

我觉得有点不舒服把这个塞在这里,但我们现在正在录制一个关于匕首的高级视频教程。我们已经在这个教程工作了过去的一个月,它应该在2-3周内准备好。

本教程将讨论您所要求的内容--如何构造Dagger代码以提高可维护性。你可以订阅我的博客www.techyourchance.com,以便在发布时得到通知。

希望这能帮上忙。

 类似资料:
  • 我一直在看谷歌Android架构的MVP与匕首2的例子: https://github.com/googlesamples/android-architecture/blob/todo-mvp-dagger/todoapp/app/src/main/java/com/example/android/architecture/blueprents/todoapp/tasksactivity.java

  • 我不太清楚如何用匕首2解决这个问题。假设我们有为我们提供,那么我们有只使用这一个模块。在此基础上,我们有和,它们依赖于<代码>活动组件的构建与 然后我注入我的活动: 现在我可以使用中声明的所有内容,但是我无法访问。 所以问题是如何实现这一目标?所以,当我构建依赖于另一个组件的组件时,我仍然可以从第一个组件访问模块? 我想我已经找到了解决方案,在重新观看了Jake的Devxx演讲之后,我不得不错过了

  • 问题内容: 我正在配置新的Dagger Android模块,但出现此错误,这是我的组件: 我在应用程序中这样构建的 但是我仍然收到错误 错误:(20,3)错误:@ Component.Builder缺少所需模块或组件的设置器:[app.example.com.dagger.AppModule] 根据应该正确的文档,我缺少什么? 例如,这可能是带有构建器的有效组件: 问题答案: 从AppModule

  • 我看了几篇不同的文章,这些文章似乎建议在Dagger 2中使用两种不同的方法进行自定义范围界定: > 在配置更改第2部分(Github repo)中幸存的MVP演示者: 为每个片段使用唯一的自定义作用域,例如分别为和的

  • 我对匕首2还不太熟悉。我正试图在我的Android项目中实现它。我有一个需要。我用匕首把它注射到这个服务中。 、和具有标记为的方法当我构建项目时,我收到以下错误: locationServiceComponent依赖于多个作用域组件:@Singleton NetComponent@Singleton RepositoryComponent 我知道我的不能依赖于两个作用域组件,但我的服务中需要这两个

  • 我不知道如何使用以下内容显示自定义片段: 类型不匹配:推断的类型是LoginFrament,但预期是片段