匕首,如何注入一个类,而不是一个模块

时间:2014-08-09 16:47:15

标签: android dagger

根据JakeWharton在https://speakerdeck.com/jakewharton/2014的幻灯片97,对象图允许注入一个类。 但是,我确实尝试过,我得到了一个N​​PE,似乎从未调用过该类的构造函数。

我的代码如下。我对AppModule提供AnalyticsManager没有问题。

public class App extends Application implements ModuleCreator {
private ObjectGraph objectGraph;
@Inject
AnalyticsManager analyticsManager;
@Override
public void onCreate(){
    super.onCreate();
    objectGraph = ObjectGraph.create(getModules().toArray());
    objectGraph.inject(RealBusEvent.class);
    objectGraph.inject(Trip.class);
    objectGraph.inject(this);
    analyticsManager.registerAppEnter();
}
public List<Object> getModules() {
    return Arrays.<Object>asList(new AppModule(this));
}
}

其他两个班级:

public class RealBusEvent {
     @Inject Trip trip;

     @Inject
     public RealBusEvent(){; }

     public Trip getTrip() {
         return trip;
     }
}

public class Trip {
    @Inject
    public Trip(){
        this.time = 123;
    }

    public Trip(long time) {
        this.time = time;
    }

    public long getTime() {
        return time;
    }

    private long time;
}  

使用RealEventBus的课程如下:

    public class MyActivity extends Activity {
    @Inject RealBusEvent event;

    TextView mTextView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        mTextView = (TextView) findViewById(R.id.txtView);
        Button button = (Button) findViewById(R.id.btn);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mTextView.setText(String.valueOf(event.getTrip().getTime()));
            }
        });
    }
    }   

我对象event始终为空。我错过了什么吗? 感谢。

1 个答案:

答案 0 :(得分:1)

在每个课程中你需要执行一个@Inject,你必须调用:objectGraph.inject(this);通常你把它放在构造函数中,如下所示:

public class RealBusEvent {
     @Inject Trip trip;

     @Inject
     public RealBusEvent(){
       YOU_OBJECTGRAPH_REFERENCE.inject(this);
     }

     public Trip getTrip() {
         return trip;
     }
}

主要的挑战是如何获得 YOU_OBJECTGRAPH_REFERENCE &#39;如果你没有“上下文”。为此,您可以通过单身人士访问ObjectGraph,而不是非常优雅,但有时​​如果您无法通过Context,它就是唯一的选择。

但是如果你有Context,你可以按照这个链接上的例子:  https://github.com/nuria/android-examples/tree/master/dagger-logger-example/Sample/src/com/example/android/ui

并查看如何ObjectGraphDemoApplication中定义的DemoBaseActivity可以从{{1}}访问。