2016-05-16 19 views
5

Ich bin neu zu Dolch und mein Konstruktor/Methode Injektion scheint nicht zu funktionieren. Funktioniert nicht, was bedeutet, dass die injizierten Felder noch angefordert werden.Android: Dolch 2 und Konstruktor Injektion

Dies ist mein Code:

@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" erfordert noch "Kontext" obwohl ich die "@Inject" Anmerkung über den Konstruktor verwendet. Was fehlt mir?

Muss ich meinen Kontext sogar freilegen?

Danke.

+0

Was ist der Sinn von @inject, wenn Sie die Instanz 'MyClass my = new MyClass();' so erstellen? –

Antwort

10

Nun ... erklären Sie Konstruktor

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

Und es dann ohne Parameter aufrufen

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

Warum denken Sie, diese funktionieren sollte? Dies ist einfaches Java, kein Dolch, und Sie versuchen, ein neues Objekt zu erstellen, ohne die benötigten Argumente zu liefern.


Dolch ist keine Magie, die ändert, wie Java funktioniert. Um die Konstruktorinjektion zu verwenden, müssen Sie Dagger verwenden, um Ihre Felder zu injizieren.

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 
    } 

} 

Vorausgesetzt, dass Sie ein Context bieten irgendwo (Sie werden ein Context must be provided... Kompilierungsfehler, wenn dies nicht der Fall) Dolch mit MyClass von wird dann injiziert Ihre Aktivität ruftinject — keine Magie. Die Methode inject weist das Objekt Ihrem Feld zu.

Konstruktorinjektion bedeutet nur, dass Sie kein Modul verwenden und eine Methode zur Bereitstellung des Objekts einschließen müssen. Es schafft nicht nur auf magische Weise Objekte aus der Luft oder verändert die Arbeitsweise von Konstrukteuren.

+0

könnten Sie mir zu diesem Thema http://stackoverflow.com/q/43308649/6596724 helfen, Danke –

+0

Wäre toll, wenn Sie gezeigt hätten, wie man eine Komponente für die Klasse macht, die kein Modul ist. –