android mvvm 找不到属性绑定,android – MVVM Dagger2与组件中存在匹配键的绑定

我正在使用以下谷歌示例项目:

https://github.com/googlesamples/android-architecture-components作为我的新项目的参考,并且难以尝试向项目添加第二个活动.

这是编译时遇到的错误

Error:(22, 8) error: [dagger.android.AndroidInjector.inject(T)] com.apps.myapp.ui.common.MainActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.

com.apps.myapp.ui.common.MainActivity is injected at

com.apps.myapp.ui.common.NavigationController.(mainActivity)

com.apps.myapp.ui.common.NavigationController is injected at

com.apps.myapp.ui.addContacts.AddContactsFragment.navigationController

com.apps.myapp.ui.addContacts.AddContactsFragment is injected at

dagger.android.AndroidInjector.inject(arg0)

A binding with matching key exists in component: com.apps.myapp.di.ActivityModule_ContributeMainActivity.MainActivitySubcomponent

这是我的代码

ActivityModule

@Module

public abstract class ActivityModule {

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)

abstract MainActivity contributeMainActivity();

@ContributesAndroidInjector(modules = FragmentBuildersModule.class)

abstract ContactActivity contributeContactActivity();

}

AppComponent

@Singleton

@Component(modules = {

AndroidInjectionModule.class,

AppModule.class,

ActivityModule.class})

public interface AppComponent {

@Component.Builder

interface Builder {

@BindsInstance Builder application(Application application);

AppComponent build();

}

void inject(App app);

}

AppInjector

public class AppInjector {

private AppInjector() {}

public static void init(App app) {DaggerAppComponent.builder().application(app).build().inject(app);

app.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {

@Override

public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

handleActivity(activity);

}

@Override

public void onActivityStarted(Activity activity) {

}

@Override

public void onActivityResumed(Activity activity) {

}

@Override

public void onActivityPaused(Activity activity) {

}

@Override

public void onActivityStopped(Activity activity) {

}

@Override

public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

}

@Override

public void onActivityDestroyed(Activity activity) {

}

});

}

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);

}

}

}

的AppModule

@Module(includes = ViewModelModule.class)

class AppModule {

@Singleton @Provides

BnderAPIService provideService() {

return new Retrofit.Builder()

.baseUrl("serverurl")

.addConverterFactory(GsonConverterFactory.create())

.addCallAdapterFactory(new LiveDataCallAdapterFactory())

.build()

.create(APIService.class);

}

@Singleton @Provides

Db provideDb(Application app) {

return Room.databaseBuilder(app, Db.class,"Db.db").build();

}

@Singleton @Provides

UserDao provideUserDao(Db db) {

return db.userDao();

}

@Singleton @Provides

ContactDao provideContactDao(Db db) {

return db.contactDao();

}

}

FragmentBuildersModule

@Module

public abstract class FragmentBuildersModule {

@ContributesAndroidInjector

abstract AddContactsFragment contributeAddUserFragment();

@ContributesAndroidInjector

abstract ContactsFragment contributeContactsFragment();

@ContributesAndroidInjector

abstract ChalkboardFragment contributeChalkboardFragment();

}

注射

public interface Injectable {

}

ViewModelKey

@Documented

@Target({ElementType.METHOD})

@Retention(RetentionPolicy.RUNTIME)

@MapKey

@interface ViewModelKey {

Class extends ViewModel> value();

}

ViewModelModule

@Module

abstract class ViewModelModule {

@Binds

@IntoMap

@ViewModelKey(AddContactsViewModel.class)

abstract ViewModel bindAddContactsViewModel(AddContactsViewModel addContactsViewModel);

@Binds

@IntoMap

@ViewModelKey(ContactsViewModel.class)

abstract ViewModel bindContactsViewModel(ContactsViewModel contactsViewModel);

@Binds

@IntoMap

@ViewModelKey(ChalkboardViewModel.class)

abstract ViewModel bindChalkboardViewModel(ChalkboardViewModel chalkboardViewModel);

@Binds

abstract ViewModelProvider.Factory bindViewModelFactory(ViewModelFactory factory);

}

