PreviewProvider не работает в расширении виджетов

У меня есть это мнение

import SwiftUI

struct CurrentOrderView: View {
  let order: CurrentOrder

  var body: some View {
    VStack(alignment: .leading, spacing: 4) {
      HStack {
        Text("Order:")
        Text(order.orderId)
      }

      HStack {
        Image(uiImage: deliveryImage)
          .resizable()
          .aspectRatio(contentMode: .fit)
          .frame(width: 50.0, height: 50.0)
        Text(order.formattedDeliveryTimeString)
      }
    }
    .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .leading)
    .padding()
    .background(LinearGradient(gradient: Gradient(colors: [.orange, .yellow]), startPoint: .top, endPoint: .bottom))
  }
}

// MARK: - Private

private extension CurrentOrderView {
  private var deliveryImage: UIImage {
    switch order.status {
    case .driverOnTheWayToRestaurant:
      return UIImage(named: "pin-restaurant") ?? UIImage()
    case .driverOnTheWayToUser:
      return UIImage(named: "rider") ?? UIImage()
    }
  }
}

#if DEBUG
struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewLayout(.fixed(width: 200, height: 100))
    }
  }
}
#endif

На холсте я вижу:

введите описание изображения здесь


person Paul T.    schedule 16.12.2020    source источник


Ответы (3)


Добавьте previewContext в свой PreviewProvider

#if DEBUG
struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewContext(WidgetPreviewContext(family: .systemMedium))
    }
  }
}
#endif
person Ralph Ng    schedule 16.12.2020
comment
но я не хочу, чтобы это представление было полным размером виджета, на самом деле оно занимает только 50% виджета, что мне делать? - person Paul T.; 16.12.2020

Вместо previewLayout используйте WidgetPreviewContext

Следующее добавит предварительный просмотр для среднего виджета. .systemMedium также может быть .systemSmall и .systemLarge

#if DEBUG
struct ContentView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewContext(WidgetPreviewContext(family: .systemMedium))
    }
  }
}
#endif
person Lemon    schedule 16.12.2020
comment
но я не хочу, чтобы это представление было полноразмерным виджетом, на самом деле оно занимает только 50% виджета, что мне делать? - person Paul T.; 16.12.2020
comment
Я не понимаю, что вы имеете в виду @PaulT. - person Lemon; 16.12.2020
comment
Я имею в виду, что в моем случае CurrentOrderView должен занимать 50% ширины виджета (потому что виджет состоит из CurrentOrderView + AnotherView). Но используя ваш код, он показывает CurrentOrderView со 100% шириной - person Paul T.; 16.12.2020
comment
@PaulT. Я вижу только одно мнение в вашем вопросе - person Lemon; 16.12.2020
comment
Я понимаю, но поэтому в вопросе я выставляю размер вручную ???? - person Paul T.; 16.12.2020

Похоже, вы хотите предварительно просматривать не виджет, а просто представление.

Что вы можете сделать, так это переместить CurrentOrderView и его Entry в другой файл.

Затем добавьте этот файл в основную цель приложения (кроме цели виджета).

Также не забудьте переименовать структуру превью, чтобы имя отличалось от автоматически созданного ContentView_Previews превью.

Таким образом, ваши превью будут работать должным образом:

struct CurrentOrderView_Previews: PreviewProvider {
  static var previews: some View {
    Group {
      CurrentOrderView(
        order: CurrentOrderEntryPlaceholderBuilder()
          .entry(with: .snapshot).order
      )
      .previewLayout(.fixed(width: 200, height: 100))
    }
  }
}
person pawello2222    schedule 16.12.2020
comment
это было многообещающе, но не работает take.ms/bFBQv - person Paul T.; 16.12.2020
comment
А можно попробовать сменить имя ContentView_Previews? - person pawello2222; 16.12.2020