Search code examples
flutterrestdartretrofit

Can't make a Get request using Retrofit


I am learning Retrofit and ran into an error while trying to get data with a Get request.

Here are all the files:

main.dart

...
// build list view & manage states
  FutureBuilder<List<UserRequest>> _buildBody(BuildContext context) {
    RepoClass repoClass = RepoClass();
    final client = repoClass.getUsersData();
    return FutureBuilder<List<UserRequest>>(
      // future: client.getUsers(),
      future: client,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.done) {
          final List<UserRequest>? posts = snapshot.data;
          return _buildListView(context, posts!);
        } else {
          return Center(
            child: CircularProgressIndicator(),
          );
        }
      },
    );
  }

  // build list view & its tile
  Widget _buildListView(BuildContext context, List<UserRequest> posts) {
    return
      ListView.builder(itemBuilder: (context,index){
        return Card(
          child: ListTile(
            leading: Icon(Icons.account_box,color: Colors.green,size: 50,),
            title: Text(posts[index].name,style: TextStyle(fontSize: 20),),
            subtitle: Text(posts[index].email),
          ),
        );
      },itemCount: posts.length,
      );
  }

}

repo_class

import 'package:dio/dio.dart';

import 'api_client.dart';
import 'model.dart';

class RepoClass {
  late APIClient mClient;
  RepoClass() {
    mClient = APIClient(Dio());
  }

  getUsersData() async {
    // var usersResponse = await mClient.getUsers();
    List<UserRequest> usersResponse = await mClient.getUsers();
    print('repo_class is ${usersResponse}');
  }

api_client

import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';

import 'model.dart';

part 'api_client.g.dart';

@RestApi(baseUrl: "https://jsonplaceholder.typicode.com")
abstract class APIClient {
  factory APIClient(Dio dio) = _APIClient;


  @GET("/users")
  Future<List<UserRequest>> getUsers();

}

I am not posting the class model as it is unlikely to be the cause of the problem. I believe the problem comes when I try to build a list using FutureBuilder

Here is the error:

type 'Future<dynamic>' is not a subtype of type 'Future<List<UserRequest>>?'

How to fix it?


Solution

  • You are not returning the data. Change

      getUsersData() async {
        // var usersResponse = await mClient.getUsers();
        List<UserRequest> usersResponse = await mClient.getUsers();
        print('repo_class is ${usersResponse}');
      }
    

    to

      Future<List<UserRequest>> getUsersData() async {
        // var usersResponse = await mClient.getUsers();
        List<UserRequest> usersResponse = await mClient.getUsers();
        print('repo_class is ${usersResponse}');
        return usersResponse;
      }