11

アプリケーション全体のシングルトン プロバイダーとして moduleA をセットアップし、ユーザー関連オブジェクト プロバイダーとして ModuleB をセットアップしました。

私のユーザー表示フラグメントは、システム全体のバスを使用してメッセージを他のユーザーに送信し、ユーザー関連オブジェクトを使用して表示します。

問題は、異なるスコープ クラスを 1 つのオブジェクトに挿入できません。component.getX メソッドの使用は正常に機能しますが、注入が推奨される方法です。エラー メッセージ: @UserScope は、スコープが異なるバインディングを参照できない場合があります: @Provides @Singleton Bus ModuleA.provideBus()

@Module
public class ModuleA {
  @Provides @Singleton Bus provideBus() {...}
}

ユーザー関連情報プロバイダーとしてのモジュール B

@Module
public class ModuleB{
  private final User user;
  public ModuleB(User user) {...}
  @Provides @UserScope User provideUser() {}
  @Provides @UserScope UserManager provideUserManager() {}
}

次のようにコンポーネントをセットアップします。

@Component (modules={ModuleA.class})
@Singleton
public interface ComponentA {
  Bus getBus();
  void inject(ClassA target);
}

@Component(modules={ModuleB.class})
@UserScope
public interface ComponentB {
  User getUser();
  UserManager getUserManager();
  void inject(ClassA target);
}


class UserFragment exrtends Fragment {
   @Inject Bus bus;
   @Inject UserManager userManager;
   public void onCreate() {
      getComponentA().inject(this);
      getComponentB().inject(this);
   }
}
4

2 に答える 2

9

あなたが提供したコードスニペットの主な問題は、取得したエラーをシングルトンに正しく提供するためにModuleB依存関係が必要であることだと思います。ModuleAつまり、これはうまくいくはずです:

@Component(modules={ModuleB.class}, dependencies = ComponentA.class)
@UserScope
public interface ComponentB {
    User getUser();
    UserManager getUserManager();
    void inject(MainActivity target);
}

私はあなたのクラスを再作成し、空白を埋めるためにいくつかの仮定を立てましたが、うまくいくようです. 完全な動作コードは GitHub で確認できます。私のコードの唯一の違いは、あなたが呼んだものClassA/UserFragment私が呼んMainActivityだものですが、それ以外の構造は同じです。

于 2015-07-30T00:28:17.860 に答える