我已经和匕首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);
谢谢。
你的设置相当不错。绝对是我见过的最好的。
我想建议一些小的改变,从长远来看,这些改变会让你的生活变得更容易。
子组件而不是组件依赖关系:
然而,即使使用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,但预期是片段