Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/194.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在运行时使用dagger.android从包中注入参数?_Android_Dagger 2_Dagger - Fatal编程技术网

如何在运行时使用dagger.android从包中注入参数?

如何在运行时使用dagger.android从包中注入参数?,android,dagger-2,dagger,Android,Dagger 2,Dagger,我正在努力将我的头缠在匕首2上,我遇到了一个我不确定如何正确解决的情况。我正在使用dagger.android为我的每个活动和片段设置子组件,其中每个子组件都有一个具有自己依赖项的演示者 问题是一个片段应该显示从web获取的信息,因此我将向该片段传递一个URL,告诉它显示什么。但是我不知道如何获得Dagger来解决对片段加载的依赖。我以为我需要一个子组件生成器,但这显然是多余的,因为编译器消息告诉我它需要提供的方法中的URL。我还为URL设置了一个限定符,并用它在片段中注释了一个方法。我原以为匕

我正在努力将我的头缠在匕首2上,我遇到了一个我不确定如何正确解决的情况。我正在使用
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
)在片段中不能再是私有的,因为您必须对模块使用
。现在,为了避免这种情况,您必须创建从捆绑包中提取值的方法,但该方法随后会添加到模板代码中:(