web-dev-qa-db-ja.com

Koin DIを使用して「app」モジュールから「network」モジュールにアプリケーションコンテキストを注入する方法

Koin DI(ver:1.0.1)に基づいて、2つのモジュール(:appおよび:network)を使用するアプリケーションを開発しています。 :networkモジュールには「コンテキスト」が必要です。以下に実装方法を示します。

**Module**:
val appModule = module {
    viewModel { LoginViewModel(get()) }
}

**Activity**:
private val viewModel by viewModel<LoginViewModel>()

**ViewModel**:
class LoginViewModel(val context: Context): ViewModel() {
  ...
  // Send "context" to network class in :network module
  ...
 }

質問::networkモジュールのネットワーククラスにコンテキストを直接送信する方法はありますか?

11
user2064275

@Rajatと@Andreyの両方の答えは正しいです。実際、 sources を見ると、androidContext()get()の単なる拡張関数であることがわかります。したがって、これら2つの定義は同じです。

_val appModule = module {
    viewModel { LoginViewModel(get()) }
}
_

...

_val appModule = module {
    viewModel { LoginViewModel(androidContext()) }
}
_

get()androidContext()module DSLオブジェクトのメンバーであるため、質問に答えるには、次のようにします。

_val networkModule = module {
   single { Network(androidContext()) }
}
_

または単純に(簡潔にするためにこれを好みます):

_val networkModule = module {
   single { Network(get()) }
}
_
18
maslick

アプリケーションコンテキストは、関数 androidContext() を使用してモジュール内で使用できます。

5
Andrey Ilyunin
val appModule = module {
    viewModel { LoginViewModel(androidContext()) }
}

これで問題が解決するはずです。

1
Rajat Beck