2016-05-16 18 views
5

Hanımefendiye yeniyim ve kurucum/yöntem enjeksiyonu işe yaramaz. Enjekte edilen alanların hala talep edildiği anlamına gelmez. Ben yapıcı yukarıdaki "@ Enjekte" ek açıklaması kullanılan rağmenAndroid: Hançer 2 ve yapıcı enjeksiyonu

@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! 

    } 

} 

"Sınıfım" hala "Bağlam" gerektirir:

Bu benim kodudur. Neyi eksik?

İçeriğimi açığa çıkarmam bile gerekiyor mu?

Teşekkürler.

+0

Örnek oluşturacaksanız @inject noktası nedir? MyClass my = new MyClass(); 'like this? –

cevap

10

Eh ... Eğer yapıcı

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

beyan Ve bu çalışması gerekir sizce neden sonra hiçbir parametre

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

olmadan diyoruz? Bu düz java, hançer dahil değil ve gerekli argümanları sağlamadan yeni bir nesne yaratmaya çalışıyorsunuz.


Hançer, java'nın nasıl çalıştığını değiştiren bir sihir değildir. Kurucu enjeksiyonunu kullanmak için alanlarınızı enjekte etmek için Hançeri kullanmanız gerekir.

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 
    } 

} 

Eğer (o değilse bir Context must be provided... derleme hatası alırsınız) hançer sonra çağıran inject — sihirli tarafından MyClass etkinliğinizi enjekte edecek yerde Context sağlamak olduğu göz önüne alındığında. inject yöntemi, nesneyi alanınıza atayacaktır. Oluşturucu enjeksiyonu, yalnızca bir modül kullanmanız ve nesneyi sağlamak için bir yöntem içermemeniz anlamına gelir. Sadece ince havadaki nesneleri sihirli bir şekilde yaratmaz veya kurucuların çalışma şeklini değiştirmez.

+0

Bu konuyla ilgili olarak bana yardımcı olabilir misiniz? Http://stackoverflow.com/q/43308649/6596724, Teşekkürler –

+0

Bir modül olmayan bir sınıf için bir bileşen nasıl yapıldığını göstermiş olsaydı harika olurdu. –