Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首2,底部导航和注射_Android_Dagger 2_Android Mvvm - Fatal编程技术网

Android 匕首2,底部导航和注射

Android 匕首2,底部导航和注射,android,dagger-2,android-mvvm,Android,Dagger 2,Android Mvvm,我正在MVVM和Dagger 2中做一个小的Android应用程序。但我不知道如何正确使用匕首2,以防我有一个活动和两个碎片。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入到片段中,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码 活动: public class MainActivity extends DaggerAppCompatActivity { private static final String TAG = "MainActiv

我正在MVVM和Dagger 2中做一个小的Android应用程序。但我不知道如何正确使用匕首2,以防我有一个活动和两个碎片。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入到片段中,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码

活动

public class MainActivity extends DaggerAppCompatActivity {

private static final String TAG = "MainActivity";

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

    BottomNavigationView navView = findViewById(R.id.nav_view);

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupWithNavController(navView, navController);
}

}
public class EventsFragment extends DaggerFragment {

private static final String TAG = "EventsFragment";
private EventsViewModel eventsViewModel;
private final EventsAdapter adapter = new EventsAdapter();
private List<Event> events = new ArrayList<>();

@Inject
ViewModelProviderFactory viewModelProviderFactory;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    eventsViewModel = ViewModelProviders.of(this, viewModelProviderFactory).get(EventsViewModel.class);
    View root = inflater.inflate(R.layout.fragment_events, container, false);

    RecyclerView recyclerView = root.findViewById(R.id.events_recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);

    getEvents();

    return root;
}
FirstFragment

public class MainActivity extends DaggerAppCompatActivity {

private static final String TAG = "MainActivity";

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

    BottomNavigationView navView = findViewById(R.id.nav_view);

    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupWithNavController(navView, navController);
}

}
public class EventsFragment extends DaggerFragment {

private static final String TAG = "EventsFragment";
private EventsViewModel eventsViewModel;
private final EventsAdapter adapter = new EventsAdapter();
private List<Event> events = new ArrayList<>();

@Inject
ViewModelProviderFactory viewModelProviderFactory;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    eventsViewModel = ViewModelProviders.of(this, viewModelProviderFactory).get(EventsViewModel.class);
    View root = inflater.inflate(R.layout.fragment_events, container, false);

    RecyclerView recyclerView = root.findViewById(R.id.events_recycler_view);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);

    getEvents();

    return root;
}
在本例中,两个片段都可以工作,但我只能在一个片段中注入ViewModelFactory。如果我将此注入第二个:错误:找不到符号类DaggerAppComponent

活动构建器模块:

public class ScheduleFragment extends DaggerFragment {

private ScheduleViewModel scheduleViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    scheduleViewModel = ViewModelProviders.of(this).get(ScheduleViewModel.class);
    View root = inflater.inflate(R.layout.fragment_schedule, container, false);

    return root;
}

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
}
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
   @Singleton
   @Component(
    modules = {
            AndroidSupportInjectionModule.class,
            ActivityBuildersModule.class,
            AppModule.class,
            ViewModelFactoryModule.class
    }
    )
    public interface AppComponent extends AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
}

}
 @Module
 public abstract class FragmentBuildersModule {

@ContributesAndroidInjector(
        modules = {ViewModelModule.class, EventsModule.class}
)
abstract EventsFragment contributeEventsFragment();

@ContributesAndroidInjector(
        modules = {ViewModelModule.class}
)
abstract ScheduleFragment contributeScheduleFragment();
}
@Module
public abstract class ViewModelFactoryModule {

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Module
public class BaseApplication extends DaggerApplication {


@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
    return DaggerAppComponent.builder().application(this).build();
}
AppComponent:

public class ScheduleFragment extends DaggerFragment {

private ScheduleViewModel scheduleViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    scheduleViewModel = ViewModelProviders.of(this).get(ScheduleViewModel.class);
    View root = inflater.inflate(R.layout.fragment_schedule, container, false);

    return root;
}

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
}
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
   @Singleton
   @Component(
    modules = {
            AndroidSupportInjectionModule.class,
            ActivityBuildersModule.class,
            AppModule.class,
            ViewModelFactoryModule.class
    }
    )
    public interface AppComponent extends AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
}

}
 @Module
 public abstract class FragmentBuildersModule {

@ContributesAndroidInjector(
        modules = {ViewModelModule.class, EventsModule.class}
)
abstract EventsFragment contributeEventsFragment();

@ContributesAndroidInjector(
        modules = {ViewModelModule.class}
)
abstract ScheduleFragment contributeScheduleFragment();
}
@Module
public abstract class ViewModelFactoryModule {

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Module
public class BaseApplication extends DaggerApplication {


@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
    return DaggerAppComponent.builder().application(this).build();
}
视图模型工厂:

public class ScheduleFragment extends DaggerFragment {

private ScheduleViewModel scheduleViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    scheduleViewModel = ViewModelProviders.of(this).get(ScheduleViewModel.class);
    View root = inflater.inflate(R.layout.fragment_schedule, container, false);

