2016-05-16 3 views
5

Я новичок в кинжале, и мой инсталлятор конструктора/метода не работает. Не работает, поскольку запрошенные поля по-прежнему запрашиваются.Android: Кинжал 2 и инъекция конструктора

Это мой код:

@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» по-прежнему требует «Контекст», хотя я использовал «@Inject» аннотацию над конструктором. Что мне не хватает?

Нужно ли мне даже разоблачать мой контекст?

Спасибо.

+0

В чем смысл @inject, если вы собираетесь создавать экземпляр MyClass my = new MyClass(); 'нравится это? –

ответ

10

Ну ... вы объявляете ваш конструктор

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

И затем вызвать его без каких-либо параметров

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

Почему вы думаете, что это должно работать? Это простой java, никакого кинжала, и вы пытаетесь создать какой-то новый объект, не поставляя необходимые аргументы.


Кинжал - это не волшебство, которое меняет работу java. Чтобы использовать инъекцию конструктора, вы должны использовать Кинжал для ввода ваших полей.

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 
    } 

} 

Учитывая, что вы обеспечиваете Context где-то (вы получите ошибку в Context must be provided... компиляции, если это не так) Кинжал будет вводить вашу деятельность с MyClass по вызывающимinject — нет волшебного. Метод inject назначит объект вашему полю.

Впрыск конструктора означает, что вам не нужно использовать модуль и включать способ предоставления объекта. Он не просто волшебным образом создает объекты из воздуха или меняет способ работы конструкторов.

+0

Вы можете помочь мне по этой теме http://stackoverflow.com/q/43308649/6596724, Thanks –

+0

Было бы здорово, если бы вы показали, как сделать компонент для класса, который не является модулем. –

Смежные вопросы