0

我开始使用匕首,非常喜欢它,但现在面临一些困难。我的场景如下:有一个活动和一个依赖项。依赖项被注入到活动中,并且需要对该活动的引用。像这样:

public class MainActivity extends BaseActivity {        
    @Inject ScbeHelper scbeHelper;

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

public class ScbeHelper {

    protected static final String TAG = "scbe_helper";  
    private BaseActivity activityContext;

    @Inject 
    public ScbeHelper(BaseActivity context) {       
        this.activityContext = context;
    }
}

我正在关注github 中 Dagger 的示例以获取活动图表。所以我在我的项目中创建了一个类似的结构。首先,继承BaseActivity自的类:MainActivity

public abstract class BaseActivity extends Activity {
    private ObjectGraph activityGraph;
    @Override
    protected void onCreate(Bundle savedInstanceState) {    
        super.onCreate(savedInstanceState);

        protoApp application = (protoApp) getApplication();
        // Exception happens in next line, inside plus() method
        activityGraph = application.getApplicationGraph().plus(getModules().toArray());

        // Inject ourselves so subclasses will have dependencies fulfilled when this method returns.
        activityGraph.inject(this);

        ((protoApp)getApplication()).inject(this);
    }

    protected List<Object> getModules() {
        return Arrays.<Object>asList(new ActivityModule(this));
    }

    public void inject(Object object) {
        activityGraph.inject(object);
    }
}

和模块:

@Module(injects={MainActivity.class})
public class ActivityModule {
    private final BaseActivity activity;

    public ActivityModule(BaseActivity activity) {
        this.activity = activity;
    }

    @Provides @Singleton BaseActivity provideActivity() {
        return activity;        
    }   
}

现在,问题: No injectable members on com.example.proto.BaseActivity. Do you want to add an injectable constructor? required by public com.example.proto.ScbeHelper(com.example.proto.BaseActivity)

换句话说,提供者方法由于某种原因ActivityModule.provideActivity()并没有真正提供实例BaseActivity,尽管在我的理解中它设置正确。有人在我的设置中看到错误吗?我在匕首的逻辑中遗漏了什么吗?

提前致谢!

4

1 回答 1

2

我不是匕首专家,但你有两个问题:

  • 你有一个循环依赖:你的助手想要注入活动,你的活动想要注入助手。我不认为 Dagger 可以解决这个问题
  • 您的活动尝试注入两次,一次使用活动级别图,一次使用应用程序级别图

这是我为使其正常工作所做的工作:

  • 在 ScbeHelper 中:删除 @Inject 注释
  • 在 BaseActivity: remove ((protoApp)getApplication()).inject(this);
  • 在 ActivityModule 中:删除您的 provideActivity 方法(不再使用它),并添加以下方法:
@Provides @Singleton ScbeHelper provideScbeHelper() {
    return new ScbeHelper(activity);
}

它的作用是为您的 ScbeHelper 提供所需的上下文,但只留下 1 个注释驱动的注入,因此 dagger 可以解决它。希望这可以帮助。

于 2013-07-24T22:18:51.823 回答