Home > Blockchain >  How to passs id with type string to listview.builder?
How to passs id with type string to listview.builder?

Time:11-19

my app got error "Type 'String' is not a subtype of type 'int' of 'index'. This is because i want to get data with a string id. But i use listview.builder and it can't accept a string data this is my code

class HomePage extends StatefulWidget {
  const HomePage({Key? key}) : super(key: key);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late Future<List<Agent>> agents;

  @override
  void initState() {
    super.initState();
    agents = fetchAgents();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('My Anime List'),
        ),
      body: Column(
          children: [
              FutureBuilder(
                builder: (context, AsyncSnapshot<List<Agent>> snapshot) {
                  if (snapshot.hasData) {
                    return Expanded(
                      child: ListView.builder(
                        itemCount: snapshot.data?.length,
                        itemBuilder: (BuildContext context,  index) {
                          return Card(
                            child: ListTile(
                              contentPadding: const EdgeInsets.symmetric(
                                  horizontal: 20.0, vertical: 10.0),
                              leading: CircleAvatar(
                                radius: 30,
                                backgroundImage: NetworkImage(
                                    snapshot.data![index].displayIconSmall),
                              ),
                              title: Text(snapshot.data![index].displayName),
                              subtitle: Text('Role: ${snapshot.data![index].role.displayName}'),
                              onTap: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                    builder: (context) => DetailPage(
                                        item: snapshot.data![index].uuid,
                                        title: snapshot.data![index].displayName,
                                        role: snapshot.data![index].role.displayName,
                                        image: snapshot.data![index].displayIconSmall,
                                        description: snapshot.data![index].description,),
                                  ),
                                );
                              },
                            ),
                          );
                        },
                      ),
                    );
                  } else if (snapshot.hasError) {
                    return Center(child: Text('${snapshot.error}'));
                  }
                  return const CircularProgressIndicator();
                },
                future: agents,
              ),
          ],
        ),
    );
  }
}
class Agent {
  final String uuid;
  final String displayName;
  final String description;
  final String displayIcon;
  final String displayIconSmall;
  final bool isPlayableCharacter;
  Role role;

  Agent({
    required this.uuid,
    required this.displayName,
    required this.description,
    required this.displayIcon,
    required this.displayIconSmall,
    required this.isPlayableCharacter,
    required this.role
  });

  factory Agent.fromJson(Map<String, dynamic> json) {
    return Agent(
      uuid: json['uuid'],
      displayName : json['displayName'],
      description : json['description'],
      displayIcon : json['displayIcon'],
      displayIconSmall : json['displayIconSmall'],
      isPlayableCharacter : json['isPlayableCharacter'],
      role : json['role'],
      );
  }
  Map<String, dynamic> toJson() => {
        'uuid': uuid,
        'displayName': displayName,
        'description': description,
        'displayIcon': displayIcon,
        'displayIconSmall': displayIconSmall,
        'isPlayableCharacter': isPlayableCharacter,
        'role': role
      };
}

class Role{
  final String uuid;
  final String displayName;
  final String description;

   Role({
    required this.uuid,
    required this.displayName,
    required this.description,
  });

  factory Role.fromJson(Map<String, dynamic> json) {
    return Role(
      uuid: json['uuid'],
      displayName : json['displayName'],
      description : json['description'],
      );
  }

  Map<String, dynamic> toJson() => {
        'uuid': uuid,
        'displayName': displayName,
        'description': description,
      };
}
Future<List<Agent>> fetchAgents() async {
  final response =
      await http.get(Uri.parse('https://valorant-api.com/v1/agents'));

  if (response.statusCode == 200) {
    var jsonResponse = json.decode(response.body)['data'];
    var data = jsonResponse["data"];
    if(data is Map) {
        Role user = Role(
          uuid:["uuid"].toString(),
          displayName:["displayName"].toString(),
          description:["description"].toString(),
        );
        return jsonResponse.map((role) => Agent.fromJson(role)).toList();
      };
    return jsonResponse.map((agent) => Agent.fromJson(agent)).toList();
  } else {
    throw Exception('Failed to load data');
  }
}

i already try to change it to integer but it can't since listview.build must have index and index must be integer. I expecting the data can be pass because the uid for the api data is string type

CodePudding user response:

you can turn a String id like "818" to an int with the following:

String uuid = "818";
int.parse(uuid) //  818

CodePudding user response:

 uuid: int.parse(json['uuid'].toString()),
      displayName : json['displayName'].toString(),
      description : json['description'].toString(),
      displayIcon : json['displayIcon'].toString(),
      displayIconSmall : json['displayIconSmall'].toString(),
      isPlayableCharacter : json['isPlayableCharacter'].toString(),
      role : json['role'].toString(),

CodePudding user response:

If you're expecting the response from https://valorant-api.com/v1/agents to look like this

{
  "status":200,
  "data":[
    {
      "uuid":"dade69b4-4f5a-8528-247b-219e5a1facd6",
      "displayName":"Fade",
      ...
    },
    ...
  ]
}

then I believe the problem is in your fetchAgents() function -- specifically in these lines:

var jsonResponse = json.decode(response.body)['data'];
var data = jsonResponse["data"];

If you use strong typing for the variables and break down the steps, you'll see:

List<dynamic> jsonResponse = json.decode(response.body)['data'];
dynamic data = jsonResponse["data"];  // Error here; expects int

Solution:

Map<String, dynamic> jsonResponse = json.decode(response.body);
dynamic? data = jsonResponse['data'];
  • Related