麻烦掌握匕首基本原理

约翰·D

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

我的MenuFragment类需要接口的一个实例(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类,它创建对象图:

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注入实例。

我想假设您MenuFragment在您的参考资料中有对您的引用MainActivity创建时Fragment,您需要通过调用来告诉Dagger注入它ObjectGraph.inject(T)

MenuFragment fragment = new MenuFragment();
this.objectGraph.inject(fragment);
Transaction transaction = getFragmentManager().beginTransaction();
// etc.

Dagger现在将注意到@Inject注释MenuAdapterGenerator,并调用provideMenuAdapterGenerator()以将其注入。


我想推荐我的另一个答案,其中讨论了构造函数注入。尽管Fragments是少数几种情况之一(与Activitys和Views一起)是不可能的,但您可能要考虑使用该技术来注入其他可能的自定义类。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

麻烦掌握匕首基本原理

来自分类Dev

报告框架的基本原理

来自分类Dev

撤销 ssh 证书的基本原理

来自分类Dev

CBOR 负整数的基本原理

来自分类Dev

std :: bool_constant的基本原理

来自分类Dev

get函数的参数顺序的基本原理

来自分类Dev

C#中缺少ctor约束的基本原理

来自分类Dev

了解LINQ的Where / Take的基本原理

来自分类Dev

Android意向系统的基本原理

来自分类Dev

块的C语法背后的基本原理

来自分类Dev

Instant.getEpochSecond与Instant.toEpochMilli的基本原理

来自分类Dev

某些语言中的elseif或elif语句的基本原理

来自分类Dev

/ usr目录的基本原理是什么?

来自分类Dev

使用Express.JS的MVC基本原理

来自分类Dev

块的C语法背后的基本原理

来自分类Dev

std :: optional的基本原理是什么?

来自分类Dev

块参数的基本原理是什么?

来自分类Dev

“无法在FROM子句中指定目标表进行更新”背后的MySQL基本原理

来自分类Dev

逗号语法:语句中出现逗号悬停的基本原理是SyntaxError

来自分类Dev

C的基本原理:double变量不等于double表达式吗?

来自分类Dev

使用户空间文本段从0x8048000开始的基本原理

来自分类Dev

使得std :: function需要复制构造函数的基本原理

来自分类Dev

使用户空间文本段从0x8048000开始的基本原理

来自分类Dev

C ++隐式复制和移动构造函数背后的基本原理?

来自分类Dev

具有多个客户端的UDP服务器的基本原理

来自分类Dev

默认情况下,是否自动提交DB API 2.0的基本原理?

来自分类Dev

“无法在FROM子句中指定目标表进行更新”背后的MySQL基本原理

来自分类Dev

C#中“文字”表达式`where T:class`之后的基本原理

来自分类Dev

C的基本原理:double变量不等于double表达式吗?

Related 相关文章

  1. 1

    麻烦掌握匕首基本原理

  2. 2

    报告框架的基本原理

  3. 3

    撤销 ssh 证书的基本原理

  4. 4

    CBOR 负整数的基本原理

  5. 5

    std :: bool_constant的基本原理

  6. 6

    get函数的参数顺序的基本原理

  7. 7

    C#中缺少ctor约束的基本原理

  8. 8

    了解LINQ的Where / Take的基本原理

  9. 9

    Android意向系统的基本原理

  10. 10

    块的C语法背后的基本原理

  11. 11

    Instant.getEpochSecond与Instant.toEpochMilli的基本原理

  12. 12

    某些语言中的elseif或elif语句的基本原理

  13. 13

    / usr目录的基本原理是什么?

  14. 14

    使用Express.JS的MVC基本原理

  15. 15

    块的C语法背后的基本原理

  16. 16

    std :: optional的基本原理是什么?

  17. 17

    块参数的基本原理是什么?

  18. 18

    “无法在FROM子句中指定目标表进行更新”背后的MySQL基本原理

  19. 19

    逗号语法:语句中出现逗号悬停的基本原理是SyntaxError

  20. 20

    C的基本原理:double变量不等于double表达式吗?

  21. 21

    使用户空间文本段从0x8048000开始的基本原理

  22. 22

    使得std :: function需要复制构造函数的基本原理

  23. 23

    使用户空间文本段从0x8048000开始的基本原理

  24. 24

    C ++隐式复制和移动构造函数背后的基本原理?

  25. 25

    具有多个客户端的UDP服务器的基本原理

  26. 26

    默认情况下,是否自动提交DB API 2.0的基本原理?

  27. 27

    “无法在FROM子句中指定目标表进行更新”背后的MySQL基本原理

  28. 28

    C#中“文字”表达式`where T:class`之后的基本原理

  29. 29

    C的基本原理:double变量不等于double表达式吗?

热门标签

归档