应用

public class App extends Application implements HasActivityInjector {

@Inject

DispatchingAndroidInjector dispatchingAndroidInjector;

@Override

protected void attachBaseContext(Context base) {

super.attachBaseContext(base);

MultiDex.install(this);

}

@Override

public void onCreate() {

super.onCreate();

if (BuildConfig.DEBUG) {

}

AppInjector.init(this);

}

@Override

public DispatchingAndroidInjector activityInjector() {

return dispatchingAndroidInjector;

}

}

NavigationController

public class NavigationController {

private final int containerId;

private final FragmentManager fragmentManager;

@Inject

public NavigationController(MainActivity mainActivity) {

this.containerId = R.id.container;

this.fragmentManager = mainActivity.getSupportFragmentManager();

}

public void navigateToUsers() {

Log.i("TAG", "Navigate to users");

String tag = "users";

AddContactsFragment userFragment = AddContactsFragment.create();

fragmentManager.beginTransaction()

.replace(containerId, userFragment, tag)

.addToBackStack(null)

.commitAllowingStateLoss();

}

public void navigateToContacts() {

Log.i("TAG", "Navigate to contacts");

String tag = "contacts";

ContactsFragment contactsFragment = ContactsFragment.create();

fragmentManager.beginTransaction()

.add(contactsFragment, tag)

.addToBackStack(null)

.commitAllowingStateLoss();

}

public void navigateToChalkboard() {

Log.i("TAG", "Navigate to chalkboard");

String tag = "chalkboard";

ChalkboardFragment chalkboardFragment = ChalkboardFragment.create();

fragmentManager.beginTransaction()

.add(chalkboardFragment, tag)

.addToBackStack(null)

.commitAllowingStateLoss();

}

}

主要活动

public class MainActivity extends AppCompatActivity implements LifecycleRegistryOwner, HasSupportFragmentInjector {

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

@Inject

DispatchingAndroidInjector dispatchingAndroidInjector;

@Inject

NavigationController navigationController;

private Toolbar toolbar;

@Override

public LifecycleRegistry getLifecycle() {

return lifecycleRegistry;

}

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);

binding.setHandler(this);

binding.setManager(getSupportFragmentManager());

toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

}

@Override

public DispatchingAndroidInjector supportFragmentInjector() {

return dispatchingAndroidInjector;

}

static class ViewPagerAdapter extends FragmentPagerAdapter {

private final List mFragmentList = new ArrayList<>();

private final List mFragmentTitleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager manager) {

super(manager);

}

@Override

public Fragment getItem(int position) {

return mFragmentList.get(position);

}

@Override

public int getCount() {

return mFragmentList.size();

}

public void addFragment(Fragment fragment, String title) {

mFragmentList.add(fragment);

mFragmentTitleList.add(title);

}

@Override

public CharSequence getPageTitle(int position) {

return mFragmentTitleList.get(position);

}

}

@BindingAdapter({"handler"})

public static void bindViewPagerAdapter(final ViewPager view, final MainActivity activity) {

final ViewPagerAdapter adapter = new ViewPagerAdapter(activity.getSupportFragmentManager());

adapter.addFragment(new ChalkboardFragment(), "Chalkboard");

adapter.addFragment(new ContactsFragment(), "Contacts");

view.setAdapter(adapter);

}

@BindingAdapter({"pager"})

public static void bindViewPagerTabs(final TabLayout view, final ViewPager pagerView) {

view.setupWithViewPager(pagerView, true);

}

}

ContactActivity

public class ContactActivity extends AppCompatActivity implements LifecycleRegistryOwner, HasSupportFragmentInjector {

private final LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

@Inject

DispatchingAndroidInjector dispatchingAndroidInjector;

@Override

public LifecycleRegistry getLifecycle() {

return lifecycleRegistry;

}

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_contact);

if (savedInstanceState == null) {

}

}

@Override

public DispatchingAndroidInjector supportFragmentInjector() {

return dispatchingAndroidInjector;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值