- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我关注这个guide为我的 Android 应用程序制作子组件。这里我定义了一个名为 LoginComponent
的子组件用于 LoginActivity:
@Subcomponent(modules = LoginModule.class)
public interface LoginComponent {
void inject(LoginActivity activity);
@Subcomponent.Builder
interface Builder {
Builder requestModule(LoginModule module);
LoginComponent build();
}
}
@Module
public class LoginModule {
@Provides
LoginManager provideLoginManager(LoginManagerImpl manager) {
return manager;
}
@Provides
LoginView provideLoginView(LoginViewImpl view) {
return view;
}
@Provides
LoginPresenter loginPresenter(LoginView view, LoginManager manager) {
return new LoginPresenterImpl(view, manager);
}
}
我在另一个组件中定义了这个子组件:
@Module(subcomponents = LoginComponent.class)
public interface AppModule {
}
@Singleton
@Component(modules = {
AppModule.class
})
public interface AppComponent {
}
这是我的登录 Activity :
public class LoginActivity extends AppCompatActivity {
@Inject LoginPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
}
我的问题是:
@Subcomponent.Builder
的目的。我不明白这一点,因为该组件中的所有模块都已定义在 @Subcomponent
注解上。我们为什么要再次复制。谢谢
最佳答案
@Subcomponent.Builder遵循 @Component.Builder 中记录的相同规则:您需要为 Dagger 无法自行初始化的每个模块设置一个 setter。 (允许模块具有构造函数参数或静态工厂方法,这将阻止 Dagger 创建自己的实例。)
因为 Dagger 可以通过调用零参数构造函数来创建 LoginModule,所以您可以从 Builder 中删除该方法;你不需要重新创建它。您也可以考虑制作 LoginModule 的方法 static
,这将允许您使 LoginModule 成为一个接口(interface)或抽象类——然后 Dagger 将能够完全避免持有对该模块的引用。最后,对于简单的 @Provides
绑定(bind)两个类的方法(例如 @Provides B provideB(A a) { return a; }
)你可以切换到 @Binds
,这将使生成的代码更快。
那时,您的 @Subcomponent.Builder
成为特定于子组件的 Provider
: 你可以注入(inject)你的 Builder
或 Provider<Builder>
并通过调用 build()
获取一个新的子组件实例在上面。只要您不需要提供任何 Module 实例,您就不需要在构建器上使用任何其他方法。
您可以简单地注入(inject)一个 Provider<LoginComponent>
,但我没有在实践中看到过,也没有自己尝试过。
要注入(inject)一个 LoginPresenter,您需要获取您的 AppComponent,创建一个新的 LoginComponent,并通过传入它来使用它来注入(inject)您的 Activity。但是,这可能很困难,因为您还没有给自己任何注入(inject)您的 LoginComponent.Builder 的权限。
除非你想尝试 dagger.android相反,您可以添加一个方法来调用您的 AppComponent 以创建一个新的 LoginComponent。
// This way...
LoginComponent createLoginComponent();
// or this way:
LoginComponent.Builder createLoginComponentBuilder();
有时您会看到名为 plus()
的第一个方法,这是 Dagger 1 中建立的命名约定;第一种方法还可以让您避免创建 @Subcomponent.Builder 或在 AppModule
中添加子组件。 ,尽管您可能希望保留现有结构的结构,以便稍后向您的 AppModule 添加更多内容。
要完成它,请在 Activity.onCreate
中,您可以让您的 Activity 获取您的应用程序,访问其 AppComponent,并注入(inject)自身。
((YourApplication) getContext().getApplicationContext())
.getApp()
.createLoginComponent()
.inject(this);
关于android - Dagger 2 : inject after define subcomponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43214994/
我有一个使用 dagger 2 的子组件模块。 @Subcomponent(modules = arrayOf(LoginPageActivityModule::class)) class AuthM
我需要有关适用于 Android 的 Dagger2.13 的帮助。 我正在关注互联网上的几个示例,但我现在面临无法解决的错误。 Error:(23, 14) error: @Subcomponent
在 dagger module annotation 中声明 subcomponent 的用例是什么?。例如 @Module(subcomponents = ChildComponent.class)
这就是我的 Messenger 组件的样子。如您所见,有一个主要组件和一个列表组件。主要组件默认导出。有了这个,我的应用程序中的一切都按预期工作。 /imports/ui/components/mes
@Subcomponent 在我们的应用程序中有何用途? @Subcomponent interface PostActivitySubComponent : AndroidInjecto
我关注这个guide为我的 Android 应用程序制作子组件。这里我定义了一个名为 LoginComponent 的子组件用于 LoginActivity: @Subcomponent(module
我正在尝试在我的应用中使用 Dagger 2。我不断收到此错误: Error:Execution failed for task ':app:compileDebugJavaWithJavac'. j
This tutorial在一个非常简单的示例中展示了如何使用 Dagger 2 的 AndroidInjectionModule 将依赖项注入(inject) Activity 。我的用例有点复杂:
请帮帮我!我在使用 dagger 2 时遇到了麻烦。 我想通过使用 @Subcomponent.Builder 和 @BindsInstance 在 MainActivity 中绑定(bind)一些运
我创建了自己的进度条(TProgressBalken),由一个 TRectangle 组成,其中还有另一个颜色不同的 TRectangle(a),其宽度随进度值(0..100)而变化。最后,一个 Tl
我在 AngularDart 中创建了一个标签组件 @Component( visibility: Directive.CHILDREN_VISIBILITY, selector: "
我在运行时使用 Heat 来生成将要安装的组件。我需要复制的文件很少。但是每次我用如果没有 FileId 属性,它会在运行时失败并显示 Error 2716: Couldn't create a ra
我有一个对话框子组件 DeleteAssociationDialog,其中有一个 openDeleteAssociationDialog 方法: 删除-association-dialog.compo
我在添加依赖/子组件时遇到 Dagger 2 问题,这将使我无法找到 DaggerAppComponent/DaggerBComponent/DaggerCComponent 的符号类。 组件如下:
我正在做一个使用 React.js 的项目,对 React 的组成非常困惑。 http://facebook.github.io/react/docs/multiple-components.html
编译我的应用程序时出现以下错误: CodeSign /Users/pupeno/Library/Developer/Xcode/DerivedData/ProjectX-cynmgyozflnwbpa
为什么下面的代码编译失败并出现以下错误,应该如何修复? Error:(9, 8) error: [SubComponent.inject(MainActivity)] java.lang.Intege
我是一名优秀的程序员,十分优秀!