2017-03-28 8 views
-1

私は、短剣でDIを使用して注入されているクラスを持っています。しかし、アクティビティが破棄されて再作成されたとき、モデルクラスには、データを挿入/再挿入せずに自動的にデータが含まれているように見えます。データを自動的に永続化するダガー

public class MyApplication extends Application { 

    private ExpressionFactoryComponent mExpressionFactoryComponent; 

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

     // Building dagger DI component 
     mExpressionFactoryComponent = DaggerExpressionFactoryComponent.builder(). 
       expressionFactoryModule(new ExpressionFactoryModule(new ExpressionFactory(this))).build(); 
    } 
} 

モジュール:

@Module 
public class ExpressionFactoryModule { 
    private ExpressionFactory mExpressionFactory; 

    public ExpressionFactoryModule(ExpressionFactory expressionFactory) { 
     this.mExpressionFactory = expressionFactory; 
    } 

    @Provides 
    ExpressionFactory provideStringExpressionFactory() { 
     return mExpressionFactory; 
    } 
} 
+0

ポストあなたのモジュール:ここで

は(ExpressionFactoryComponentがここAppComponentに変更されます)ソリューションです。おそらくあなたはそれに範囲を与えました。スコープ付き変数は、作成に使用されたコンポーネントの存続期間中存在し、後続の要求は同じ変数を返します。 –

+0

私は変数にスコープを指定していません。私は現在ダガー2を学んでいます – user2498079

+0

@GabeSechan質問にモジュールコードを投稿しました – user2498079

答えて

1

この理由の一つは、ExpressionFactoryMyApplicationクラスでインスタンス化してからExpressionFactoryComponentを作成中ExpressionFactoryModuleのコンストラクタに渡されていることです。モジュールのコンストラクタにApplicationインスタンスを渡してから、@Provide注釈を持つメトリックを使用してクラスのインスタンスを作成し、そのクラスのコンストラクタにApplicationインスタンスを渡す必要があります。

これはどのように物事を短剣で行う必要があります。しかし、問題を解決するには、クラスのインスタンスにアクティビティのみを持たせる必要がある場合、別のコンポーネントクラスを作成してアクティビティにコンポーネントをビルドする必要があります。

public class MyApplication extends Application { 

    private static AppComponent appComponent; 

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

     // Building dagger DI component 
     appComponent = DaggerAppComponent.builder() 
       .appModule(new AppModule(this)).build(); 
    } 

    public static AppComponent getAppComponent() { 
     return appComponent; 
    } 
} 


@Component(modules = {AppModule.class}) 
public interface AppComponent { 

    Application getApplication(); 

    void inject(App application); 
} 


@Module 
public class AppModule { 

    private Application application; 

    public AppModule(Application application) { 
     this.application = application; 
    } 


    @Provides 
    Application provideApplication() { 
     return application; 
    } 
} 


@Component(dependencies = AppComponent.class, modules = { 
     ActivityModule.class}) 
public interface ActivityComponent { 

    void inject(MainActivity activity); 

} 

@Module 
public class ActivityModule { 

    private Activity activity; 

    public ActivityModule(Activity activity) { 
     this.activity = activity; 
    } 

    @Provides 
    Activity provideActivity() { 
     return activity; 
    } 


    @Provides 
    ExpressionFactory provideStringExpressionFactory(Application application) { 
     return new ExpressionFactory(application); 
    } 

} 

public class MainActivity extends AppCompatActivity{ 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ActivityComponent activityComponent = DaggerActivityComponent.builder() 
        .activityModule(new ActivityModule(activity)) 
        .appComponent(App.getAppComponent()) 
        .build(); 

     activityComponent.inject(this); 

    } 

} 
関連する問題