2016-01-27 1 views
1

Я пытаюсь добавить Dagger 2 в свой Android-проект. Мое приложение имеет следующий экранDagger 2 presenter injection return null

  1. Войти расширяет базовую активность
  2. навигации активность расширяет основной активности,
  3. MW активность экстентов Навигационная активность

Presenter Injection работает отлично Войти и навигационную деятельность, где, как в MW деятельности он возвращает null

Butter Knife также не работает в MW Деятельность, где в качестве рабочего г штраф в других видах деятельности

Ниже приведены мои классы класса Применение

public class abcApplication extends Application { 
    ApplicationComponent mApplicationComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 


     mApplicationComponent = DaggerApplicationComponent.builder() 
       .applicationModule(new ApplicationModule(this)) 
       .build(); 
     mApplicationComponent.inject(this); 
    } 

    public static abcApplication get(Context context) { 
     return (abcApplication) context.getApplicationContext(); 
    } 

    public ApplicationComponent getComponent() { 
     return mApplicationComponent; 
    } 

    // Needed to replace the component with a test specific one 
    public void setComponent(ApplicationComponent applicationComponent) { 
     mApplicationComponent = applicationComponent; 
    } 


} 

Базовая активность

public class BaseActivity extends AppCompatActivity { 
    private ActivityComponent mActivityComponent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 


    public ActivityComponent activityComponent() { 
     if (mActivityComponent == null) { 
      mActivityComponent = DaggerActivityComponent.builder() 
        .activityModule(new ActivityModule(this)) 
        .applicationComponent(abcApplication.get(this).getComponent()) 
        .build(); 
     } 
     return mActivityComponent; 
    } 

} 

навигации активность

public class NavigationActivity extends BaseActivity implements NavigationView { 

    @Inject 
    DataClient mDataClient; 

    @Bind(R.id.drawer_layout) 
    protected DrawerLayout mDrawerLayout; 
    @Bind(R.id.navList) 
    ExpandableListView mExpandableListView; 

    private ActionBarDrawerToggle mDrawerToggle; 
    private String mActivityTitle; 
    private ExpandableListAdapter mExpandableListAdapter; 
    private List<String> mExpandableListTitle; 
    private Map<String, List<String>> mExpandableListData; 

    private Map<String, String> activityMap; 

    private int lastExpandedPosition = -1; 

    @Inject 
    NavigationPresenter navigationPresenter; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_navigation); 
     activityComponent().inject(this); 
     ButterKnife.bind(this); 
     navigationPresenter.attachView(this); 


     } 
    @Override 
    protected void onDestroy() { 
    super.onDestroy(); 
    navigationPresenter.detachView(); 
    } 
     } 

MW активность

public class MWActivity extends NavigationActivity implements MWView{ 
    private MWPagerAdapter mMWPagerAdapter; 


    @Inject 
    MWPresenter MWPresenter; 

    private ViewPager mViewPager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

     ButterKnife.bind(this); 

     MWPresenter.attachView(this); 
     MWPresenter.getMarketData(); 
     } 

    } 

Logcat: неустранимые: Основной процесс: com.abc.xyz, ПИД: 21542

java.lang.RuntimeException: Невозможно запустить активность ComponentInfo {com.abc.xyz/com.abc. trading.xyz.ui.main.mw.view.MWActivity}: java.lang.NullPointerException at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2318) at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java: 2396)

@PreActivity 
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class) 

    public interface ActivityComponent { 

     void inject(LoginActivity loginActivity); 
     void inject(NavigationActivity navigationActivity); 
     void inject(MWActivity mWActivity); 
     void inject(MWTabFragment mWTabFragment); 
     void inject(MWDetailsActivity mWDetailsActivity); 


    } 
+0

Укажите свой компонент, где вы Habe вашей 'инъекционной (активность)' метода –

+0

@DavidMedenjak Я обновил свое описание, пожалуйста, проверьте – Rahul

+0

@DavidMedenjak даже масло нож не работает в MWActivity деятельности – Rahul

ответ

1

Активность Компонент не был введен в действие activityComponent(). Inject (this); в MW деятельности

public class MWActivity extends NavigationActivity implements MWView{ 
    private MWPagerAdapter mMWPagerAdapter; 


    @Inject 
    MWPresenter MWPresenter; 

    private ViewPager mViewPager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     activityComponent().inject(this); 
     DrawerLayout mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

     ButterKnife.bind(this); 

     MWPresenter.attachView(this); 
     MWPresenter.getMarketData(); 
     } 

    } 

ActivityComponent (базовая активность)

public class BaseActivity extends AppCompatActivity { 
    private ActivityComponent mActivityComponent; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 


    public ActivityComponent activityComponent() { 
     if (mActivityComponent == null) { 
      mActivityComponent = DaggerActivityComponent.builder() 
        .activityModule(new ActivityModule(this)) 
        .applicationComponent(OmsApplication.get(this).getComponent()) 
        .build(); 
     } 
     return mActivityComponent; 
    } 

} 
3

У вас есть 2 проблемы относительно супер-/подтипов под рукой.

  1. делает нож для масла not support injection to super types
  2. Dagger делает not support injection to sub types

Как уже отмечалось, для решения 2. Вам нужно будет позвонить inject в вашем MWActivity и использовать нож для масла вам нужно использовать ViewHolder шаблон в вашем суперклассе для привязки/ввода полей, поскольку он будет вводить только MWActivity, а не NavigationActivity.

+0

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