我试图在没有@Module注释中的"注入"指令的情况下使Dagger工作.我的测试项目基于Android Simple Dagger示例
这是给我带来问题的部分:
@Module(
injects = HomeActivity.class,
complete = false
)
public class DemoModule {
// TODO put your application-specific providers here!
}
Run Code Online (Sandbox Code Playgroud)
(编辑):我的代码中有哪些是CTXModules.java
我想要删除的部分是"injects = HomeActivity.class".我知道我可以在构造函数中用@Inject注释标记我自己的模块以删除那里的那个部分,但不知何故它不能用于添加到图形中的模块.有了那条线,一切都很好.
我需要这个的原因是因为dagger将在一个基础库项目中实现,该项目将成为共享公共代码库的一些项目的基础,因此目前或编写这部分代码我不知道是什么类将注入模块.
我甚至想做什么?
我认为这是可能的,因为Android Module类不使用该指令.
希望它足够清楚.提前致谢!
(编辑)
我应该提到它.在我的模块中,我删除"injects = HomeActivity.class"并在Android模块类中添加"library = true" .然后发生的是我得到这个错误(我的错误,我以前没有添加它):
12-10 09:21:16.807: E/AndroidRuntime(21783): FATAL EXCEPTION: main
12-10 09:21:16.807: E/AndroidRuntime(21783): Process: com.ef.daggertestproject, PID: 21783
12-10 09:21:16.807: E/AndroidRuntime(21783): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.ef.daggertestproject/com.ef.daggertestproject.MainActivity}: java.lang.IllegalArgumentException: No inject registered for members/com.ef.daggertestproject.MainActivity. You must explicitly add it to …Run Code Online (Sandbox Code Playgroud) 我最近和Dagger一起吃饱了,因为DI的概念完全合情合理.DI的一个更好的"副产品"(杰克沃顿在他的一个演讲中提出)更易于测试.
所以现在我基本上使用espresso做一些功能测试,我希望能够将虚拟/模拟数据注入应用程序并让活动显示出来.我猜是因为,这是DI的最大优势之一,这应该是一个相对简单的问题.出于某种原因,我似乎无法绕过它.任何帮助将非常感激.这是我到目前为止(我写了一个反映我当前设置的例子):
public class MyActivity
extends MyBaseActivity {
@Inject Navigator _navigator;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApplication.get(this).inject(this);
// ...
setupViews();
}
private void setupViews() {
myTextView.setText(getMyLabel());
}
public String getMyLabel() {
return _navigator.getSpecialText(); // "Special Text"
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的匕首模块:
// Navigation Module
@Module(library = true)
public class NavigationModule {
private Navigator _nav;
@Provides
@Singleton
Navigator provideANavigator() {
if (_nav == null) {
_nav = new Navigator();
}
return _nav;
}
}
// App level module
@Module(
includes = …Run Code Online (Sandbox Code Playgroud) android dependency-injection functional-testing dagger android-espresso
涵盖Android架构组件的最新样本之一是Google提供的GithubBrowserSample.我查看了代码并出现了一些问题:
我注意到ViewModelModule包含在AppModule中.这意味着所有视图模型都被添加到DI图中.为什么以这种方式完成而不是Module为每个只提供ViewModel特定活动/片段所需的活动/片段分开?
在这个具体的例子中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的ViewModel?或者更好的解决方案是创建一个setter ViewModel并通过setter设置所需的param?
android dagger dagger-2 android-viewmodel android-architecture-components
花了很多时间试图弄清楚为什么我的匕首注射不起作用; 我意识到Kotlin中的"对象"类型是问题所在.
以下不起作用,注入的"属性"为空.
object SomeSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
Run Code Online (Sandbox Code Playgroud)
但是,以下DID工作正常:
class NotSingleton {
@Inject
lateinit var property: Property
init {
DaggerGraphController.inject(this)
}
}
Run Code Online (Sandbox Code Playgroud)
我试过谷歌,我尝试了文档,但我无法指出这背后的原因.另请注意,我没有尝试使用JAVA,JAVA并没有内置单例的概念.
为什么会这样?为什么kotlin singleton无法注入成员但是常规非单身人士类可以?
我是匕首的新手(虽然我有使用Weld从事Java EE WebApps的DI经验).
我要做的是将依赖注入类中.这个领域是私人的.
然后Dagger抛出异常声明它不能注入私人领域.
这是什么原因?
毕竟有可能使用反射写入私有字段,即使在android上也是如此.
如果我将字段的可见性设置为非私有,则注入似乎有效.
我现在和Dagger一起玩,显然有些功能对我不起作用.
我实际上试图ObjectGraph.plus()用mock模块扩展我的ObjectGraph(via ),它覆盖了已经创建的图形中的一个真实模块.但显然我的模拟模块被忽略了,因此调用了真正的接口.
但是,如果我尝试在图形创建阶段提供我的模拟模块 - 一切正常..
在我的情况下MockModule1覆盖提供者RealModule1
不起作用:
objectGraph = ObjectGraph.create(new RealModule1(),
new RealModule2(),
new RealModule3());
objectGraph = objectGraph.plus(new MockModule1());
Run Code Online (Sandbox Code Playgroud)
工作良好
objectGraph = ObjectGraph.create(new RealModule1(),
new RealModule2(),
new RealModule3(),
new MockModule1());
Run Code Online (Sandbox Code Playgroud)
RealModule1.java
@Module(injects = MainActivity.class)
public class RealModule1 {
@Provides
ISomething provideSomething() {
return new Something();
}
}
Run Code Online (Sandbox Code Playgroud)
MockModule1.java
@Module(overrides=true, injects = MainActivity.class)
public class MockModule1 {
@Provides
ISomething provideSomething() {
return new MockSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
有人已经不得不使用匕首将已经存在的类(带有一些业务逻辑)注入BroadcastReceiver吗?
我正在使用dagger 1并且已经找到了一个很好的例子(https://github.com/adennie/fb-android-dagger)但是,我找不到如何添加一个已经存在的类,它属于一个不同的模块,进入BroadcastReceiver.
任何帮助或建议将不胜感激.
我之前已经实现了dagger2 v2.2但是现在他们也添加了dagger.android部分.所以我用它创建示例项目.
我知道有关的旧方法@Provide和@Modules和@Components等注解但是从匕首2.8+,他们也加入了这个Android的支持库,它有一些新的注射像@ActivityKey,@ContributesAndroidInjector,@ Subcomponent.Builder等.
所以我的问题是它带来了什么好处.
它是否解决了像基类的Inject方法可以适用于所有子类的问题?还是其他任何好处?
第二个问题 - HasFragmentInjector只是像我们以前使用片段管理器一样加载片段内部活动?或者我错过了一些东西?
请不要为所有图书馆用户提供更具信息性的问题,因为图书馆的文档没有提供这样的答案.
我的问题与此类似.
例如,我有一个LiveData实现:
public class CustomLiveData extends LiveData<SomeEvent> {
@Inject
public CustomLiveData(@ActivityContext Context context) {
//....
}
}
Run Code Online (Sandbox Code Playgroud)
我想要注入自定义视图:
public class CustomView extends View {
@Inject
SomeApplicationProvider anyProvider;
@Inject
CustomLiveData dataProvider;
// Getting @com.di.qualifiers.ActivityContext android.content.Context cannot be provided without an @Provides-annotated method.
// @com.di.qualifiers.ActivityContext android.content.Context is injected at com.repositories.CustomLiveData.<init>(context)
// com.repositories.CustomLiveData is injected at com.ui.CustomView.dataProvider com.ui.CustomView is injected at
// com.di.ApplicationComponent.inject(view)
public CustomView(Context context) { this(context, null); }
public CustomView(Context AttributeSet attrs) {
super(context, attrs);
// Works …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Android库,它基本上是我编写的一些REST服务的客户端.我有几个存储类,网络队列,解析器等,并且像许多这样的类一样,它们依赖于Context或者SharedPreferences构建自的东西Context.这些对象都隐藏在facade类后面,因此我的库的使用者看不到它们或直接与它们交互.
为了我自己的理智,我想使用Dagger 2进行依赖注入,以便在我的库中管理这些类的实例.但是,我不想强迫使用我的库的应用程序自己使用Dagger; 仅仅因为我选择使用Dagger并不意味着我的用户应该这样做.
我见过的所有教程似乎都期望我正在构建一个应用程序,而不仅仅是一个库.这些教程中的许多都告诉我应该让我的Application类继承自己DaggerApplication.但就我而言,我的库中根本没有Application(或任何Activity或Service`类),我不希望我的用户必须使用Dagger的基类.
那么我如何才能使用Dagger而不将其"泄漏"出我的库?我在这里找到了部分答案,但我不确定如何调整作者的"包装"模式来处理我对它的依赖Service.我可以将上下文传递给包装器的Context方法,还是Dagger能够以其他方式获取Context引用?