简体   繁体   English

使用Android上的Dagger和Java,ViewModelProvider.Factory在片段上保持为空

[英]ViewModelProvider.Factory remains null on fragment using Dagger and Java on Android

Using the google sample GithubsampleBrowser I have become stuck on trying to inject the ViewModelProvider.Factory. 使用谷歌示例GithubsampleBrowser我已经陷入尝试注入ViewModelProvider.Factory。

When comparing with the sample, I see it goes GithubViewModelFactory fine but mine never does and i'm not sure what I am missing. 当与样本比较时,我看到GithubViewModelFactory很好,但我从来没有这样做,我不确定我缺少什么。 Hopefully it is something very simple and presumably is because I am using androidx components instead. 希望它是非常简单的东西,大概是因为我使用的是androidx组件。

Main Activity: 主要活动:

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: CategoryFragment:

public class CategoryFragment extends Fragment implements Injectable {

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

AppInjector: 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: 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: 的AppModule:

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

ViewModelModule: ViewModelModule:

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

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

CrosscareViewModel: 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;
    }

Greatly appreciate any help. 非常感谢任何帮助。

Well after all that, I was missing one thing. 好吧,毕竟,我错过了一件事。 In the manifest, I needed: 在清单中,我需要:

 android:name=".CrosscareApp"

In the sample, it was 在样本中,它是

 android:name=".GithubApp"

Presumably the file at the root of the directory. 大概是目录根目录下的文件。

And then it works. 然后它的工作原理。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM