• Топік для порад початківцям і не тільки — 2

    Добрый день! Изучаю Flutter, создаю приложение на основе Google Books API. Застрял на одном моменте, не могу найти решение. Почему всегда snapshot.data всегда null, хотя в консоле всегда приходит ответ с сервера. Спасибо всем большое за ответ!!!!

    import 'dart:developer';
    
    import 'package:flutter/material.dart';
    import 'package:google_books/api/books_api.dart';
    import 'package:google_books/models/books_model.dart';
    import 'package:google_books/screens/books_search.dart';
    import 'package:google_books/screens/list_books_view.dart';
    
    class BooksScreen extends StatefulWidget {
      const BooksScreen({Key? key}) : super(key: key);
    
      @override
      _BooksScreenState createState() => _BooksScreenState();
    }
    
    class _BooksScreenState extends State<BooksScreen> {
      Future<BooksModel>? booksObject;
      String? _bookName;
    
      @override
      void initState() {
        super.initState();
        _bookName ??= 'Кобзар';
        booksObject = BooksApi().fetchBooks(_bookName!);
      }
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            backgroundColor: Colors.brown,
            title: const Text('Google Books'),
            centerTitle: true,
            leading: IconButton(
              icon: const Icon(Icons.search),
              onPressed: () async {
                var tappedName = await Navigator.push(context,
                    MaterialPageRoute(builder: (context) {
                  return const BooksSearch();
                }));
    
                if (tappedName != null) {
                  setState(() {
                    _bookName = tappedName;
                    booksObject = BooksApi().fetchBooks(_bookName!);
                  });
                }
              },
            ),
            actions: <Widget>[
              IconButton(
                icon: const Icon(Icons.favorite),
                onPressed: () {},
              ),
            ],
          ),
          body: SafeArea(
            child: FutureBuilder<BooksModel>(
              future: booksObject,
              builder: (context, AsyncSnapshot<BooksModel> snapshot) {
    
    
                if (snapshot.hasData) {
                  return Column(
                    children: <Widget>[
                      const SizedBox(
                        height: 50.0,
                      ),
                      ListBooksView(snapshot: snapshot),
                    ],
                  );
                } else {
                  const Center(child: CircularProgressIndicator());
                }
                return Text('Test is: ${snapshot.data?.items?[0].volumeInfo.title}');
              
              },
            ),
          ),
        );
      }
    }
    
    Файл API
    import 'dart:convert';
    import 'dart:developer';
    import 'package:google_books/util/constants.dart';
    import 'package:http/http.dart' as http;
    import '../models/books_model.dart';
    
    class BooksApi {
    
    
      Future<BooksModel> fetchBooks(String booknameApi) async {
        var params = {'q' : booknameApi};
        var uri = Uri.https(Constants.BOOKS_BASE_URL_DOMAIN, Constants.BOOKS_SEARCH_PATH, params);
        log('request: ${uri.toString()}');
    
        var response = await http.get(uri);
    
        log('response: ${response.body}');
    
    
        if (response.statusCode == 200) {
          return BooksModel.fromJson(json.decode(response.body));
        } else {
          return Future.error('Error response');
        }
        }
    
    }