如何在运行时使用dagger.android从bundle中注入params?

时间:2018-03-16 04:32:16

标签: android dagger-2 dagger

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

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

1 个答案:

答案 0 :(得分:4)

如果我没有错,您正试图通过urlFragment中提供Bundle依赖关系。在这种情况下,在Provides中添加Module方法,该方法将Fragment作为参数。由于Fragment实例位于graph,它会自动满足。

片段:

@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;
   }
}

当您在url中注入DetailFragment时,它将转到provideUrl方法并满足DetailFragment,它将从url返回Bundle

这对我有用。 :)