Size: a a a

Moxy – MVP библиотека под Android

2020 August 11

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Anatoliy Kernokus
У меня логика как-то по-другому работает.зачем через конструктор если можно сразу в поля презентера.
Инжект в поля - это вынужденный костыль, который мы применяем в Андроид, чтобы предоставить зависимости объектам, жизненным циклом которых мы не управляем. Он плох по трём причинам.
1) Объект становится мутабельным. Инициализация объекта разделяется на 2 части: создать объект, и засетить все зависимости в нужные поля. Можно что-то забыть, можно обратиться к полю до его инициализации.
2) Вы вынуждены использовать DI-фреймворк для создания объекта, или руками сетить ему зависимости.
3) Список внешинх зависимостей объекта неочевиднен, и смешивается с внутренним приватным состоянием объекта.

Конструктор - наш бро испокон веков. По тем же критериям:
1) Создал объект - и он сразу готов к использованию. Зависимость нельзя "перезатереть" после создания объекта, снаружи её вообще не достать.
2) Берёшь и вызываешь конструктор где хочешь - в тестах, в коде, и никаких проблем.
3) Чёткий список зависимостей, без которых объект в принципе нельзя создать.

Всегда, когда есть возможность, нужно использовать инъекцию в конструктор, а не в поля. "Экономия" на параметрах конструктора делает ваш код менее понятным и более подверженным ошибкам. А если параметров оказывается ну очень уж много, это признак того, что объект надо декомпозировать, или наоборот композировать его зависимости в более самостоятельные сущности.

Поэтому не надо делать Presenter AndroidEntryPonit-ом :)

Надеюсь, ответил. На тему "почему инжект в поля зло" много статей, советую ознакомиться.
источник

AK

Anatoliy Kernokus in Moxy – MVP библиотека под Android
Алексей Ершов
Инжект в поля - это вынужденный костыль, который мы применяем в Андроид, чтобы предоставить зависимости объектам, жизненным циклом которых мы не управляем. Он плох по трём причинам.
1) Объект становится мутабельным. Инициализация объекта разделяется на 2 части: создать объект, и засетить все зависимости в нужные поля. Можно что-то забыть, можно обратиться к полю до его инициализации.
2) Вы вынуждены использовать DI-фреймворк для создания объекта, или руками сетить ему зависимости.
3) Список внешинх зависимостей объекта неочевиднен, и смешивается с внутренним приватным состоянием объекта.

Конструктор - наш бро испокон веков. По тем же критериям:
1) Создал объект - и он сразу готов к использованию. Зависимость нельзя "перезатереть" после создания объекта, снаружи её вообще не достать.
2) Берёшь и вызываешь конструктор где хочешь - в тестах, в коде, и никаких проблем.
3) Чёткий список зависимостей, без которых объект в принципе нельзя создать.

Всегда, когда есть возможность, нужно использовать инъекцию в конструктор, а не в поля. "Экономия" на параметрах конструктора делает ваш код менее понятным и более подверженным ошибкам. А если параметров оказывается ну очень уж много, это признак того, что объект надо декомпозировать, или наоборот композировать его зависимости в более самостоятельные сущности.

Поэтому не надо делать Presenter AndroidEntryPonit-ом :)

Надеюсь, ответил. На тему "почему инжект в поля зло" много статей, советую ознакомиться.
отчасти ответили,спасибо. Но всё равно осталось немного непонятно,почему нельзя сразу сделать inject в поля presenter-а
источник

P

Pavel in Moxy – MVP библиотека под Android
Потому что инжектить в конструктор - чище. Эти поля можно сделать приватными.
Если инжектить в поля презентера, то эти поля будут не приватными и надо будет ещё и явно инжектить.
источник

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Anatoliy Kernokus
отчасти ответили,спасибо. Но всё равно осталось немного непонятно,почему нельзя сразу сделать inject в поля presenter-а
Можно, просто широко принято, что это плохая практика, по  причинам, которые я описал. Попробуйте, поработайте, поделитесь впечатлениями)
источник

AK

Anatoliy Kernokus in Moxy – MVP библиотека под Android
Алексей Ершов
Можно, просто широко принято, что это плохая практика, по  причинам, которые я описал. Попробуйте, поработайте, поделитесь впечатлениями)
понял,спасибо за развернутый ответ
источник

V

Veniamin in Moxy – MVP библиотека под Android
Всем привет, почитав README, я так понимаю, что использовать @InjectViewState теперь не обязательно?
источник

NI

Nikita Ilyasov in Moxy – MVP библиотека под Android
Veniamin
Всем привет, почитав README, я так понимаю, что использовать @InjectViewState теперь не обязательно?
в актуальной версии библиотеки можно не использовать эту аннотацию)
источник

