我正在處理 api 的錯誤處理。我希望如果 api 崩潰,那么它會在 UI 中顯示“服務器已關閉”這樣的訊息。
我創建了一個類,我在其中創建 api 的getBooks方法,如果我修改了方法,api url那么它正在列印這個Exception,我希望它在 UI 中。問題是getBooks回傳型別是List<Book>>這樣我們不能回傳這個例外,有什么解決辦法嗎?
Exception
E/flutter (12924): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Exception
這是我的 api 代碼
class BooksApi {
static Future<List<Book>> getBooks(String query) async {
try {
final url = Uri.parse(
'https://gist.githubusercontent.com/JohannesMilke/d53fbbe9a1b7e7ca2645db13b995dc6f/raw/eace0e20f86cdde3352b2d92f699b6e9dedd8c70/books.json');
final response = await http.get(url);
if (response.statusCode == 200) {
final List books = json.decode(response.body);
return books.map((json) => Book.fromJson(json)).where((book) {
final titleLower = book.title.toLowerCase();
final authorLower = book.author.toLowerCase();
final searchLower = query.toLowerCase();
return titleLower.contains(searchLower) ||
authorLower.contains(searchLower);
}).toList();
} else {
throw Exception;
}
} catch (e) {
print("e");
print(e);
}
throw Exception;
}
}
并稱之為
Future init() async {
setState(() {
isLoading = true;
});
var books = await BooksApi.getBooks(query); //this
var response = await obj.getProduct();
print(response);
setState(() => this.books = books);
setState(() {
isLoading = false;
});
}
uj5u.com熱心網友回復:
您可以使用then和處理錯誤onError:
await BooksApi.getBooks(query).then((books) async {
setState(() => {
this.books = books;
this.isLoading = false;
})
}, one rror: (error) {
// do something with error
});
或一個簡單的 try-catch(您可以像在同步代碼中一樣撰寫 try-catch 子句)。
請參閱處理錯誤。
您還可以使用catchError不使用的 id async/ await:
BooksApi.getBooks(query).then((books) {
setState(() => {
this.books = books;
this.isLoading = false;
})
}).catchError((error, stackTrace) {
print("error is: $error");
});
請參閱期貨錯誤處理。
uj5u.com熱心網友回復:
嘗試使用 try 和 catch 包裝 'var books = await BooksApi.getBooks(query)'。
...
try {
var books = await BooksApi.getBooks(query);
} catch (e) {
// To do for UI
}
...
uj5u.com熱心網友回復:
對于 api,你需要做這樣的事情:
APIModel{
final int code;
// or a success flag
// final bool success;
final String message;
final List<Book> data;
APIModel({this.code,this.message,this.data});
}
這意味著,每個 api 都有自己的code, message, 和data歸檔。
當您提出要求時,您可以檢查您的code或success:
var response = await request(params);
isLoading = false;
if(response.code == 0){}
// or
if(response.success){
// do what you want
}
else {
Toast.show(response.message);
}
您可以使用build_runner和json_serializable。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/355068.html
上一篇:Flutter-如何從sharedPreferences檢查字串值
下一篇:引數型別'List<Todolist>?Function(QuerySnapshot<Object?>)'不能分配給引數型別'List<To
