SwiftUI - Mocking @EnvironmentObject данные в предварительном просмотре - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть этот код:

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())
    }
}

Чего я хочу добиться, чтобы все мои компоненты пользовательского интерфейса использовали фиктивные данные. Мне нужно как-то сказать, что в предпросмотре я хотел бы видеть Text(userService.user.username) как Text("Alex") например. Как я могу заставить это работать? Где мне нужно инициализировать мой user.username и где поставить этот макет. Я просто хочу использовать объект user для всех моих просмотров. Я просто пропустил их для этого примера.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Предполагая, что 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)
    }
}
1 голос
/ 21 апреля 2020

Вы можете вставить макетные данные на уровне обслуживания или на уровне просмотра. Поскольку вы будете использовать это в нескольких представлениях, я бы рекомендовал добавить в сервис возможность макета (как в первом примере ниже).

Я не знаю, как выглядит ваш UserService В эти примеры я добавил базовую c реализацию.

Уровень обслуживания

import SwiftUI

struct User {
    var username: String
}

class UserService: ObservableObject {
    @Published var user: User = User(username: "Initial username")

    // If a mock user is provided to the UserService it will replace the initial user.
    init(mockUser: User? = nil) {
        if let user = mockUser {
            self.user = user
        }
    }
}

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(mockUser: User(username: "Test username")))
    }
}

Уровень просмотра

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())
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...