有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用dagger 2的java视图依赖项注入

我有一个扩展TextView的自定义视图。我应该在哪里调用我的组件来注入视图

component.inject(customTextView);

共 (3) 个答案

  1. # 1 楼答案

    更新:由于Dagger的2.10版本,此答案无效

    自定义视图:

    public class CustomView extends View {
        @Inject
        AnyObject anyObject;
    
        public CustomView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        @Override
        protected void onFinishInflate() {
            super.onFinishInflate();
            MainActivity mainActivity = (MainActivity) getContext();
            mainActivity.getComponent().inject(CustomView.this);
        }
    }
    

    活动:

    ActivityComponent mComponent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mComponent = DaggerActivityComponent.builder()
                        .appComponent(getApp().getAppComponent())
                        .activityModule(new ActivityModule(MainActivity.this))
                        .build();
        mComponent.inject(MainActivity.this);
        ...
    }
    
    public ActivityComponent getComponent() {
        return mComponent;
    }
    

    具有活动范围的Dagger2组件:

    @ActivityScope
    @Component(dependencies = AppComponent.class, modules = {ActivityModule.class})
    public interface ActivityComponent extends AppComponent {
    
        void inject(MainActivity mainActivity);
        void inject(CustomView customView);
    }
    

    范围:

    @Scope
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ActivityScope {}
    
  2. # 2 楼答案

    我对这类事情的一般解决方案是

    public class WelcomeView
            extends LinearLayout {
        private static final String TAG = "WelcomeView";
    
        public WelcomeView(Context context) {
            super(context);
            init(context);
        }
    
        public WelcomeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
        }
    
        public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context);
        }
    
        @TargetApi(21)
        public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context);
        }
    
        private void init(Context context) {
            if(!isInEditMode()) {
                Application.getComponent(context).inject(this);
            }
        }
    
  3. # 3 楼答案

    因此,我发现我需要在自定义视图的构造函数中添加注入(在所有视图中,或者一个调用另一个)

    例如:

    public class CustomTextView extends TextView {
       @Inject
       AnyProvider anyProvider;
    
       public CustomTextView(Context context) { this(context, null); }
       public CustomTextView(Context AttributeSet attrs) { 
          super(context, attrs);
          Application.getComponent(context).inject(this);
       }
    }