如何将数据从父视图传递到子视图的 viewModel - SwiftUI?

时间:2021-07-01 06:08:19

标签: swiftui

我正在制作一个应用程序,用于在 Feedview 中显示帖子。 FeedView 有一个名为 FeedCellView 的 childView。我将每个帖子发送到相应的 FeedCellView。在 FeedCellView 中,它有 init() 函数,我正在其中初始化 ViewModel。

问题出在 SwiftUI 中,视图的 init() 调用从 1 到无穷大。因此,不确定是否会调用我的视图的 init()。至于这个,当我从不同的视图返回我的 FeedView 时,我的帖子没有更新,因为 init() 只为我调用一次。

所以我不应该将数据从视图的初始化传递到视图模型,因为它是不确定的。将数据从父视图传递到子视图模型的最佳做法是什么?

供稿视图:

struct FeedView: View {
    @ObservedObject private var feedViewModel = FeedViewModel()
    var body: some View {
        ScrollView(){
            LazyVStack(spacing:32){
                ForEach(feedViewModel.posts){post in
                    FeedCellView(viewModel: FeedCellViewModel(post: post))
                }
            }
        }
    }
}

FeedCellView:

struct FeedCellView: View {
    @ObservedObject var feedCellViewModel:FeedCellViewModel
    
    init(viewModel:FeedCellViewModel){ //This is not being called more than once.
        self.feedCellViewModel = viewModel
        print("feed Cell View Init")
    }
    
    var body: some View {
        VStack(alignment:.leading){
            
            if let user = feedCellViewModel.post.user{
                NavigationLink(
                    destination: ProfileView(user: user),
                    label: {
                        HStack{
                            if let imageUrl = feedCellViewModel.post.ownerImageUrl{
                                KFImage(URL(string: imageUrl))
                                    .resizable()
                                    .scaledToFill()
.............................
.............................

FeedCellViewModel:

class FeedCellViewModel:ObservableObject{
    @Published var post:PostModel
    
    init(post:PostModel){ 
        self.post = post
        fetchUser()
        checkLike()
    }
    
    func fetchUser(){
        print("Feed cell ViewModel fetchUser called")
        Firestore.firestore().collection("users").document(post.ownerId).getDocument { (snap, error) in
            if let error = error{
                print(error.localizedDescription)
                return
            }
            
            DispatchQueue.main.async {
                self.post.user = try? snap?.data(as: UserModel.self)
                guard let userImageUrl = self.post.user?.profileImageUrl else{return}
                self.post.ownerImageUrl = userImageUrl
                print("OwnerImageUrl \(self.post.ownerUsername): \(self.post.ownerImageUrl ?? "No Image Url")")
            }
            
        }
    }
.....................
.....................

将数据从父视图传递到子视图的 viewModel 的最佳做法是什么?

0 个答案:

没有答案