当结果 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)

阿里云调用 API 服务后返回啥结果

使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法

API 在 Flutter 的屏幕上返回 null

不和谐.js |如何检测 API 是不是返回 null?

Google People API 返回 Grpc 状态码 null