Middle+
Ինչպես կատարել ViewModel-ի ինექցիան Dagger-ով?
sobes.tech AI
Պատասխան AI-ից
- Ստեղծեք
ViewModelդաս և նշեք այն որպես@Injectable: - Ստեղծեք
ViewModelProvider.Factory, որը իմանա, ինչպես ստեղծելViewModelինստանցիաները: Դա սովորաբար կատարվում էClass<? extends ViewModel>-ի ևProvider<? extends ViewModel>-ի քարտեզագրմամբ: - Դագգեր մոդուլում սահմանեք
ViewModelProvider.Factoryստեղծելու մեթոդը: Հաճախ օգտագործվում է@Binds-ըViewModel-ի և նրա@Provider-ի կապի համար: - Activity կամ Fragment-ում ինժեքցիացրեք
ViewModelProvider.Factory-ը և օգտագործեք այնViewModelինստանցիայի ստացման համար:
// MyViewModel.java
public class MyViewModel extends ViewModel {
private final SomeDependency dependency;
@Inject
public MyViewModel(SomeDependency dependency) {
this.dependency = dependency;
}
// ... ViewModel մեթոդներ
}
// ViewModelFactory.java
public class ViewModelFactory implements ViewModelProvider.Factory {
private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;
@Inject
public ViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
this.creators = creators;
}
@NonNull
@Override
public <T extends ViewModel> T create(@NonNull Class<T> modelClass) {
Provider<? extends ViewModel> creator = creators.get(modelClass);
if (creator == null) {
for (Map.Entry<Class<? extends ViewModel>, Provider<ViewModel>> entry : creators.entrySet()) {
if (modelClass.isAssignableFrom(entry.getKey())) {
creator = entry.getValue();
break;
}
}
}
if (creator == null) {
throw new IllegalArgumentException("unknown model class " + modelClass);
}
try {
return (T) creator.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
// ViewModelModule.java
@Module
public abstract class ViewModelModule {
@Binds
abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);
@Binds
@IntoMap
@ViewModelKey(MyViewModel.class)
abstract ViewModel bindMyViewModel(MyViewModel viewModel);
// Այստեղ ավելացրեք այլ ViewModels, օգտագործելով @Binds և @ViewModelKey
}
// ViewModelKey.java
@MapKey
@Retention(RetentionPolicy.RUNTIME)
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
// MyActivity.java
public class MyActivity extends AppCompatActivity {
@Inject
ViewModelProvider.Factory viewModelFactory;
private MyViewModel myViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
AndroidSupportInjection.inject(this); // Եթե օգտագործում եք dagger-android
super.onCreate(savedInstanceState);
// ...
myViewModel = new ViewModelProvider(this, viewModelFactory).get(MyViewModel.class);
// ...
}
}