首页 > 解决方案 > 当结果 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),
                        ),
                      ),
                    ],
                  ),
                ),
              ),
            ],
          ),
        ),
      ],
    ),
  );
}

标签: apiflutterdartflutter-webflutter-test

解决方案


在 SizedBox 和 Listview.builder 之间

尝试这个

searchResults.length == 0?文本('错误消息'):Listview.builder

它用作 if else 条件语句。':' 是 else 语句


推荐阅读