'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 :-)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow