'How can I resolve "The argument type 'String' can't be assigned to the parameter type 'int' " - Flutter

I'm trying to fetch data Online Using HTTP GET with Flutter SDK. I'm trying with this code https://github.com/RaglandCodes/Flutter-basic-API/blob/master/lib/main.dart but it is showing an error about data type that's

The argument type 'String' can't be assigned to the parameter type 'int'

Here's Error part

new Card(
     child: new Container(
     child: new Text(data[index]['name']), //error red underlying with 'name'
     padding: EdgeInsets.all(20),
     ),

Here's my main.dart

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'dart:async';

void main() {
  runApp(new MaterialApp(home: new HomePage(),));
}

 class HomePage extends StatefulWidget {
   @override
   _HomePageState createState() => _HomePageState();
 }

 class _HomePageState extends State<HomePage> {

  String url="https://swapi.co/api/people/";
  List<String> data;

  /*onCreate*/
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    getJSONData(); //method
  }

   @override
   Widget build(BuildContext context) {
     return new Scaffold(
       appBar: AppBar(
           title: Text("my JSON app")
       ),
       body: new ListView.builder(
        // itemCount: 1,
         //itemCount: data==null ? 0 :data.length ,
         itemCount: data == null ? 0 : data.length,

         itemBuilder: (BuildContext context, int index){
           return new Container(
             child: new Center(
               child: new Column(
                 crossAxisAlignment: CrossAxisAlignment.stretch, 
                 children: <Widget>[
                   new Card(
                     child: new Container(
                       child: new Text(data[index]['name']),
                       padding: EdgeInsets.all(20),
                     ),
                   )
                 ],
               ),
             ),
           );
         },
       ),
     );
   }

   /*method*/ //RT is Future<String>
  Future<String> getJSONData() async{
    var response =await http.get(
      Uri.encodeFull(url),
      headers: {"Accept": "application/json"}
    );
   print(response.body);
   debugPrint(response.body);

    setState(() {
      var convertDataToJson= json.decode(response.body);
      data=convertDataToJson['results'];
    });

    return "Success";
  }
 }


Solution 1:[1]

You have to set data variable to List type.

That's should work:

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'dart:async';

void main() {
  runApp(new MaterialApp(
    home: new HomePage(),
  ));
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  String url = "https://swapi.co/api/people/";
  List data;

  /*onCreate*/
  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    getJSONData(); //method
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("my JSON app")),
      body: new ListView.builder(
        // itemCount: 1,
        //itemCount: data==null ? 0 :data.length ,
        itemCount: data == null ? 0 : data.length,

        itemBuilder: (BuildContext context, int index) {
          return new Container(
            child: new Center(
              child: new Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: <Widget>[
                  new Card(
                    child: new Container(
                      child: new Text(data[index]['name'] ?? ''),
                      padding: EdgeInsets.all(20),
                    ),
                  )
                ],
              ),
            ),
          );
        },
      ),
    );
  }

  /*method*/ //RT is Future<String>
  Future<String> getJSONData() async {
    var response = await http
        .get(Uri.encodeFull(url), headers: {"Accept": "application/json"});
    print(response.body);
    debugPrint(response.body);

    setState(() {
      var convertDataToJson = json.decode(response.body);
      data = convertDataToJson['results'];
    });

    return "Success";
  }
}

Solution 2:[2]

That's worked for me

http.get(Uri.https('https://swapi.co', 'api/people'));

or

http.get(Uri.parse('https://swapi.co/api/people'));

Solution 3:[3]

If you add .toString() the error will disappear:

Text(data[index]['name'].toString())

good

Solution 4:[4]

The reason is that http.get can't work with strings anymore. You need to use Uri to parse the HTTP address.

I had the same issue which I fixed it with this approach:

var url = Uri.parse("https://your_api_link");

then call it like this (attaching the http):

http.Response response = await http.get(url);

This should work.

Solution 5:[5]

var response = await http.get(Uri.parse(url));

Solution 6:[6]

if you will simply add .toSting() to your lists like below it will remove the error.

new Card(
     child: new Container(
     child: new Text(data[index]['name'].toString()), //This line
     padding: EdgeInsets.all(20),
),

Solution 7:[7]

That's worked for me

void getData() async {
  Response response = await 
  http.get(Uri.parse("https://jsonplaceholder.typicode.com/todos/1"));
  print(response.body);
}

Solution 8:[8]

That's worked for me

 http.Response respobse= await 
      http.get(Uri.parse("https://jsonplaceholder.typicode.com/photos"));
    
    Uri.parse(json Url);

use this.

Solution 9:[9]

This one will work

String url = '$api?lat=$latitude&lon=$longitude&APPID=$appId';
 http.Response response = await http.get(Uri.parse(url));

Solution 10:[10]

u can use this way

Future<http.Response> fetchAlbum() {return http.get(Uri.https('jsonplaceholder.typicode.com', 'albums/1'));}

Solution 11:[11]

If you add ".toString()" the error will disappear:

new Text(data[index]['name'].toString()),

So:

new Card(
     child: new Container(
     child: new Text(data[index]['name'].toString()), //you'll no longer get an error
     padding: EdgeInsets.all(20),
     ),

Solution 12:[12]

if you are using pdf package your want to delete import 'dart:html'; and use import 'dart:io';
It's worked for me, Have a good day :-)