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));
Related videos on Youtube
Author by
Irfan Akram
Updated on April 26, 2022Comments
-
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 almost 5 years
data
is of typeList<String>
. What isdata[index]['name']
supposed to be?
-
-
jamesdlin almost 5 years
int.parse('name')
is not going to help here. -
Michel Feinstein over 4 yearsThis answer would be more complete if you explained why
-
Michael Hathi about 3 yearsThis 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 about 3 yearsThe argument type 'String' can't be assigned to the parameter type 'Uri'.
-
Syscall about 3 yearsThank 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 almost 3 yearsWell, 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 over 2 yearsSuch answer already exists
-
Chris about 2 yearsWelcome 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 about 2 yearsAlso, 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.