ViewModelProvider.Factory остается нулевым на фрагменте, используя Dagger и Java на Android - PullRequest
0 голосов
/ 17 мая 2019

Использование примера Google GithubsampleBrowser Я застрял при попытке ввести ViewModelProvider.Factory.

При сравнении с примером я вижу, что с GithubViewModelFactory все в порядке, а у меня - нет, и я не уверен, что мне не хватает. Надеюсь, это что-то очень простое и, вероятно, потому, что я вместо этого использую компоненты androidx.

Основная деятельность:

public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector {

    @Inject
    DispatchingAndroidInjector<Fragment> dispatchingAndroidInjector;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public DispatchingAndroidInjector<Fragment> supportFragmentInjector() {
        return dispatchingAndroidInjector;
    }
}

CategoryFragment:

public class CategoryFragment extends Fragment implements Injectable {

    @Inject
    ViewModelProvider.Factory viewModelFactory;// <-- remains null

AppInjector:

public class AppInjector {
    private AppInjector() {}
    public static void init(CrosscareApp crossCareApp) {
       DaggerAppComponent.builder().application(crossCareApp)
                .build().inject(crossCareApp);
        crossCareApp
                .registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
                    ........
    }

    private static void handleActivity(Activity activity) {
        if (activity instanceof HasSupportFragmentInjector) {
            AndroidInjection.inject(activity);
        }
        if (activity instanceof FragmentActivity) {
            ((FragmentActivity) activity).getSupportFragmentManager()
                    .registerFragmentLifecycleCallbacks(
                            new FragmentManager.FragmentLifecycleCallbacks() {
                                @Override
                                public void onFragmentCreated(FragmentManager fm, Fragment f,
                                        Bundle savedInstanceState) {
                                    if (f instanceof Injectable) {
                                        AndroidSupportInjection.inject(f);
                                    }
                                }
                            }, true);
        }
    }
}

AppComponent:

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        AppModule.class,
        MainActivityModule.class
})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance Builder application(Application application);
        AppComponent build();
    }
    void inject(CrosscareApp crosscareApp);
}

AppModule:

@Module(includes = ViewModelModule.class)
class AppModule {
    @Singleton @Provides
    CrosscareService provideCrossCareService() {
        return new Retrofit.Builder()
           ..........
    }

ViewModelModule:

@Module
abstract class ViewModelModule {
    @Binds
    @IntoMap
    @ViewModelKey(CategoryViewModel.class)
    abstract ViewModel bindCategoryViewModel(CategoryViewModel categoryViewModel);

    @Binds
    abstract ViewModelProvider.Factory bindViewModelFactory(CrosscareViewModelFactory factory);
}

CrosscareViewModel:

@Singleton
public class CrosscareViewModelFactory implements ViewModelProvider.Factory {

    private final Map<Class<? extends ViewModel>, Provider<ViewModel>> creators;

    @Inject
    public CrosscareViewModelFactory(Map<Class<? extends ViewModel>, Provider<ViewModel>> creators) {
        this.creators = creators;
    }

Очень ценю любую помощь.

1 Ответ

0 голосов
/ 17 мая 2019

Ну, после всего этого мне не хватало одной вещи.В манифесте мне нужно было:

 android:name=".CrosscareApp"

В примере это был

 android:name=".GithubApp"

Предположительно файл в корне каталога.

И затемработы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...