SwiftUI-在预览中模拟@EnvironmentObject数据
我有以下代码:SwiftUI-在预览中模拟@EnvironmentObject数据,swift,mocking,swiftui,Swift,Mocking,Swiftui,我有以下代码: struct WelcomeView: View { @EnvironmentObject var userService: UserService var body: some View { Text(userService.user.username) } } struct WelcomeView_Previews: PreviewProvider { static var previews: some View {
struct WelcomeView: View {
@EnvironmentObject var userService: UserService
var body: some View {
Text(userService.user.username)
}
}
struct WelcomeView_Previews: PreviewProvider {
static var previews: some View {
WelcomeView().environmentObject(UserService())
}
}
我想要实现的是,我的所有UI组件都使用模拟数据。我需要告诉大家,在预览中,我希望看到
文本(userService.user.username)
作为文本(“Alex”)
。我怎样才能让它工作?我需要在哪里初始化我的user.username
以及在哪里放置此模拟。我只想对所有视图使用user
对象。在本例中,我跳过了它们。您可以在服务级别或视图级别插入模拟数据。由于您将在多个视图中使用此功能,因此我建议将模拟功能添加到服务中(如下面的第一个示例所示)
我不知道您的UserService
是什么样子,所以我在这些示例中添加了一个基本实现
服务水平
视图级别
假设
UserService
使用依赖项注入进行了正确的设计,那么它可以在生产代码中进行任何显式更改时使用以下方法
struct WelcomeView_Previews: PreviewProvider {
static var previews: some View {
let userService = UserService()
userService.user = User(username: "Alex", email: "alex@test.com") // << any predefined set up here
// any more parameters set up here
return WelcomeView().environmentObject(userService)
}
}
struct WelcomeView\u预览:预览提供程序{
静态var预览:一些视图{
让userService=userService()
userService.user=用户(用户名:“Alex”,电子邮件:alex@test.com") //
import SwiftUI
struct User {
var username: String
}
class UserService: ObservableObject {
@Published var user: User = User(username: "Initial username")
}
struct WelcomeView: View {
@EnvironmentObject var userService: UserService
// Optional mock user. Will replace the user from UserService if provided.
var mockUser: User? = nil
var body: some View {
Text((mockUser != nil) ? mockUser!.username : userService.user.username)
}
}
struct WelcomeView_Previews: PreviewProvider {
static var previews: some View {
WelcomeView(mockUser: User(username: "Test username"))
.environmentObject(UserService())
}
}
struct WelcomeView_Previews: PreviewProvider {
static var previews: some View {
let userService = UserService()
userService.user = User(username: "Alex", email: "alex@test.com") // << any predefined set up here
// any more parameters set up here
return WelcomeView().environmentObject(userService)
}
}