当结果 api 返回 null 或 /403/404/500/503 状态时,Flutter 在小部件中抛出消息
Posted
技术标签:
【中文标题】当结果 api 返回 null 或 /403/404/500/503 状态时,Flutter 在小部件中抛出消息【英文标题】:Flutter throw message in widget when the result api return null or / 403/404/500/503 staut 【发布时间】:2021-02-14 08:16:36 【问题描述】:我正在做颤振项目,遇到了一个问题。当数据未找到或为空时,它会返回空白页。我希望如果结果 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),
),
),
],
),
),
),
],
),
),
],
),
);
【问题讨论】:
【参考方案1】:在 SizedBox 和 Listview.builder 之间
试试这个
searchResults.length == 0? 文本('错误信息') : Listview.builder
它用作 if else 条件语句。 ':' 是 else 语句
【讨论】:
感谢您花时间回答我的问题,这不是我要寻找的解决方案,但我会说我可以在等待找到我正在寻找的解决方案时使用此方法因为,再次非常感谢你以上是关于当结果 api 返回 null 或 /403/404/500/503 状态时,Flutter 在小部件中抛出消息的主要内容,如果未能解决你的问题,请参考以下文章
当 API 返回空数据时显示警告(Vue.js / Axios)