6

今日、Dagger 2 を使い始めたばかりで、すべてを正確にセットアップする方法について少し混乱しています。

POJO を注入しようとしていますが、常に null です。まず、いくつかのコード:

App.java

private AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
}

public AppComponent component() {
    return appComponent;
}

AppModule.java

@Module
public class AppModule {
    private Application app;

    public AppModule(Application app) {
        this.app = app;
    }

    @Provides @Singleton
    public Application application() {
        return app;
    }
}

AppComponent.java

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
    Application application();
}

NetworkingManager.java

@Singleton
public class NetworkingManager {
    private Context ctx;

    @Inject
    public NetworkingManager(Context context) {
        this.ctx = context;
    }
}

NetModule.java

@Module
public class NetModule {
    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

NetComponent.java

@Singleton
@Component(modules = {NetModule.class},
        dependencies = {AppModule.class})
public interface NetComponent {
    void inject(NetworkingManager networkingManager);
}

SomeClass.java

@Inject
NetworkingManager networkingManager;

public void doSomethingWithNetworkManager() {
    networkManager.doStuff();
}

多くのチュートリアル、SO の質問、および例を調べるのにかなりの時間を費やしましたが、何が間違っているのかを理解できませんでした。

セットアップに何か問題があることは 99% 確信していますが、原因を突き止めることはできませんでした。

4

1 に答える 1

10

NetworkingManagerコメントに基づいて、アプリケーションのどこでも利用できるようにしたいと考えています。

の定義から始めましょうComponent:

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
}

これは、このコンポーネントがAppクラスを注入することを Dagger に伝えます。ここで、注入したい他のクラスを Dagger に伝えることもできます。したがって、Activityたとえば注入したい場合は、次のように追加します。

@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
    void inject(App application);
    void inject(MainActivity activity) //Where MainActivity is a class that extends Activity.
}

これは、アプリケーション全体の依存関係を共有するための最良の方法ではないことに注意してください。Componentから継承する を作成し、目的の共有依存関係を公開する必要がありますAppComponentAppComponent

次に、モジュール クラスを見てみましょう。

@Module
public class NetModule {
    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

ここであなたは を@Provideing しています。それでNetworkingManagerいいのです。あなたにNetworkingManagerApplication(Context本当に)が必要AppですNetworkingManagerNetworkingManager_AppModuleAppModule@ProvideApplication

@Module
public class AppModule {
    private Application app;

    public AppModule(Application app) {
        this.app = app;
    }

    @Provides @Singleton
    public Application application() {
        return app;
    }

    @Provides @Singleton
    public NetworkingManager provideNetworkingManager(Application application) {
        return new NetworkingManager(application);
    }
}

Appクラス内で:

public class App extends Application {
    private AppComponent appComponent;

@Override
public void onCreate() {
    super.onCreate();
    appComponent = DaggerAppComponent
            .builder()
            .appModule(new AppModule(this))
            .build();
   appComponent.inject(this);
}

public AppComponent component() {
    return appComponent;
 }
}

そして、私たちの仮説ではMainActivity

public class MainActivity extends Activity {

private AppComponent appComponent;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    appComponent = ((App)getApplicationContext()).getAppComponent();
    appComponent.inject(this);
   }
 }

使い方が@Component(dependencies = {...})間違っているようです。上記のメカニズムを使用して、ある依存関係を別dependenciesの依存関係に公開する場合に使用されます。Component

于 2015-05-29T23:58:24.830 に答える