SwiftUI: Как сделать сетевой запрос после нажатия кнопки в списке (пользовательский вид строки)? - PullRequest
0 голосов
/ 15 апреля 2020

Я воссоздаю функциональность, аналогичную кнопке «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])
                    }
                }
            }
        }

    }
}

Мои вопросы отмечены в виде строк в обоих блоках кода.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...