ivlevAstef / DITranquillity

Dependency injection for iOS (Swift)
MIT License
421 stars 32 forks source link

Падает на @State в SwiftUI #157

Closed kocherovets closed 3 years ago

kocherovets commented 3 years ago

Добрый день!

Я добавляю в свою библиотеку поддержку SwiftUI, для DI использую DITranquality. @ObservedObject работает, а при добавлении @State падает с ошибкой проверки графа error: Invalid reference from <Component. type: TestView; path: TestView.swift:67> because not found component for type: Int Fatal error: invalid graph: file Не пойму в чем дело.

ivlevAstef commented 3 years ago

Здравствуйте. Ошибка говорит, что вы пытаетесь внедрить "Int" в TestView. Предположительно в коде это выглядит так:

struct TestView: View {
   @State var value: Int = 0
}
...
container.register(TestView.init)
  .injection(\.value)

Но value является переменной типа Int, который я сильно сомневаюсь, что зарегистрирован в контейнере (покрайней менее это былобы странно). Так как внедрить переменную нельзя, то библиотека сообщает о том, что внедрение не возможно, и надо или убрать внедрение, или зарегистрировать его.

kocherovets commented 3 years ago

Там в вопросе есть ссылка на проблемный код. Дело в том, что @State в SwiftUI - это стандартная обертка для данных, обрабатываемых View. И не всегда нужно их обрабатывать с помощью DI, во всяком случае это может быть неудобно. Можно ли как-то отключить DI для некоторых таких полей?

ivlevAstef commented 3 years ago

DI тут не причем. посмотрите на метод инициализации TestView. У него их по факту два:

TestView.init(presenter: )
TestView.init(presenter: , a: )

Не знаю по какой логике Swift решает что нужно использовать второй, но по умолчанию он выбирает его (в старых версиях swift обычно ругался, что много вариантов, ну или это особенность swiftUI). В общем проблему решить можно, указав явно что нужно использовать для инициализации:

container.register(TestView.init(presenter:))
// или
container.register { TestView(presenter: $0) }
kocherovets commented 3 years ago

Понял, спасибо. Отличная библиотека)