Я постепенно схожу с ума, потому что мое мнение не всегда обновляется, и я не могу понять, что вызывает проблему. Я добавил @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
Swiftui @ObServable не всегда обновляет просмотр ⇐ IOS
Программируем под IOS
-
Anonymous
1748428410
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>
Подробнее здесь: [url]https://stackoverflow.com/questions/79641205/swiftui-observable-not-always-updating-view[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия