如何在快速浏览页面的同时处理 HTTP api 请求 |飘动 |镖
How to handle HTTP api request while navigating pages quickly | FLUTTER | DART
对于我的场景,我使用了 flutter http 包来发出 http 请求...在主屏幕中我必须发送大约 3 个 http 请求,因为我不得不使用 await 请求一个接一个地发送。
我使用了 BaseAPIService class 所以所有 api 调用都会通过它,
如果我在发生上述请求时导航到另一个地方,如何破坏该连接??否则,如果在导航之后应用程序也在等待之前的 Api 请求完成..
样本库api 使用的服务class
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;
}
}
我找到了解决方案
要实现这一点,需要在导航时关闭 http 连接,因为这样做需要从 http 创建一个客户端,并且不需要在 dispose 方法上关闭该客户端
var client = http.Client()
var response = await client.get(url)
导航时关闭连接
void dispose(){
super.dispose();
client.close()
}
如果您深入研究代码并且没有 http.Client
的任何处理程序。而且您不希望 UI 上显示最新的响应。那么你可以按照这个方法。
我们无法取消 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();
}
已参加 here
对于我的场景,我使用了 flutter http 包来发出 http 请求...在主屏幕中我必须发送大约 3 个 http 请求,因为我不得不使用 await 请求一个接一个地发送。
我使用了 BaseAPIService class 所以所有 api 调用都会通过它,
如果我在发生上述请求时导航到另一个地方,如何破坏该连接??否则,如果在导航之后应用程序也在等待之前的 Api 请求完成..
样本库api 使用的服务class
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;
}
}
我找到了解决方案
要实现这一点,需要在导航时关闭 http 连接,因为这样做需要从 http 创建一个客户端,并且不需要在 dispose 方法上关闭该客户端
var client = http.Client()
var response = await client.get(url)
导航时关闭连接
void dispose(){
super.dispose();
client.close()
}
如果您深入研究代码并且没有 http.Client
的任何处理程序。而且您不希望 UI 上显示最新的响应。那么你可以按照这个方法。
我们无法取消 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();
}
已参加 here