needle icon indicating copy to clipboard operation
needle copied to clipboard

How to pass values in Views in SwiftUI

Open MaksimBezdrobnoi opened this issue 2 years ago • 2 comments

How you pass values from view to another view in needle? In your examples you use dependency ViewModel, but what if I need to pass some value to init ViewModel? How to do that?

MaksimBezdrobnoi avatar Jan 28 '23 14:01 MaksimBezdrobnoi

Could you clarify your question with an example(s)?

bohdansasko avatar Mar 31 '23 19:03 bohdansasko

struct AddressesView<ViewModel>: View where ViewModel: AddressesViewModelProtocol {
    @ObservedObject var viewModel: ViewModel

    var detailBuilder: AddressDetailBuilder
    
    var body: some View {
        NavigationView {
            List(viewModel.addresses) { address in
                NavigationLink(destination: detailBuilder.addressDetailView) {
                    AddressRow(address: address)
                }
            }
            .navigationTitle("Address List")
        }
    }
}

Maybe it is meant like this. How would you pass the selected address down the line here to AddressDetailView ? Of course you can keep it somewhere globally or in shared instances, but for cases like this it seems to be a bit over the top. So is there any way to pass values ?

Maybe like this ?

import NeedleFoundation
import SwiftUI

protocol AddressDetailDependency: Dependency {
    var addressRepository: AddressRepository { get }
}

class AddressDetailComponent: Component<AddressDetailDependency>, AddressDetailBuilder {
    
    func addressDetailViewModel(selectedId: UUID) -> AddressDetailViewModel {
        AddressDetailViewModel(repository: dependency.addressRepository, selectedId: selectedId)
    }
    
    func addressDetailView(selectedId: UUID) -> AnyView {
        AnyView(
            AddressDetailView(viewModel: addressDetailViewModel(selectedId: selectedId))
        )
    }
}

protocol AddressDetailBuilder {
    func addressDetailView(selectedId: UUID) -> AnyView
}

MarcelDerks avatar Nov 30 '23 14:11 MarcelDerks