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

186,768

Solution 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

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

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

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

good

Solution 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

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

Share:
186,768

Related videos on Youtube

Irfan Akram
Author by

Irfan Akram

Updated on April 26, 2022

Comments

  • Irfan Akram
    Irfan Akram about 2 years

    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";
      }
     }
    
    • jamesdlin
      jamesdlin almost 5 years
      data is of type List<String>. What is data[index]['name'] supposed to be?
  • jamesdlin
    jamesdlin almost 5 years
    int.parse('name') is not going to help here.
  • Michel Feinstein
    Michel Feinstein over 4 years
    This answer would be more complete if you explained why
  • Michael Hathi
    Michael Hathi about 3 years
    This is a valid answer for those using http: 0.13.0 and above. Here is the changelog which mentions this as a breaking change: pub.dev/packages/http/changelog#0130-nullsafety0
  • PuNeet Pal
    PuNeet Pal about 3 years
    The argument type 'String' can't be assigned to the parameter type 'Uri'.
  • Syscall
    Syscall about 3 years
    Thank you for this code snippet, which might provide some limited, immediate help. A proper explanation would greatly improve its long-term value by showing why this is a good solution to the problem and would make it more useful to future readers with other, similar questions. Please edit your answer to add some explanation, including the assumptions you’ve made.
  • umekalu
    umekalu almost 3 years
    Well, I don't really know the reason, maybe String could no longer handle URL values due to the async pattern in retrieving the url data. But I think someone else could have a better reason here.
  • ZygD
    ZygD over 2 years
    Such answer already exists
  • Chris
    Chris about 2 years
    Welcome to Stack Overflow. Code is a lot more helpful when it is accompanied by an explanation. Stack Overflow is about learning, not providing snippets to blindly copy and paste. Please edit your question and explain how it answers the specific question being asked. See How to Answer.
  • Chris
    Chris about 2 years
    Also, this question is nearly 3 years old and already has 13 answers, including an accepted answer and an answer with a score of over 60. Are you certain this answer brings something new and improved? If so, please edit it to explain how it improves upon what's already here.