如何在运行时使用dagger.android从包中注入参数?
我正在努力将我的头缠在匕首2上,我遇到了一个我不确定如何正确解决的情况。我正在使用如何在运行时使用dagger.android从包中注入参数?,android,dagger-2,dagger,Android,Dagger 2,Dagger,我正在努力将我的头缠在匕首2上,我遇到了一个我不确定如何正确解决的情况。我正在使用dagger.android为我的每个活动和片段设置子组件,其中每个子组件都有一个具有自己依赖项的演示者 问题是一个片段应该显示从web获取的信息,因此我将向该片段传递一个URL,告诉它显示什么。但是我不知道如何获得Dagger来解决对片段加载的依赖。我以为我需要一个子组件生成器,但这显然是多余的,因为编译器消息告诉我它需要提供的方法中的URL。我还为URL设置了一个限定符,并用它在片段中注释了一个方法。我原以为匕
dagger.android
为我的每个活动和片段设置子组件
,其中每个子组件都有一个具有自己依赖项的演示者
问题是一个片段应该显示从web获取的信息,因此我将向该片段传递一个
URL
,告诉它显示什么。但是我不知道如何获得Dagger
来解决对片段加载的依赖。我以为我需要一个子组件生成器
,但这显然是多余的,因为编译器消息告诉我它需要提供的方法中的URL
。我还为URL
设置了一个限定符,并用它在片段中注释了一个方法。我原以为匕首会捡起它,但我错了。有人能告诉我如何最好地处理这种情况吗?如果我没有错的话,您正试图在片段
中提供依赖项,该依赖项通过捆绑
提供。在这种情况下,add在模块
中提供了
方法,该方法将片段
作为参数。由于Fragment
实例位于图上,它将自动满足
片段:
@Inject
String url;
public static DetailFragment newInstance() {
Bundle args = new Bundle();
args.putString("url", "http://stackoverflow.com/");
DetailFragment fragment = new DetailFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onAttach(Context context) {
AndroidSupportInjection.inject(this);
super.onAttach(context);
printInfo();
}
public void printInfo(){
if (url == null) {
Log.i(TAG, "Url is null");
}else {
Log.i(TAG, "Url: " + url);
}
}
模块:
@Module
public class DetailFragmentModule {
@Provides
String provideUrl(DetailFragment detailFragment){
Bundle bundle = detailFragment.getArguments();
String url = bundle.getString("url");
return url;
}
@Provides
DetailFragmentView provideDetailFragmentView(DetailFragment detailFragment){
return detailFragment;
}
}
当您在DetailFragment
中注入url
时,它将转到provideUrl
方法并满足DetailFragment
,并从Bundle
返回url
这对我很有用。:) 嗯,很有趣。是的,你是对的,我正试图这么做。我不知道这个片段在对象图中是可用的,我一定是在文档中遗漏了它。虽然我以后才能尝试,但我会继续,并将其标记为答案,谢谢+1.这是正确的答案。请记住,尽管您的特定片段子类(DetailFragment)和活动子类是可注入的,但与片段或活动这样的超类本身没有绑定……至少没有绑定。这是有道理的。出于好奇,这是设计的预期方法,还是更多的工作方法?我不记得在文档中看到过类似的内容,虽然我理解这一点,但我并没有立即意识到这是你应该做的(显然,这就是问题所在)☺️).回答得很好!我现在唯一的问题是,现在您放在捆绑包中的项目使用的键(bundle.putString(key
,value
)在片段中不能再是私有的,因为您必须对模块使用键
。现在,为了避免这种情况,您必须创建从捆绑包中提取值的方法,但该方法随后会添加到模板代码中:(