难以掌握匕首基础知识
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,其中讨论了构造函数注入。尽管 Fragment
s 是少数情况下这是不可能的(以及 Activity
s 和 View
s),但您可能需要考虑使用该技术来注入可能的其他自定义 类.
我正在尝试使用 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)
:
MenuFragment fragment = new MenuFragment();
this.objectGraph.inject(fragment);
Transaction transaction = getFragmentManager().beginTransaction();
// etc.
Dagger 现在会注意到 MenuAdapterGenerator
上的 @Inject
注释,并调用 provideMenuAdapterGenerator()
来注入它。
我想推荐我的 another answer,其中讨论了构造函数注入。尽管 Fragment
s 是少数情况下这是不可能的(以及 Activity
s 和 View
s),但您可能需要考虑使用该技术来注入可能的其他自定义 类.