SwiftUI 从 ViewModel 预填充 TextField

SwiftUI pre fill TextField from ViewModel

我有一个名为 UserService 的视图模型。假设这存储了所有用户数据,并在 Firestore 中更改数据时自动更新。

然后我有一个名为 phoneTextField 视图。这用作获取用户 phone 号码的输入。

此视图也有一个 ViewModel,此 vm 包含 TextField 使用的 @Published var phone: String = "" 属性。

问题是,除了使用此 TextField 更新值外,我还希望它显示来自 UserService.[ 的当前值=28=]

我不知道如何将此数据从 UserService 传递到 TestViewModel。如果将 UserService 放入 TestViewModel,则 属性 不会实时更新,因为 SwiftUI 尚不支持 vm inside vm。现在我得到了两个独立的属性。 UserService 中的 phoneTestViewModel 中的 phone

我想过在 init() (TestViewModel) 中手动更新 phone,但我不确定这是否是正确的方法,因为我有 [以外的其他属性=13=]

我怎样才能达到这样的目的?

struct User: Identifiable, Codable {
    var phone: String
}


class UserService: ObservableObject {
    @Published var user: User?
}


struct TestView: View {
    @ObservedObject var testViewModel = TestViewModel()
    @EnvironmentObject var userService: UserService
    
    var body: some View {
        Form {
            Section(header: Text("PHONE NUMBER")) {
                TextField("Phone number", text: $testViewModel.phone)
            }
        }
    }
}


class TestViewModel: ObservableObject {
    @Published var phone: String = ""

    init() {
        prefillForm()
    }
    
    func prefillForm() {
      //
    }
    
}

一种可能的方法是在 onAppear 中初始化 vm,然后在 onChange 中同步回 userSettings,例如

Section(header: Text("PHONE NUMBER")) {
    TextField("Phone number", text: $testViewModel.phone)
        .onAppear {
            testViewModel.phone = userService.user?.phone ?? ""
        }
        .onChange(of: testViewModel.phone) { value in
            userService.user?.phone = value
        }
}