Я воссоздаю функциональность, аналогичную кнопке «Follow», как в Instagram. 1. Нажмите кнопку, отправьте запрос «Подписаться» или «Отписаться» и переключите состояние кнопки.
Проблема: у меня есть кнопка Follow в пользовательском представлении строки в списке, и я не могу понять, как и где сделать сетевой запрос и управлять состоянием модели.
Требуемая функциональность: 1. Пользователь нажимает «Follow» 2. Отправляет сетевой запрос «Follow» за пользователем и переключает состояние кнопки с «Follow» на «Unfollow» 3. Если произошла ошибка, верните кнопку в исходное состояние (возможно, ошибка дисплея (не критично) путем изменения модели 4. В случае успеха ничего не делать, потому что изменение состояния было выполнено оптимистично после (2)
Для простоты я упростил модели и представления. Вот что у меня есть
struct UserRowView: View {
@ObservedObject var user: User
var body: some View {
Button(action: {
// 1. The user object has an ID property, which I'll need for the network request
// 2. Do I handle state management, and send network request here? Seems strange from a List's cell.
}) {
Text(user.isFollowing ? "Unfollow" : "Follow")
}
.background(user.isFollowing ? Color.green : Color.red)
}
}
И Список ...
struct ContentView: View {
@ObservedObject var userManager = UserManager()
var body: some View {
VStack {
List() {
Section(header:
Text("USERS")
) {
ForEach(0 ..< userManager.users.count, id: \.self) {
// Do I pass a closure to UserRowView, so I can access the
// UserManager() instance? If so, how do I get the index of the
// cell containing the button?
UserRowView(user: self.userManager.users[$0])
}
}
}
}
}
}
Мои вопросы отмечены в виде строк в обоих блоках кода.
Спасибо