下面是一个使用Android MVVM架构和Dagger 2库来注入ViewModelFactory的示例代码:
首先,创建一个ViewModelFactory类,它负责创建ViewModel对象:
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map, Provider> creators;
@Inject
public ViewModelFactory(Map, Provider> creators) {
this.creators = creators;
}
@NonNull
@Override
public T create(@NonNull Class modelClass) {
Provider extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry, Provider> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("Unknown ViewModel class: " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
接下来,在Application类中创建Dagger的Component和Module:
public class MyApplication extends Application {
private AppComponent component;
@Override
public void onCreate() {
super.onCreate();
component = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
}
public AppComponent getAppComponent() {
return component;
}
}
@Module
public class AppModule {
private final Application application;
public AppModule(Application application) {
this.application = application;
}
@Provides
@Singleton
Application provideApplication() {
return application;
}
@Provides
@Singleton
ViewModelProvider.Factory provideViewModelFactory(ViewModelFactory factory) {
return factory;
}
}
然后,创建一个AppComponent接口和一个具体的实现类:
@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent {
void inject(MainActivity activity);
}
public class DaggerAppComponent implements AppComponent {
private final AppModule appModule;
private DaggerAppComponent(AppModule appModule) {
this.appModule = appModule;
}
public static AppComponent.Builder builder() {
return new Builder();
}
@Override
public void inject(MainActivity activity) {
activity.viewModelFactory = appModule.provideViewModelFactory(new ViewModelFactory(Collections.emptyMap()));
}
private static class Builder implements AppComponent.Builder {
private AppModule appModule;
@Override
public AppComponent.Builder appModule(AppModule appModule) {
this.appModule = appModule;
return this;
}
@Override
public AppComponent build() {
return new DaggerAppComponent(appModule);
}
}
}
最后,在Activity或Fragment中使用注入的ViewModelFactory:
public class MainActivity extends AppCompatActivity {
@Inject
ViewModelProvider.Factory viewModelFactory;
private MainViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注入ViewModelFactory
((MyApplication) getApplication()).getAppComponent().inject(this);
// 使用ViewModelFactory创建ViewModel对象
viewModel = ViewModelProviders.of(this, viewModelFactory).get(MainViewModel.class);
// 使用ViewModel对象进行其他操作
}
}
以上是一个简单的Android MVVM Dagger 2示例,其中ViewModelFactory通过Dagger 2库进行注入,并在Activity中使用了注入的ViewModelFactory来创建ViewModel对象。