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?
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;
}