Sobes.tech
Middle+

Ինչպես կատարել ViewModel-ի ինექցիան Dagger-ով?

sobes.tech AI

Պատասխան AI-ից

  1. Ստեղծեք ViewModel դաս և նշեք այն որպես @Injectable:
  2. Ստեղծեք ViewModelProvider.Factory, որը իմանա, ինչպես ստեղծել ViewModel ինստանցիաները: Դա սովորաբար կատարվում է Class<? extends ViewModel>-ի և Provider<? extends ViewModel>-ի քարտեզագրմամբ:
  3. Դագգեր մոդուլում սահմանեք ViewModelProvider.Factory ստեղծելու մեթոդը: Հաճախ օգտագործվում է @BindsViewModel-ի և նրա @Provider-ի կապի համար:
  4. 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);
        // ...
    }
}