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

Jos*_*hRT 2 android dagger dagger-2

我正在努力思考Dagger 2,但遇到了一种情况,我不太确定如何正确解决。我用来dagger.android设置subcomponents每个活动和片段,其中每个子组件都有一个具有自己的依赖项的演示者。

问题是一个片段应该显示从网络获取的信息,因此我将 a 传递URL给片段以告诉它要显示什么。但我不确定如何Dagger解决对片段加载的依赖。我以为我需要一个subcomponent builder,但这显然是多余的,因为编译器消息告诉我它需要来自URL一个Provides方法。我还为 设立了一个限定符,URL并用它注释了片段中的一个方法。我以为Dagger可以捡起来,但我错了。有人可以告诉我如何最好地处理这种情况吗?

Abu*_*suf 5

如果我没记错的话,您正在尝试提供通过 提供的url依赖项。在这种情况下,添加将作为参数的方法。当实例存在时,它会自动满足。FragmentBundleProvidesModuleFragmentFragmentgraph

分段:

@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);
    } 
}
Run Code Online (Sandbox Code Playgroud)

模块:

@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;
   }
}
Run Code Online (Sandbox Code Playgroud)

当您注入时,url它将DetailFragment转到provideUrl方法并满足DetailFragment,它将urlBundle.

这对我有用。:)