api - 当结果 api 返回 null 或 /403/404/500/503 状态时,Flutter 在小部件中抛出消息
问题描述
我正在处理颤振项目并遇到了一个问题。当找不到数据或为空时,它会返回空白页。我希望如果结果 api 返回 null 或 /403/404/500/503 在小部件“找不到数据”中抛出消息。
// 服务/search_service.dart
class SearchService {
static Future<String> searchApi(String query) async {
String url =
"https://api.myapi.com/?c=controllersearch&m=search_api1&id=$query";
http.Response response = await http.get(Uri.encodeFull(url));
if (response.statusCode == 200) {
return response.body;
} else {
throw Exception('data not find');
}
}
}
// 我的小部件我希望如果结果 api 返回 null 或 /403/404/500/503 在小部件“找不到数据”中抛出消息。
import 'dart:convert';
import 'dart:ui' as ui;
import 'package:http/http.dart' as http;
import 'package:app/services/search_service.dart';
import 'dart:async';
class SearchPage extends StatefulWidget {
@override
_SearchPageState createState() => _SearchPageState();
}
class _SearchPageState extends State<SearchPage> {
List<dynamic> searchResults = [];
searchCodeighniterT(value) async {
SearchServicet.searchCodeighniterApiT(value).then((responseBody) {
List<dynamic> data = jsonDecode(responseBody);
setState(() {
data.forEach((value) {
searchResults.add(value);
});
});
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
locale: Locale("fr"),
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(
title: Text("search"),
backgroundColor: Color.fromRGBO(10, 158, 191, 01),
centerTitle: true,
),
body: ListView(
children: <Widget>[
Padding(
padding: const EdgeInsets.all(10.0),
child: TextFormField(
autofocus: true,
onChanged: (value) => searchCodeighniterT(value),
textAlign: TextAlign.center,
decoration: InputDecoration(
contentPadding: EdgeInsets.only(left: 25.0),
labelText: 'number',
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(4.0),
),
),
),
),
SizedBox(
height: 10.0,
),
ListView.builder(
physics: ScrollPhysics(),
shrinkWrap: true,
itemCount: searchResults.length,
itemBuilder: (BuildContext context, int index) {
return buildResultCard(context, searchResults[index]);
},
),
],
),
),
);
}
}
Widget buildResultCard(BuildContext context, data) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: Column(
children: <Widget>[
new Container(
margin: EdgeInsets.all(5.0),
child: Column(
children: <Widget>[
new Card(
color: Colors.blue[600],
shape: RoundedRectangleBorder(
side: BorderSide(color: Colors.white70, width: 1),
borderRadius: BorderRadius.circular(10),
),
margin: EdgeInsets.all(2.0),
child: Container(
//height: 100.0,
child: Column(
children: <Widget>[
ListTile(
title: Text(
data['POST_TITLE'].toString(),
textDirection: TextDirection.rtl,
style: TextStyle(fontSize: 14, color: Colors.white),
),
subtitle: Text(
data['POST_CONTENT'].toString(),
textDirection: TextDirection.rtl,
style: TextStyle(fontSize: 16, color: Colors.white),
),
),
],
),
),
),
],
),
),
],
),
);
}
解决方案
在 SizedBox 和 Listview.builder 之间
尝试这个
searchResults.length == 0?文本('错误消息'):Listview.builder
它用作 if else 条件语句。':' 是 else 语句
推荐阅读
- java - 了解为什么 Java 模式匹配缓冲 .java 文件中的错误文本?
- javascript - Angular 6 - ServiceWorker 不请求压缩内容
- python - 在热图网格中绘制具有 4 个参数的函数
- reactjs - React 和 ApolloClient:网络错误:forward(...).subscribe 不是函数
- php - PHP中的表单验证问题
- javascript - 谷歌应用脚本数组问题
- javascript - Vue Router this.$router.push 对方法不起作用
- r - 如何在R中绘制范围条?
- python - 始终打印 ] -100 之间的随机值;100 [ 作为点之前的 2 位数字和点之后的 2 位数字,python 3
- java - 在 scala 中覆盖 java 接口会产生“方法不会覆盖任何内容”。不使用覆盖会产生“范围内已定义的方法”