2017-07-01 174 views
0

我可以注射我的主持人在片段上的問題,我不知道爲什麼,我想我做的一切都正確,我有點絕望。注射主持人 - 匕首2

誤差如下:

Error:(20, 10) error: com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenterImpl cannot be provided without an @Inject constructor or from an @Provides-annotated method. This type supports members injection but cannot be implicitly provided. 
com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenterImpl is injected at 
com.drivero.locationreminder.infrastructure.di.module.PresenterModule.provideReminderListPresenter(presenter) 
com.drivero.locationreminder.presentation.main.presenter.ReminderListPresenter is injected at 
com.drivero.locationreminder.presentation.main.fragment.ReminderListFragment.presenter 
com.drivero.locationreminder.presentation.main.fragment.ReminderListFragment is injected at 
com.drivero.locationreminder.infrastructure.di.component.ViewComponent.inject(reminderListFragment) 

這是我的組件:

@ViewScope 
@Component(dependencies = ApplicationComponent.class, 
     modules = {ViewModule.class, PresenterModule.class}) 
public interface ViewComponent { 

    void inject(MainActivity mainActivity); 

    void inject(ReminderListFragment reminderListFragment); 
} 

這是我的模塊:

@Module 
public class ViewModule { 
    private Activity activity; 
    private Fragment fragment; 

    public ViewModule(Activity activity) { 
     this.activity = activity; 
    } 

    public ViewModule(Fragment fragment) { 
     this.fragment = fragment; 
    } 

    @Provides 
    @ViewScope 
    Context context() { 
     return activity; 
    } 

    @Provides 
    @ViewScope 
    Activity activity() { 
     return activity; 
    } 

    @Provides 
    @ViewScope 
    Fragment fragment() { 
     return fragment; 
    } 

    @Provides 
    @ViewScope 
    Navigator navigator() { 
     return new Navigator(activity); 
    } 

} 

@Module 
public class PresenterModule { 

    @Provides 
    @ViewScope 
    ReminderListPresenter provideReminderListPresenter(ReminderListPresenterImpl presenter) { 
     return presenter; 
    } 

} 

這是我的演示:

public interface ReminderListPresenter extends Presenter<ReminderListView> { 

    void onClickCreate(); 
} 

public class ReminderListPresenterImpl extends BasePresenter<ReminderListView> implements ReminderListPresenter { 

    @Override 
    public void initialize(ReminderListView view) { 
     super.initialize(view); 
    } 

    @Override 
    public void onClickCreate() { 
     navigator.goToCreateReminder(); 
    } 
} 

我的片段:

@ViewScope 
public class ReminderListFragment extends BaseFragment implements ReminderListView { 

    @BindView(R.id.reminderList) 
    private RecyclerView reminderList; 
    @BindView(R.id.floatingActionButton) 
    private FloatingActionButton createReminderButton; 

    @Inject 
    ReminderListPresenter presenter; 

    public static Fragment getNewInstance() { 
     return new ReminderListFragment(); 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     presenter.initialize(this); 
    } 

    @Override 
    public int getLayoutContainer() { 
     return R.layout.fragment_reminder_list; 
    } 

    @Override 
    public void initializeInjector() { 
     buildInjector(new ViewModule(this)).inject(this); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
    } 
} 

任何建議,歡迎!

回答

1

您正在嘗試注入RemainderListPresenterImpl。這意味着模塊中的某些函數必須提供RemainderListPresenterImpl,否則RemainderListPresenterImpl必須具有標記爲@Inject的構造函數。否則,它不知道如何構建一個注入它。這可以像0參數構造函數一樣簡單,沒有標記爲@Inject的主體。