Swiftui @ObServable не всегда обновляет просмотрIOS

Программируем под IOS
Ответить
Anonymous
 Swiftui @ObServable не всегда обновляет просмотр

Сообщение Anonymous »

Я постепенно схожу с ума, потому что мое мнение не всегда обновляется, и я не могу понять, что вызывает проблему. Я добавил @mainactor для сетевых вызовов. Вид Picker on CreateInvoiceDetails пуст и не показывает валюты на первом виде. Это происходит ~ 90% случаев. Но если я вернусь и вернусь к экрану, он правильно отображается. Это не происходит только с массивами, это происходит с чистыми струнами.struct HomeScreen: View {
var createInvoiceViewmodel = CreateInvoiceViewModel()

var body: some View {
VStack {
Button {
createInvoiceViewmodel.navPub.send(.createInvoiceGoTo(.details))
} label: {
Text("New Invoice")
.style(.labelMedium)
}
}
.navigationDestination(for: CreateInvoiceFlow.self) { screen in
switch screen {
case .details:
CreateInvoiceDetails(viewModel: createInvoiceViewmodel)
}
}
}
< /code>
В CreateInvoiceedEtails я попытался сделать сетевой вызов в моем представлении или в задаче. Ни один из подходов не работает последовательно. < /P>
struct CreateInvoiceDetails2: View {
@Bindable var viewModel: CreateInvoiceViewModel

var body: some View {
VStack {
Text(viewModel.selectedCurrency?.name ?? "-")
Picker(selection: $viewModel.selectedCurrency) {
ForEach(viewModel.currencies) { c in
Text(c.name)
.tag(c)
}
} label:{
Text("")
}
}
.task {
await viewModel.getConstants()
}
// .onAppear {
// Task {
// await viewModel.getConstants()
// }
// }
}
}
< /code>
Сетевой вызов успешно, всегда возвращает один и тот же результат, и оператор печати работает всегда. < /p>
@Observable
class CreateInvoiceViewModel: BaseViewModel {
var selectedCurrency: Currency?
var currencies: [Currency] = []

@MainActor
func getConstants() async {
loadingState = .getConstants
let response = await repository.getConstants()
switch response {
case .result(let everyResponse):
guard let c = everyResponse.data?.currencies
.map({ $0.value})
else { return }
currencies.removeAll()
currencies.append(contentsOf: c)
// currencies = c. // also not working
print("DEBUGPRINT: currencies: ", c)
selectedCurrency = c.first
}
loadingState = .no
}
}

@Observable
class BaseViewModel {
var loadingState: LoadingState = .no

let repository = AppRepository.shared

var navPub = PassthroughSubject()
}
< /code>
Модель валюты: < /p>
struct Currency: Decodable, Hashable, Identifiable, Equatable {
let symbol: String
let name: String
let code: String

var id: String {
code
}
}
< /code>
Но мое представление не обновляется каждый раз. В основном в первый раз, когда я запускаю его.
является надежным @ObServable, или я должен вернуться назад и использовать наблюдательный и @published? < /P>

Подробнее здесь: https://stackoverflow.com/questions/796 ... ating-view
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»