[英]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.