首页 > 解决方案 > 如何在 Flutter 中的 Text 小部件中打印 api SocketException 错误

问题描述

我正在处理 api 的错误处理,我希望当互联网不工作时,它会在文本小部件中显示 SocketExpcetion 消息,它在控制台中打印但无法在文本小部件中显示它,这是我的代码

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;
      }
    } on SocketException {
      print("No Internet connection ");
    }
    throw Exception;
  }
}

我创建了一个init()获取 api 数据的方法,并在 initState() 和未来的构建器中调用它


Future init() async {
    setState(() {
      isLoading = true;
    });
    final books = await BooksApi.getBooks(query);

    setState(() => this.books = books);
    setState(() {
      isLoading = false;
    });
  }
 @override
  void initState() {
    super.initState();
    // handleInternetConnection();
    init();
  }


Expanded(
              child: FutureBuilder(
                  future: init(),
                  builder: (BuildContext context, snapshot) {
                    return ListView.builder(
                        itemCount: books.length,
                        itemBuilder: (context, index) {
                          if (snapshot.hasError) {
                            print("not connected run");   //here i'm trying to call it
                            return Center(
                              child: Text("No internet connection!"),
                            );
                          } else {
                            final book = books[index];
                            return Column(
                              children: [
                                InkWell(
                                  child:ListTile(
                                      dense: true,
                                      leading: SizedBox(
                                        child: ClipRRect(
                                          borderRadius:
                                              BorderRadius.circular(10.0),
                                          child: Image.network(
                                            book.urlImage,
                                            fit: BoxFit.cover,
                                          ),
                                        ),
                                      ),

请帮助如何做到这一点。

标签: flutterflutter-futurebuilder

解决方案


推荐阅读