5

嗨,我是 dagger 的新手,并试图用简单的 android 应用程序来研究它。

即使有注入此视图的模块,我也会从标题中得到错误。谁能帮我弄清楚为什么它不注入视图?

这是我的应用程序的主要模块:

@dagger.Module(injects = {App.class, MainActivity.class}, complete = false)
public class AppModule {
    private final App app;
    public AppModule(App app) { this.app = app; }
    @Provides @Singleton public App provideApp() { return app; }
}

另一个注入我观点的模块:

@Layout(R.layout.sidemenu)
public class SidemenuScreen implements Blueprint{
    @Override public String getMortarScopeName() { return getClass().getName(); }
    @Override public Object getDaggerModule() { return new Module();}

    @dagger.Module(injects= SidemenuView.class, addsTo = AppModule.class)
    public static class Module { 
       public Module() {}
    }

    @Singleton public static class Presenter extends ViewPresenter<SidemenuView> {
        @Inject Presenter() {}
        @Override protected void onLoad(Bundle savedInstanceState) {super.onLoad(savedInstanceState); }
        @Override protected void onSave(Bundle outState) { super.onSave(outState); }
    }
}

如您所见, SidemenuScreen.ModuleinjectsSidemenuView和 addTo AppModule。我错了吗 ?

ObjectGraph 在onCreate()我的 Application 类的方法中是这样创建的:

    ObjectGraph objectGraph = ObjectGraph.create(new AppModule(this));
    objectGraph.inject(this);
    rootScope = Mortar.createRootScope(BuildConfig.DEBUG, objectGraph);

应该注入的视图

public class SidemenuView extends LinearLayout {
    @Inject SidemenuScreen.Presenter presenter;

    public SidemenuView(Context context) {this(context, null); }
    public SidemenuView(Context context, AttributeSet attrs) { this(context, attrs, 0); }
    public SidemenuView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        Mortar.inject(context, this);
    }
}

和使用所有这些东西的活动:

public class MainActivity extends Activity {
    private MortarActivityScope activityScope;
    @Inject App app;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Blueprint screen = getScreenFromIntent(getIntent());

        if (screen != null) {
            MortarScope parentScope = Mortar.getScope(getApplication());
            activityScope = Mortar.requireActivityScope(parentScope, screen);
            activityScope.onCreate(savedInstanceState);

            Mortar.inject(this, this);
        }

        SlidingMenu menu = new SlidingMenu(this);
        menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
        menu.setMenu(R.layout.sidemenu);
    }
}

这里使用了这个滑动菜单库:

因此,当menu.setMenu(R.layout.sidemenu);调用它时,它会膨胀视图并从发生错误Mortar.inject(context, this);的构造函数中调用。SidemenuView

这是后台堆栈:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dagger/com.example.dagger.ui.MainActivity}: android.view.InflateException: Binary XML file line #3: Error inflating class com.example.dagger.ui.sidemenu.SidemenuView
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.view.InflateException: Binary XML file line #3: Error inflating class com.example.dagger.ui.sidemenu.SidemenuView
            at android.view.LayoutInflater.createView(LayoutInflater.java:626)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375)
            at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93)
            at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:600)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375)
            at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93)
            at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: No inject registered for members/com.example.dagger.ui.sidemenu.SidemenuView. You must explicitly add it to the 'injects' option in one of your modules.
            at dagger.ObjectGraph$DaggerObjectGraph.getInjectableTypeBinding(ObjectGraph.java:302)
            at dagger.ObjectGraph$DaggerObjectGraph.inject(ObjectGraph.java:279)
            at mortar.Mortar.inject(Mortar.java:93)
            at com.example.dagger.ui.sidemenu.SidemenuView.<init>(SidemenuView.java:29)
            at com.example.dagger.ui.sidemenu.SidemenuView.<init>(SidemenuView.java:21)
            at java.lang.reflect.Constructor.constructNative(Native Method)
            at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
            at android.view.LayoutInflater.createView(LayoutInflater.java:600)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:702)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:470)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:398)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:354)
            at com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.setMenu(SlidingMenu.java:375)
            at com.example.dagger.ui.MainActivity.setupSidemenu(MainActivity.java:93)
            at com.example.dagger.ui.MainActivity.onCreate(MainActivity.java:51)
            at android.app.Activity.performCreate(Activity.java:5426)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
            at android.app.ActivityThread.access$900(ActivityThread.java:161)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
4

3 回答 3

1

所以,我addsTo从子模块中删除,添加complite=false, library=true到子模块并添加includesAppModule现在它可以工作了。但我仍然不明白为什么它不像我以前那样工作。它的完成方式有点不方便,因为每次我实现新模块时,我都需要去AppModule并将这个模块添加到包含的模块列表中。它打破了 Open/Closed 原则,所以如果有办法添加新模块,我仍然很感兴趣addsTo=AppModule.class

有什么建议么 ?谢谢。

于 2014-10-14T11:55:54.303 回答
0

我遇到了同样的问题,我想我发现了为什么会这样。随着includes您将子模块添加到 main AppModule。随着addsTo您告诉 IDE 解析器您的子模块扩展了,Appmodule但您需要手动创建子图。

我不知道它是否足以从子模块创建一个新图形,ObjectGraph.create(new Submodule());它会自动包含用addsTo. 如果它不起作用,您需要手动创建一个子图parentGraph.plus(new Submodule())

于 2015-03-13T13:42:04.857 回答
0

为什么不在你的AppModule中注入SidemenuView呢?

于 2015-02-04T16:13:56.240 回答