2017-08-04 17 views
3

私はGoogleのArchitecture Componentsを試しています。Android ViewModelProviderFotory in kotlin

class MyFactory(val handler: Handler) : ViewModelProvider.Factory { 
    override fun <T : ViewModel?> create(modelClass: Class<T>?): T { 
     return MyViewModel(handler) as T 
    } 
} 

私のViewModelには、次のようになります:

class MyViewModel(val handler: Handler) : ViewModel() 

誰もが最終的に厄介なキャストを回避する方法を知っている具体的に私は、コンストラクタのパラメータを取りますので、同様のViewModelを作成するViewModelProvider.Factoryを実装したいです:

return MyViewModel(handler) as T 
+1

あなたは危険な作業をしています...クライアントコードは 'T extends ViewModel'を期待しますが、あなたは' MyViewModel'を与えます。クライアントコードが特定の型の 'T'を使用するときは、' ClassCastException'を常に持っています。例えば: 'val model:T = factory.create(T :: class.java)' –

+0

これは、アプローチ: – Entreco

+1

あなたは 'ViewModel'をインスタンス化するためにリフレクションを使うことができ、' ViewModel'を作るために3番目のIoCコンテナを使うことができます。 –

答えて

4

あなたは書くことができます:

これはコンストラクタ引数としてHandlerを受け入れるすべてのクラスで動作し、クラスに適切なコンストラクタがない場合はNoSuchMethodExceptionをスローします。

+0

これは非常にまれにしか呼ばれないので、反射のコストは妥当と思われます。ファンキーなコトリンのお菓子がほしいと思っていたでしょうが、これはします。ありがとう! – Entreco

+1

この場合、Reified Generic TypesのようなKotlinグッズは残念ながら利用できません。型の消去のために、キャストを強制するか反射を使用するだけです。また、デフォルトのファクトリはすでにリフレクションを使用して空のパブリックコンストラクタを呼び出し、コストはほぼ同じになります。 – BladeCoder

関連する問題