2016-05-16 30 views
5

Sono nuovo al pugnale e il mio costruttore/metodo di iniezione non sembra funzionare. Non funziona, significa che i campi iniettati sono ancora richiesti.Android: Dagger 2 e iniezione del costruttore

Questo è il mio codice:

@Module 
public class AppContextModule { 

    private final Context appContext; 

    public AppContextModule(Context appContext) { 
     this.appContext = appContext; 
    } 

    @Singleton 
    @Provides 
    public Context getAppContext() { 
     return appContext; 
    } 

} 

@Singleton 
@Component(modules = {AppContextModule.class}) 
public interface MyComponent { 

    void inject(ActivitiesLifeCycleListener obj); 

    void inject(WebViewManager obj); 

    Context context(); 

} 

public final class MyClass { 

    private final WeakReference<Context> mAppContext; 

    @Inject 
    public MyClass(Context context) { 
     this.mAppContext = context 
    } 

} 

public class MyActivity extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     MyClass my = new MyClass(); // The IDE requests context! 

    } 

} 

"MyClass" richiede ancora "Contesto" anche se ho usato l'annotazione "@Inject" sopra il costruttore. Cosa mi manca?

Ho anche bisogno di esporre il mio contesto?

Grazie.

+0

Qual è il punto di @inject se si intende creare istanza 'MyClass my = new MyClass();' come questo? –

risposta

10

Beh ... si dichiara costruttore

public MyClass(Context context) { 
    this.mAppContext = context 
} 

e quindi chiamare senza alcun parametro

MyClass my = new MyClass(); // The IDE requests context! 

Perché pensi che questo dovrebbe funzionare? Questo è semplice java, nessun pugnale coinvolto, e stai cercando di creare qualche nuovo oggetto senza fornire gli argomenti necessari.


Dagger c'è magia che cambia il funzionamento di Java. Per usare l'iniezione del costruttore devi usare effettivamente Dagger per iniettare i tuoi campi.

public class MyActivity extends BaseActivity { 

    @Inject 
    MyClass mMyClass; // mark field for injection 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // todo ... create component 

     component.inject(this); // inject fields 
    } 

} 

Dato che si fornisce un Context da qualche parte (si otterrà un errore di compilazione Context must be provided... se non lo è) pugnale sarà poi iniettare la vostra attività con MyClass da chiamandoinject — nessuna magia. Il metodo inject assegnerà l'oggetto al tuo campo.


Iniezione del costruttore significa che non è necessario utilizzare un modulo e includere un metodo per fornire l'oggetto. Non crea magicamente oggetti dal nulla o cambia il modo in cui funzionano i costruttori.

+0

potresti aiutarmi su questo argomento http://stackoverflow.com/q/43308649/6596724, Grazie –

+0

Sarebbe fantastico se avessi mostrato come creare un componente per la classe che non è un modulo. –