难以掌握匕首基础知识

Trouble Grapsing Dagger Fundamentals

我正在尝试使用 Dagger 作为我的 Android 应用程序的依赖注入库。在我的项目中,我在项目中有不同的 Android 模块,代表应用程序的不同风格。我想使用依赖注入让每个模块定义自己的导航菜单。

我的 MenuFragment class 需要我的接口实例 (MenuAdapterGenerator):

public class MenuFragment extends Fragment {

    @Inject
    protected MenuAdapterGenerator generator;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        //this.generator is always null here, though shouldn't it be injected already?:
        BaseExpandableListAdapter adapter = new MenuAdapter(inflater, this.generator);
    }
}

这是我的菜单模块的样子:

@Module (
    injects = MenuAdapterGenerator.class
)
public class MenuDaggerModule {
    public MenuDaggerModule() {
        System.out.println("test");
    }

    @Provides @Singleton MenuAdapterGenerator provideMenuAdapterGenerator() {
        return new MenuNavAdapterGenerator();
    }

}

这是整个应用级模块(包括这个 MenuDaggerModule):

@Module (
    includes = MenuDaggerModule.class,
    complete = true
)
public class OverallAppModule {

}

(编辑:)这是我的 MainActivity class 创建对象图:

public class MainActivity extends Activity {

private ObjectGraph objGraph;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.objGraph = ObjectGraph.create(OverallAppModule.class);
    this.mainWrapper = new MainWrapper(this, this.objGraph);
    this.setContentView(R.layout.activity_main);
    //Other instantiation logic
}

(编辑:) 这是我实际制作 MenuFragment 的地方(在 MainWrapper 中):

public class MainWrapper {

    public MainWrapper(Activity activity, ObjectGraph objGraph) {
        this.menu = new MenuFragment();
        this.objGraph.inject(this.menu);
        //I have no idea what the above line really does
        FragmentManager fm = this.activity.getFragmentManager();
        FragmentTransaction t = fm.beginTransaction();
        t.replace(R.id.menu_fragment, this.menu);
        t.commit();
    }

}

为什么我的模块的 provideMenuAdapterGenerator 方法没有被调用来注入我的 MenuAdapterGenerator?如果我在该方法中设置断点,它永远不会被触发。但是 MenuDaggerModule 正在创建,因为 System.out.println("test");正在被击中。

我的理解是,如果创建了 MenuDaggerModule(确实如此),Dagger 应该在遇到 @Injects MenuAdapterGenerator 时使用该 provideMenuAdapterGenerator()。我有什么问题吗?

匕首有很多魔法,但没那么多。您仍然需要告诉 Dagger 注入您的实例。

我假设您在 MainActivity 中引用了您的 MenuFragment。创建 Fragment 时,需要通过调用 ObjectGraph.inject(T):

告诉 Dagger 注入它
MenuFragment fragment = new MenuFragment();
this.objectGraph.inject(fragment);
Transaction transaction = getFragmentManager().beginTransaction();
// etc.

Dagger 现在会注意到 MenuAdapterGenerator 上的 @Inject 注释,并调用 provideMenuAdapterGenerator() 来注入它。


我想推荐我的 another answer,其中讨论了构造函数注入。尽管 Fragments 是少数情况下这是不可能的(以及 Activitys 和 Views),但您可能需要考虑使用该技术来注入可能的其他自定义 类.