2016-03-28 6 views
2

数日間、これでブロックされました。DaggerがInject in Daggerで返されます。

AndroidModule.javaの 'application'メンバーフィールドは何らかの理由で注入後にnullです。

AndroidModule.java

@Module(
     library = true 
) 
public class AndroidModule { 

    @Inject MittoApplication application; 

    @Provides @Singleton 
    SharedPreferences provideSharedPreferences() { 
     return PreferenceManager.getDefaultSharedPreferences(application); 
    } 

} 

ApplicationModule.java

@Module(
     includes = { ApiModule.class, AndroidModule.class }, 
     library = true 
) 
public class ApplicationModule { 

    private Application application; 
    public ApplicationModule(Application application) { 
     this.application = application; 
    } 

    @Provides @Singleton 
    Application providesApplication() { 
     return application; 
    } 
} 

BaseActivity.java

public class BaseActivity extends AppCompatActivity { 

    private ObjectGraph objectGraph; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     objectGraph = MittoApplication.getApplication(this).buildScopedObjectGraph(getModules()); 
     objectGraph.inject(this); 
    } 

    @Override 
    protected void onDestroy() { 
     objectGraph = null; 
     super.onDestroy(); 
    } 

    protected List<Object> getModules() { 
     return Arrays.<Object>asList(
     ); 
    } 
} 

MittoApplication.java

public class MittoApplication extends Application { 

    private static Context context; 
    private ObjectGraph objectGraph; 

    public void onCreate() { 
     super.onCreate(); 
     MittoApplication.context = getApplicationContext(); 
     initializeObjectGraph(); 
    } 

    public static MittoApplication getApplication(Context context) { 
     MittoApplication mittoApplication = (MittoApplication) context.getApplicationContext(); 
     return mittoApplication; 
    } 

    public ObjectGraph getObjectGraph() { 
     return this.objectGraph; 
    } 

    public ObjectGraph buildObjectGraph(List<Object> modules) { 
     return ObjectGraph.create(modules.toArray()); 
    } 

    public ObjectGraph buildScopedObjectGraph(List<Object> modules) { 
     return objectGraph.plus(modules.toArray()); 
    } 

    private ObjectGraph buildInitialObjectGraph(List<Object> modules) { 
     return ObjectGraph.create(modules.toArray()); 
    } 

    private void initializeObjectGraph() { 
     objectGraph = buildInitialObjectGraph(Arrays.<Object>asList(new ApplicationModule(this))); 
    } 

    public static Context getContext() { 
     return MittoApplication.context; 
    } 

} 

私はこれを熟考して過ごしました、私は無数の例とブログサイトを見てきました。誰かを賢くして助けてくれる人が大好きです。

読んでいただきありがとうございます。

答えて

2

フィールド注入は、オブジェクトグラフの直接呼び出しでのみ機能します。プロバイダメソッドのapplicationインスタンスを取得するには、プロバイダメソッドのパラメータとして参照する必要があります。

//@Inject MittoApplication application; //this won't work 

@Provides @Singleton 
SharedPreferences provideSharedPreferences(Application application) { //this will 
    return PreferenceManager.getDefaultSharedPreferences(application); 
} 

また、あなたが実際にMittoApplication、唯一Applicationを提供することはありません。

そして、それはあなたがDagger1を使用していることは注目に値しますので、私はあなたがあることをごAndroidModuleを変更する必要があります信じてcomplete=false

@Module(
     library = true, 
     complete = false 
) 
public class AndroidModule {