2017-11-23 4 views
0

私は、DaggerシングルトンをAndroidコンポーネント(サービス)とViewModelに注入することに苦労しています。Android ViewModelにsetter注入を使用すると何が問題になりますかViewModel.Factoryを実装し注入するのですか?

参考として、questionを参照してください。 と同じオブジェクトを持つViewModelのフィールドとフィールドに単純にフィールドを挿入する方法の良い例は見つかりませんでした。それに対する単純な解決策があるなら、私はそれを見るのが大好きです。

私はViewModel.Factoryを実装してから作成する方法を経由して依存関係を持っているのViewModelサブクラスのコンストラクタに依存性の注入の道を行く答えを持っているいくつかの質問、herehereを見つけました。

私の質問です。アクティビティ(とサービス)にオブジェクトを注入してから、Setterを使用してオブジェクトを取得した後にオブジェクトをViewModelに注入するだけで重大な問題はありますか?例えば。私は値が既に設定されているかどうかをチェックし、それがnullだ場合にのみ、それを設定することができ観点MainViewModelクラスで

class MainActivity : AppCompatActivity() { 

    @Inject lateinit var messageBus: MessageBus // "thing" I want in the ViewModel 
    override fun onCreate(savedInstanceState: Bundle?) { 
     AndroidInjection.inject(this) 
     super.onCreate(savedInstanceState) 
     // get the ViewModel 
     val viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) 
     // inject the "thing" via a setter 
     viewModel.messageBus = messageBus 
    } 
} 

class MainViewModel: ViewModel() { 

    var messageBus: MessageBus? = null 
    set(value) { 
     if (field == null) { 
      field = value 
      // do initialization stuff 
     } 
    } 
} 

答えて

0

私はそれを少しハックと見ますが、有害なハックではありません。私はViewModelFactoryにダガーを使用してそれを機能させるために必要なすべての依存関係を提供し、それをアクティビティに注入してof(FragmentActivity activity, ViewModelProvider.Factory factory)メソッドに渡すことができるように考えています。そのプロパティの変更を回避します。

関連する問題