我不斷收到此錯誤
Unhandled Exception: Invalid argument(s) (onError): The error handler of Future.then must return a value of the returned future's type
網路介面
class NetworkApi {
NetworkApi(this.url);
final String url;
Future getData() async {
http.Response response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
String data = response.body;
return jsonDecode(data);
} else {
if (kDebugMode) {
print(response.statusCode);
}
}
}
}
介面選擇器
class ApiSelector {
Future getApiData({String categoryName = ""}) async {
late NetworkApi _api;
if(categoryName != ""){
_api = NetworkApi('api');
}else{
_api = NetworkApi('myapi');
}
var Data = await _api.getData();
if (Data['status'] == 'error') {
throw'Error while fetching data';
}
return MyModel.fromJson(Data);
}
}
MyFunction 呼叫 API 選擇器
Future getDataFromApi() async {
await _apiSelector
.getApiData(categoryName: "Some Category")
.then((value) {
myModel = value as MyModel;
print(myModel);
return value;
} ,onError: (error) {
print(error);
return error;
},);
}
I have tried everything to solve this issue. May you please guide me what to do. I have even tried with exception handling but still getting this error.
uj5u.com熱心網友回復:
指定回傳型別的未來,如Future<dynamic>
網路介面
class NetworkApi {
NetworkApi(this.url);
final String url;
Future<dynamic> getData() async {
http.Response response = await http.get(Uri.parse(url));
if (response.statusCode == 200) {
String data = response.body;
return jsonDecode(data);
} else {
if (kDebugMode) {
print(response.statusCode);
}
}
}
}
介面選擇器
class ApiSelector {
Future<MyModel> getApiData({String categoryName = ""}) async {
late NetworkApi _api;
if(categoryName != ""){
_api = NetworkApi('api');
}else{
_api = NetworkApi('myapi');
}
var Data = await _api.getData();
if (Data['status'] == 'error') {
throw'Error while fetching data';
}
return MyModel.fromJson(Data);
}
}
MyFunction 呼叫 API 選擇器
Future<MyModel?> getDataFromApi() async {
try {
var value = await _apiSelector.getApiData(categoryName: "Some Category");
myModel = value as MyModel;
return myModel;
} catch(error) {
print(error);
return error;
}
}
uj5u.com熱心網友回復:
問題出在getDataFromApi:
Future getDataFromApi() async {
await _apiSelector
.getApiData(categoryName: "Some Category")
.then((value) {
myModel = value as MyModel;
print(myModel);
return value;
} ,onError: (error) {
print(error);
return error;
},);
}
正如錯誤訊息所解釋的,您的處理程式無法回傳與成功路徑onError回傳的型別相同的型別。Future.then(有關解釋,請參閱https://stackoverflow.com/a/66397222/。)這通常是編譯時錯誤,但最終會成為運行時錯誤,因為getDataFromApi它被宣告為回傳 a Future(相當于Future<dynamic>而不是Future<MyModel>.
使用帶有錯誤回呼的原始FutureAPI 直接使用是相當混亂的。您已經在使用await,因此您沒有理由使用Future.then. 使用await,您可以使用try-catch代替,這使問題更加清晰:
Future<MyModel> getDataFromApi() async {
try {
var myModel = await _apiSelector.getApiData(categoryName: "Some Category");
print(myModel);
return myModel;
} catch (error) {
print(error);
return error; // WRONG: This is not a `MyModel`!
}
}
要解決此問題,您的catch塊需要回傳 aMyModel或必須拋出例外。
uj5u.com熱心網友回復:
class ApiSelector {
Future<MyModel> getApiData({String categoryName = ""}) async {
late NetworkApi _api;
if(categoryName != ""){
_api = NetworkApi('api');
}else{
_api = NetworkApi('myapi');
}
var Data = await _api.getData();
if (Data['status'] == 'error') {
//I had to replace throw with Future.value Now All Errors are gone.
return Future.value( 'Error while fetching data');
}
return MyModel.fromJson(Data);
}
}
我希望這也能幫助將來某個時候面臨這種錯誤的其他人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/448246.html
標籤:flutter api dart exception dart-null-safety
上一篇:在Javascript/FileApi中上傳檔案時,如何檢查檔案是否具有所需的擴展名
下一篇:將物件串列作為URL引數傳遞