    return root;
}

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
}
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
   @Singleton
   @Component(
    modules = {
            AndroidSupportInjectionModule.class,
            ActivityBuildersModule.class,
            AppModule.class,
            ViewModelFactoryModule.class
    }
    )
    public interface AppComponent extends AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
}

}
 @Module
 public abstract class FragmentBuildersModule {

@ContributesAndroidInjector(
        modules = {ViewModelModule.class, EventsModule.class}
)
abstract EventsFragment contributeEventsFragment();

@ContributesAndroidInjector(
        modules = {ViewModelModule.class}
)
abstract ScheduleFragment contributeScheduleFragment();
}
@Module
public abstract class ViewModelFactoryModule {

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Module
public class BaseApplication extends DaggerApplication {


@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
    return DaggerAppComponent.builder().application(this).build();
}
ViewModelKey:

public class ScheduleFragment extends DaggerFragment {

private ScheduleViewModel scheduleViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    scheduleViewModel = ViewModelProviders.of(this).get(ScheduleViewModel.class);
    View root = inflater.inflate(R.layout.fragment_schedule, container, false);

    return root;
}

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
}
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
   @Singleton
   @Component(
    modules = {
            AndroidSupportInjectionModule.class,
            ActivityBuildersModule.class,
            AppModule.class,
            ViewModelFactoryModule.class
    }
    )
    public interface AppComponent extends AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
}

}
 @Module
 public abstract class FragmentBuildersModule {

@ContributesAndroidInjector(
        modules = {ViewModelModule.class, EventsModule.class}
)
abstract EventsFragment contributeEventsFragment();

@ContributesAndroidInjector(
        modules = {ViewModelModule.class}
)
abstract ScheduleFragment contributeScheduleFragment();
}
@Module
public abstract class ViewModelFactoryModule {

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Module
public class BaseApplication extends DaggerApplication {


@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
    return DaggerAppComponent.builder().application(this).build();
}
公共抽象类ViewModelModule{

@Binds
@IntoMap
@ViewModelKey(EventsViewModel.class)
public abstract ViewModel bindEventsViewModel(EventsViewModel eventsViewModel);

@Binds
@IntoMap
@ViewModelKey(ScheduleViewModel.class)
public abstract ViewModel bindScheduleViewmodel(ScheduleViewModel scheduleViewModel);
基本应用程序:

public class ScheduleFragment extends DaggerFragment {

private ScheduleViewModel scheduleViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    scheduleViewModel = ViewModelProviders.of(this).get(ScheduleViewModel.class);
    View root = inflater.inflate(R.layout.fragment_schedule, container, false);

    return root;
}

@Override
public void onAttach(Context context) {
    AndroidSupportInjection.inject(this);
    super.onAttach(context);
}
}
@Module
public abstract class ActivityBuildersModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
   @Singleton
   @Component(
    modules = {
            AndroidSupportInjectionModule.class,
            ActivityBuildersModule.class,
            AppModule.class,
            ViewModelFactoryModule.class
    }
    )
    public interface AppComponent extends AndroidInjector<BaseApplication> {

@Component.Builder
interface Builder {

    @BindsInstance
    Builder application(Application application);

    AppComponent build();
}

}
 @Module
 public abstract class FragmentBuildersModule {

@ContributesAndroidInjector(
        modules = {ViewModelModule.class, EventsModule.class}
)
abstract EventsFragment contributeEventsFragment();

@ContributesAndroidInjector(
        modules = {ViewModelModule.class}
)
abstract ScheduleFragment contributeScheduleFragment();
}
@Module
public abstract class ViewModelFactoryModule {

@Binds
public abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelProviderFactory modelProviderFactory);
}
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MapKey
public @interface ViewModelKey {
Class<? extends ViewModel> value();
}
@Module
public class BaseApplication extends DaggerApplication {


@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
    return DaggerAppComponent.builder().application(this).build();
}
公共类BaseApplication扩展了DaggerApplication{
@凌驾

受保护的雄激素受体就像第一个片段一样。 试试这个

也是一种通过在AppModule中添加此方法来提供Api的方法

@Singleton
    @Provides
    public RemoteApi provideRemoteApi(){
        return Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl(Constants.API_BASE_URL)
            .build()
            .create(RemoteApi::class.java)
    }


您应该在其中使用Api类替换RemoteApi。

您需要确保AppComponent对要注入的两个片段都具有方法Inject(FRAGMENTCLASS fragment)。并且不要忘记在这两个片段中作为第一个片段进行注入:@Override public void onAttach(上下文上下文){AndroidSupportInject.Inject(此);super.onAttach(上下文);}我已经尝试过你的解决方案,但仍然存在相同的错误。你能发布你的DI文件吗?组件和模块吗?当然。等一下。完成。很抱歉编辑得很糟糕,但SO编辑器很奇怪。这是从Kotlin翻译的,对Java来说不是很好。:)重点是你在代码中的某个地方创建了EventApi,你不需要移动该逻辑来提供函数如果你有git上的项目,我可以看一下,我可以提供更多帮助,但是在这里发布的每一个类都可能是垃圾邮件。:)