工厂模式 → Hilt
老写法(Java --- Factory/手动容器)
java
// ViewModel Factory
public class ItemViewModelFactory implements ViewModelProvider.Factory {
private final ItemRepository repository;
public ItemViewModelFactory(ItemRepository repository) {
this.repository = repository;
}
@Override
public <T extends ViewModel> T create(Class<T> modelClass) {
if (modelClass.isAssignableFrom(ItemViewModel.class)) {
return (T) new ItemViewModel(repository);
}
throw new IllegalArgumentException("Unknown ViewModel class");
}
}
// 使用
ItemViewModelFactory factory = new ItemViewModelFactory(repository);
ItemViewModel vm = new ViewModelProvider(this, factory).get(ItemViewModel.class);
问题在哪里
每多一个 ViewModel 就要多一个 Factory 类,十几个 ViewModel 就是十几个 Factory。依赖链越长,Factory 里要传的依赖越多,样板代码越多。
新写法(Hilt)
Application:
kotlin
@HiltAndroidApp
class App : Application()
提供依赖:
kotlin
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides @Singleton
fun provideOkHttp(): OkHttpClient = OkHttpClient.Builder().build()
@Provides @Singleton
fun provideRetrofit(client: OkHttpClient): Retrofit =
Retrofit.Builder().baseUrl("...").client(client).build()
@Provides @Singleton
fun provideApi(retrofit: Retrofit): ApiService =
retrofit.create(ApiService::class.java)
}
自己的类用构造函数注入(不需要写在 Module 里):
kotlin
class ItemRepository @Inject constructor(
private val api: ApiService
)
使用:
kotlin
@HiltViewModel
class ItemViewModel @Inject constructor(
private val api: ApiService,
private val repository: ItemRepository
) : ViewModel()
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
private val viewModel: ItemViewModel by viewModels()
}
一句话注意
Hilt 会自动生成 ViewModel Factory,不需要手写。@HiltViewModel + @Inject constructor 就够了。依赖关系从类构造函数声明,Hilt 自动解析依赖树。
Hilt 基于 Dagger,编译期生成所有依赖注入代码,性能优于运行时反射方案(如 Koin)。但 Hilt 的编译速度比 Koin 慢,小项目或不喜欢注解处理器的话可以用 Koin 替代。
Java Android 老项目迁移系列,持续更新中。