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 の短剣の例に従っています。そのため、プロジェクトで同様の構造を作成しました。まず、継承元の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

私は短剣の専門家ではありませんが、2 つの問題があります。

  • 周期的な依存関係があります。ヘルパーにアクティビティを注入したい場合、アクティビティにヘルパーを注入したい場合。ダガーで解決できるとは思えない
  • アクティビティは、アクティビティ レベル グラフで 1 回、アプリケーション レベル グラフで 1 回、2 回注入を試みます。

これを機能させるために私がしたことは次のとおりです。

  • ScbeHelper で: @Inject アノテーションを削除します
  • BaseActivity で: remove ((protoApp)getApplication()).inject(this);
  • ActivityModule で: provideActivity メソッドを削除し (今後使用されなくなります)、次のメソッドを追加します。
@Provides @Singleton ScbeHelper provideScbeHelper() {
    return new ScbeHelper(activity);
}

これが何をするかというと、ScbeHelper に必要なコンテキストを提供しますが、注釈駆動型の注入を 1 つだけ残すので、ダガーはそれを解決できます。お役に立てれば。

于 2013-07-24T22:18:51.823 に答える