0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

💉【Hilt完全ガイド】Androidの依存性注入を使いこなしてKotlinコードを爆速強化!

Posted at

🔍 依存性注入(DI)ってなぜ必要?

「依存性注入(Dependency Injection)」は単なる流行りではなく、モダンAndroid開発における基盤アーキテクチャです。

DIを使うと:

  • テストが簡単に(モックが使いやすくなる)
  • ボイラープレート削減MyClass(context, api, db, ...) から卒業)
  • モジュール化が進む(実装の差し替えも楽々)

😱 DIを使わないとどうなる?

class UserRepository {
    private val api = ApiService()
    private val db = Database()
}

class UserViewModel {
    private val repo = UserRepository() // がっつり依存!
}

これはテストもメンテも辛い…


🛠️ Hilt登場!Google公式のDIライブラリ

Hiltは Daggerベース のAndroid専用DIライブラリで、Daggerよりも圧倒的にシンプル!


✅ Step 1: GradleにHiltを追加

// app/build.gradle.kts
plugins {
    id("com.google.dagger.hilt.android")
    kotlin("kapt")
}

dependencies {
    implementation("com.google.dagger:hilt-android:2.48")
    kapt("com.google.dagger:hilt-compiler:2.48")
}

✅ Step 2: アプリケーションクラスに初期化処理

@HiltAndroidApp // Hilt用のコード生成をトリガー
class MyApp : Application()

🧩 よく使うHiltアノテーションまとめ

1️⃣ @Inject:依存性を注入

class AnalyticsAdapter @Inject constructor(
    private val service: AnalyticsService
)

2️⃣ @Provides:依存性の定義(モジュール)

@Module
@InstallIn(SingletonComponent::class)
object AppModule {

    @Provides
    fun provideAnalyticsService(): AnalyticsService =
        Retrofit.Builder()
            .baseUrl("https://example.com/")
            .build()
            .create(AnalyticsService::class.java)
}

3️⃣ @AndroidEntryPoint:ActivityやFragmentに注入

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

    @Inject lateinit var analytics: AnalyticsAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        analytics.track("Activity Created")
    }
}

🧪 実用例:MVVM × Hilt

// Repository(モジュールで提供)
class UserRepository @Inject constructor(
    private val api: ApiService
)

// ViewModel(Hiltが依存解決!)
@HiltViewModel
class UserViewModel @Inject constructor(
    private val repo: UserRepository
) : ViewModel()

// Fragmentで使用
@AndroidEntryPoint
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels()
}

🔒 スコープで依存性のライフサイクルを制御

  • @Singleton → アプリ全体で1つのインスタンス
  • @ActivityScoped → アクティビティ単位で生存
@ActivityScoped
class NavigationManager @Inject constructor() { /* ... */ }

💡 なぜHiltなのか?

  • 最小限の記述(Daggerより簡単)
  • Jetpackと統合済み(ViewModel・WorkManagerなど)
  • コンパイル時エラーで安心(コード自動生成)

🚀 最後に:Hilt導入のコツ

まずは 1つの機能(例:Analytics) にHiltを導入してみましょう。

  • ✅ アーキテクチャがスッキリ
  • ✅ ユニットテストが高速化
  • ✅ デバッグがラクに

DIはオプションじゃない。プロフェッショナルAndroid開発の必須技術です!😎


📚 参考リンク


🏷 おすすめタグ(Qiita用)

Android, Kotlin, Hilt, DI, 開発効率化


✨ Qiita FEST仲間と一緒に、もっと良いアプリを作ろう!


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?