gpt4 book ai didi

android - Dagger,如何注入(inject)一个类,而不是一个模块

转载 作者:行者123 更新时间:2023-11-29 01:40:09 25 4
gpt4 key购买 nike

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

我的代码如下。我对 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()));
}
});
}
}

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

最佳答案

在每个需要执行 @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”。为此,您可以通过单例访问 ObjectGraph,这不是很优雅,但有时​​如果您不能传递 Context,它是唯一的选择。

但是如果您确实有一个 Context,您可以按照此链接上的示例进行操作: https://github.com/nuria/android-examples/tree/master/dagger-logger-example/Sample/src/com/example/android/ui

看看他们如何ObjectGraph(在 DemoApplication 中定义)可以从 DemoBaseActivity 访问。

关于android - Dagger,如何注入(inject)一个类,而不是一个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25220829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com