Как обрабатывать запросы HTTP API при быстрой навигации по страницам | ФЛАТТЕР | ДАРТ
Для моего сценария я использовал http-пакет flutter для создания http-запросов... На главном экране мне нужно отправить около 3 http-запросов, так как мне пришлось использовать запросы ожидания, которые отправляются один за другим.
Я использовал класс BaseAPiService, поэтому все вызовы API будут проходить через него,
Если я перейду в другое место, когда происходит вышеуказанный запрос, как разрушить это соединение ?? В противном случае, если после навигации приложение также ожидает завершения предыдущих запросов API.
пример используемого базового класса службы API
class ApiService {
apiGet(url, data) async {
Get.dialog(LoadingDialog());
var response;
if (data == null) {
response = await http.get(
baseUrl + url,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
);
}
Navigator.pop(Get.overlayContext);
return response;
}
apiPost(url, data) async {
FocusScopeNode currentFocus = FocusScope.of(Get.context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
}
Get.dialog(LoadingDialog());
var response;
if (data != null) {
response = await http.post(baseUrl + url,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: data);
}
if (data == null) {
response = await http.post(
baseUrl + url,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
);
}
Navigator.pop(Get.overlayContext);
return response;
}
}
2 ответа
я нашел решение
Для этого необходимо закрыть http-соединение при навигации, для этого нужно сделать клиент из http и не нужно закрывать этот клиент при методе удаления.
var client = http.Client()
var response = await client.get(url)
закрыть соединение при навигации
void dispose(){
super.dispose();
client.close()
}
Если вы глубоко погрузились в свой код и у вас нет обработчика для
http.Client
. И вы не хотите, чтобы последний ответ отображался в пользовательском интерфейсе. тогда вы можете следовать этому подходу.
Мы не можем отменить будущее в Dart, но мы можем перестать слушать поток. И вот в чем загвоздка: мы можем преобразовать Future в поток и перестать его слушать, если вы хотите отменить Future.
void main() {
// keep a reference to your stream subscription
StreamSubscription<List> dataSub;
// convert the Future returned by getData() into a Stream
dataSub = getData().asStream().listen((List data) {
updateDisplay(data);
});
// user navigated away!
dataSub.cancel();
}
взято для здесь