V

Veniamin in Moxy – MVP библиотека под Android
Nikita Ilyasov
в актуальной версии библиотеки можно не использовать эту аннотацию)
Спасибо
источник
2020 August 13

A

Anvar in Moxy – MVP библиотека под Android
Hi everybody, I have a #question. When I copy and pass the my BasicView and create presenter android gives a error like this.
error: MainVisitorFragmentView$$State is not abstract and does not override abstract method showErrorDialogWithErrorCode(int,ErrorDialogResponseType) in MainVisitorFragmentView
public class MainVisitorFragmentView$$State extends MvpViewState<MainVisitorFragmentView> implements MainVisitorFragmentView {
источник

MM

Mikhail Mustakimov in Moxy – MVP библиотека под Android
Anvar
Hi everybody, I have a #question. When I copy and pass the my BasicView and create presenter android gives a error like this.
error: MainVisitorFragmentView$$State is not abstract and does not override abstract method showErrorDialogWithErrorCode(int,ErrorDialogResponseType) in MainVisitorFragmentView
public class MainVisitorFragmentView$$State extends MvpViewState<MainVisitorFragmentView> implements MainVisitorFragmentView {
Have you tried to clean and rebuild project?
источник

A

Anvar in Moxy – MVP библиотека под Android
Anvar
Hi everybody, I have a #question. When I copy and pass the my BasicView and create presenter android gives a error like this.
error: MainVisitorFragmentView$$State is not abstract and does not override abstract method showErrorDialogWithErrorCode(int,ErrorDialogResponseType) in MainVisitorFragmentView
public class MainVisitorFragmentView$$State extends MvpViewState<MainVisitorFragmentView> implements MainVisitorFragmentView {
источник

A

Anvar in Moxy – MVP библиотека под Android
Mikhail Mustakimov
Have you tried to clean and rebuild project?
Yes, I tried but it gives same issue
источник

MM

Mikhail Mustakimov in Moxy – MVP библиотека под Android
Can you share your presenter, view and fragment code via gist?
источник

A

Anvar in Moxy – MVP библиотека под Android
interface MainVisitorFragmentView : MvpView {

   @StateStrategyType(AddToEndSingleStrategy::class)
   fun showProgressBar()

   @StateStrategyType(AddToEndSingleStrategy::class)
   fun hideProgressBar()


   @StateStrategyType(SingleStateStrategy::class)
   fun showErrorDialogWithErrorText(errorText: ErrorResponse, type: ErrorDialogResponseType)

   @StateStrategyType(SingleStateStrategy::class)
   fun showErrorDialogWithErrorCode(stringId: Int, type: ErrorDialogResponseType)

   @StateStrategyType(AddToEndSingleStrategy::class)
   fun setToast(text:String)
}
источник

A

Anvar in Moxy – MVP библиотека под Android
@InjectViewState
class MainVisitorFragmentPresenter: MvpPresenter<MainVisitorFragmentView>() {


   @Inject
   lateinit var mApiManager: ApiManager

   @Inject
   lateinit var mSharedPreferenceHelper: SharedPreferenceHelper


   @Inject
   lateinit var mDBController: DBController


   private var mView: MainVisitorFragmentView


   private var mDisposables = Disposables.disposed()

   private var mInProgress = false

   init {
       injectData()
       mView = viewState
   }


   private fun injectData() {
       App.mApplicationComponent.inject(this)
   }
}
источник

MM

Mikhail Mustakimov in Moxy – MVP библиотека под Android
источник

A

Anvar in Moxy – MVP библиотека под Android
I have not put it yet
источник

MM

Mikhail Mustakimov in Moxy – MVP библиотека под Android
OK, are there any packages with capital letters? E.g. com.example.Trololo.presenter
источник

A

Anvar in Moxy – MVP библиотека под Android
Mikhail Mustakimov
OK, are there any packages with capital letters? E.g. com.example.Trololo.presenter
No, all packages names are lower case. I think, this error upper after the copying and passing the View that is my old one
источник
2020 August 14

АЕ

Алексей Ершов... in Moxy – MVP библиотека под Android
Anvar
Hi everybody, I have a #question. When I copy and pass the my BasicView and create presenter android gives a error like this.
error: MainVisitorFragmentView$$State is not abstract and does not override abstract method showErrorDialogWithErrorCode(int,ErrorDialogResponseType) in MainVisitorFragmentView
public class MainVisitorFragmentView$$State extends MvpViewState<MainVisitorFragmentView> implements MainVisitorFragmentView {
Please make a Gist of it, or a sample project, create an issue on Github, and I'll try to reproduce and fix it.
источник