2016-11-08 6 views
0

Я работаю с Firebase push notification структурой MVP с использованием `Dagger2. , поскольку мне нравится кодирование более гибким с лучшей логикой.Значение интерфейса равно null при вызове в MVP с помощью Dagger2

Итак, мой вопрос интерфейс notificationView я могу только получить null значение от этого даже я уже установлено notificationView значения в BaseTopActivity с помощью Dagger 2 (@Inject BaseTopPresenter) + MVP (BaseTopPresenter)

Пожалуйста, помогите мне рассмотреть чтобы получить notificationView значение (если не null),

Спасибо,

р/с: Ниже сведения о файлах.

NotificationView interface

public interface BaseTopView extends BaseView { 

    interface NotificationView { 
     void onUpdateNotifications(RemoteMessage remoteMessage, int notifyId); 
    } 
} 

Component

@ActivityScope 
@Component(dependencies = {AppComponent.class}) 
public interface Component { 

    // Activities 
    void inject(BaseTopActivity activity); 

    // Services 
    void inject(FirebaseMsgService service); 

} 

BaseActivity.java

@ActivityScope 
public abstract class BaseActivity extends AppCompatActivity implements BaseView { 

/** 
* Dagger 2 
*/ 
Component Component; 

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

    // Dagger 2 
    Component = DaggerComponent.builder() 
    .appComponent(MainApplication.getAppComponent(this)).build(); 
} 

} 

BaseTopActivity.java где я установить интерфейс notificationView значение

@ActivityScope 
public abstract class BaseTopActivity extends BaseActivity implements BaseTopView.NotificationView { 

@Inject 
BaseTopPresenter baseTopPresenter; 

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

     /** 
     * Dagger2 
     */ 
     getComponent().inject(this); 

     // notification view : print : Activity Name extend BaseTopActivity 

     Timber.e(" setView " + notificationView); 

     // BaseTopPresenter value == [email protected] 
     baseTopPresenter.setView(notificationView); 

    } 
} 

BaseTopPresenter interface где я установил интерфейс notificationView значение

public void setView(BaseTopView.NotificationView notificationView) { 
     // GOT VALUE ALREADY HERE, NOT NULL 
     Timber.e(BaseTopPresenter.class.getSimpleName() + " setView " + notificationView); 

     this.notificationView = notificationView; 
    } 

    public BaseTopView.NotificationView getView() { 
     return notificationView; 
    } 

Издание появится в этом файле, где я получаю интерфейс notificationView значения: FirebaseService.java

public class FirebaseMsgService extends FirebaseMessagingService { 

// Dagger2 
Component Component; 

@Inject 
BaseTopPresenter presenter; 

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    super.onMessageReceived(remoteMessage); 

    MainApplication applicationContext = (MainApplication) getApplicationContext(); 
    if (applicationContext != null) { 
     // RUN 
     Timber.e("onMessageReceived --- inject "); 

     // Dagger 2 
     Component = DaggerComponent.builder() 
       .appComponent(MainApplication.getAppComponent(this)).build(); 
     asukabuComponent.inject(this); 
    } else Timber.e("applicationContext == null"); 

    // VALUE in getView() IS NULL HERE, NO CRASH WITH PRESENTER 
    // BaseTopPresenter value == [email protected] 
    Timber.e("getView " + presenter.getView()); 

    if (remoteMessage != null) sendNotification(remoteMessage); 
} 

UPDATE: значение BaseTopPresenter отличается. Я думаю, что где-то я вводил Dagger2, это неправильно.

MainApplication.java

public class MainApplication extends Application { 

/** 
* Dagger 2 
*/ 
private AppComponent appComponent; 

/** 
* @param context 
* @return 
*/ 
public static AppComponent getAppComponent(Context context) { 
    return ((MainApplication) context.getApplicationContext()).appComponent; 
} 

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

    // Dagger 2 
    appComponent = DaggerAppComponent.builder() 
      .appModule(new AppModule(this)) 
      .networkModule(new NetworkModule(getString(R.string.base_url))) 
      .build(); 
} 
} 
+0

Вы можете определить «AppComponent» в классе приложений подробнее см. Https://github.com/saveendhiman/SampleApp/blob/master/app/src/main/java/com/sampleapp/base/SampleApplication.java – Saveen

+0

@Saveen: Могу ли я знать, что это значит? Я также обновляю файл u want :) –

+0

Можете ли вы просмотреть мой пример, что вам не хватает – Saveen

ответ

0

Как я вижу, вы создаете другой BaseTopPresenter когда вводят его в FirebaseMsgService. И, очевидно, нет взгляда. Вы можете сделать singleton BaseTopPresenter (проверить аннотацию @Singleton). Но в этом случае вы должны быть очень осторожны с жизненным циклом вида (e.c. Activity).