Arello-Mobile / Moxy

Moxy is MVP library for Android

Home Page:https://github.com/Arello-Mobile/Moxy/wiki

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Ошибка сборки кастомного Presenter

JorikFat opened this issue · comments

Осваиваю эту библиотеку и пробую сделать кастомный Presenter
Presenter:

    @InjectViewState
    public class MainPresenter extends MvpPresenter<MainView> {
    DbHandler dbHandler;

    public MainPresenter(DbHandler dbHandler) {
        this.dbHandler = dbHandler;
    }

Activity:

public class MainActivity extends MvpAppCompatActivity implements MainView {

    private Button timeStamp;
    private RecyclerView listTimestamp;
    private TimeStampAdapterRV adapterRV;
    private DbHandler dbHandler = new DbHandler(this);

    @InjectPresenter MainPresenter presenter;

    @ProvidePresenter
    MainPresenter createMainPresenter(DbHandler handler){
        return new MainPresenter(handler);
    }

Получаю ошибку:

error: method createMainPresenter in class MainActivity cannot be applied to given types;
required: DbHandler
found: no arguments
reason: actual and formal argument lists differ in length

А ошибка прям в таком формате и выводится? И это вы делаете обычный run?

Ошибку исправил (первая строка затерлась форматированием)
Эту ошибку получаю при build'е проекта.
Делал Rebuil и Clear Cache - не помогает

А, всё, вижу в чём проблема.

Наводящий вопрос должен тебе помочь - откуда мокси, при вызове метода createMainPresenter узнает, какой handler передать?

Тебе нужно просто изменить вот так:

 @ProvidePresenter
MainPresenter createMainPresenter(DbHandler handler){
    return new MainPresenter(handler);
}

Но тут у тебя есть большая проблема: презентре будет хранить ссылку на DbHandler, который видимо хранит ссылку на Activity. Поэтому лучше ходи презентером в какой-нибудь синглтон и запрашивай у него DbHandler. Так не будет утечки памяти. Или в DbHandler ты в результате берешь контекст прилжоения? (но это всё равно, потому что в таком виде не красиво).

Опечатку с dbHandler/handler я убрал. Результаты не поменялись.

P.S. по архитектуре:
Я понимаю что сейчас все выглядит не стройно и будут подводные камни.
Хочу поэтапно решать проблемы. Сначала Presenter потом di
P.P.S.
Проект: TimeStamp
Ветка: PresenterIssue

Я не праильно написал %)

Надо вот так изменить:

MainPresenter createMainPresenter(){
    return new MainPresenter(handler);
}```

Т.е. метод createMainPresenter ничего не должен получать на вход

Спасибо БОЛЬШОЕ!
Не заметил этой особенности в примере в Вашей документации.