type 'int' is not a subtype of type 'String' in flutter widget test in hacker news
EDIT: Although my answer answers the question you asked, as pointed out in another answer, you probably didn't want to use title: json['score']
but title: json['title']
instead.
You are trying to use an int as a String. Look at the error code, it will tell you which line is causing the error.
Based on your error code, the error is happening on line 30 of article.dart.
This one:
title: json['score']
title
is probably expecting a String
and json['score']
is likely returning an int.
Just add .toString()
like so:
title: json['score'].toString() //now it is a String
Shahryar Rafique
Updated on December 24, 2022Comments
-
Shahryar Rafique over 1 year
As you already know there is a boring show of flutter where they made a flutter hacker news app. If I'm implementing the same to learn about the testing of the app. I came across this problem. type 'int' is not a subtype of type 'String'. I only implemented three test. json_test.dart
import 'package:flutter_test/flutter_test.dart'; import '../lib/jsonparsing.dart'; void main() async { test("parses topstories.json", () { const jsonString = "[24429012,24426500,24426882,24422593,24426407,24427978,24420177,24428206,24426617,24427417,24428755,24422897,24410641,24424910,24422432,24423463,24424462,24428693,24421907,24427617,24426917,24423637,24426641,24425843,24411110,24404595,24428907,24424073,24409543,24422491,24425424,24403827,24422472,24428810,24423544,24423023,24421331,24428943,24422808,24420120,24427311,24427596,24402763,24425870,24426207,24422441,24419441,24423610,24424698,24427706,24428633,24424992,24426131,24426441,24422416,24413394,24421018,24422547,24419042,24423208,24421247,24427930,24428402,24420874,24417015,24408509,24412970,24419081,24407432,24401999,24422092,24406193,24424040,24417319,24416908,24413705,24416807,24402839,24422333,24427247,24419803,24412881,24422720,24415760,24428372,24414497,24402429,24425776,24419660,24426023,24419947,24425121,24428572,24424335,24403076,24428554,24417482,24402202,24401927,24416005,24419844,24425625,24410596,24404189,24414949,24417079,24423614,24423600,24414252,24425268,24418854,24425111,24411344,24407706,24424989,24422729,24423540,24410530,24412179,24410627,24415872,24421934,24407204,24423602,24423534,24419875,24401439,24427083,24406714,24424208,24418838,24426107,24401664,24411357,24424829,24420304,24404814,24419574,24410113,24416112,24427169,24427165,24422599,24422365,24422358,24404002,24412810,24411991,24421073,24427696,24422148,24406611,24401085,24411076,24421034,24421767,24424621,24427045,24425909,24404808,24409093,24412687,24425797,24423484,24407241,24424872,24414877,24413629,24408077,24409334,24404628,24407323,24411540,24425146,24426014,24420692,24403070,24408185,24421020,24408511,24407674,24405632,24426573,24401805,24408324,24406366,24403464,24402419,24411786,24405758,24407005,24426178,24424804,24426132,24426108,24426631,24407849,24407272,24402937,24413746,24403211,24401748,24410681,24405981,24401546,24404742,24411315,24405884,24407232,24421061,24405941,24403351,24423612,24420975,24405776,24425056,24418802,24407601,24411162,24426728,24407321,24410472,24407844,24422487,24402107,24401462,24423332,24401565,24418930,24415294,24415252,24403236,24402467,24423399,24416458,24401246,24403392,24401206,24404555,24414671,24406921,24406829,24408717,24422463,24412936,24404681,24408201,24412549,24418171,24405214,24425068,24411693,24411554,24403566,24419664,24416977,24407122,24409695,24404113,24417890,24425794,24418248,24420592,24408813,24403461,24420359,24415180,24407444,24410575,24403095,24401112,24402543,24409919,24411253,24404671,24416894,24402125,24404357,24406683,24413393,24413737,24406046,24409972,24405876,24413045,24405946,24413554,24405517,24418345,24418856,24408773,24405960,24401221,24410652,24418598,24409327,24418523,24404968,24410991,24411834,24401124,24414153,24413823,24406276,24424567,24423129,24425498,24415528,24422788,24403306,24403255,24414448,24405833,24414301,24401287,24411683,24406577,24403862,24406418,24416379,24421236,24412657,24404704,24420996,24420777,24406341,24405512,24402885,24405253,24404200,24414222,24421155,24408228,24419521,24407430,24411758,24405455,24421761,24405294,24401352,24411207,24403633,24411030,24406818,24402075,24405279,24418561,24401245,24405942,24420567,24405634,24405583,24413574,24404921,24401450,24405651,24410121,24401519,24403647,24406270,24413835,24412451,24405814,24405736,24402536,24405600,24422368,24405438,24425763,24404549,24404182,24410125,24413607,24408109,24406632,24410299,24401107,24405100,24402849,24406446,24404657,24426389,24425252,24409970,24402841,24402617,24401415,24405318,24402404,24403967,24415907,24407797,24412792,24428579,24424763]"; expect( parseTopStories(jsonString).first, 24429012, ); }); test("parses Articles.json", () { const jsonString = """{"by":"dhouston","descendants":71,"id":8863,"kids":[9224,8917,8952,8958,8884,8887,8869,8940,8908,9005,8873,9671,9067,9055,8865,8881,8872,8955,10403,8903,8928,9125,8998,8901,8902,8907,8894,8870,8878,8980,8934,8943,8876],"score":104,"time":1175714200,"title":"My YC app: Dropbox - Throw away your USB drive","type":"story","url":"http://www.getdropbox.com/u/2/screencast.html"}"""; expect( parseArticle(jsonString).by, "dhouston", ); }); }
json_parsing.dart
import './models/article.dart'; import 'dart:convert' as json; List<int> parseTopStories(String jsonStr) { final parsed = json.jsonDecode(jsonStr); final listofIds = List<int>.from(parsed); return listofIds; } Article parseArticle(String jsonStr) { final parsed = json.jsonDecode(jsonStr); Article article = Article.fromJson(parsed); return article; }
article.dart
class Article { final int id; final String title; final String url; final String type; final String by; final int time; final int score; final int descendants; final List<int> kids; const Article({ this.id, this.title, this.url, this.type, this.by, this.time, this.score, this.descendants, this.kids, }); factory Article.fromJson(Map<String, dynamic> json) { if (json == null) return null; return Article( url: json['url'] ?? null, by: json['by'], id: json['id'], time: json['time'], title: json['score'], descendants: json['descendants'], kids: json['kids'], score: json['score'], type: json['type'], ); } }
widget_test.dart
// This is a basic Flutter widget test. // // To perform an interaction with a widget in your test, use the WidgetTester // utility that Flutter provides. For example, you can send tap and scroll // gestures. You can also use WidgetTester to find child widgets in the widget // tree, read text, and verify that the values of widget properties are correct. import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:hacker_app/main.dart'; void main() { testWidgets('Hacker News', (WidgetTester tester) async { // Build our app and trigger a frame. await tester.pumpWidget(MyApp()); expect(find.byIcon(Icons.launch), findsNothing); await tester.tap(find.byType(ExpansionTile).first); await tester.pumpAndSettle(); expect(find.byIcon(Icons.launch), findsOneWidget); }); }
00:06 +1 -1: C:\Users\Shary\Desktop\Development\practice\hackerapp\test\json_test.dart: parses item.json [E] type 'int' is not a subtype of type 'String' ..\lib\models\article.dart 30:18 new Article.fromJson ..\lib\jsonparsing.dart 12:29 parseArticle json_test.dart 17:7 main.<fn>
-
Jitesh Mohite over 3 yearswhere you are getting an error, the exact line would be helpful
-
julemand101 over 3 yearsPlease post the full error message since it will contain useful information about where the problem occur.
-
Shahryar Rafique over 3 years00:06 +1 -1: C:\Users\Shary\Desktop\Development\practice\hackerapp\test\json_test.dart: parses item.json [E] type 'int' is not a subtype of type 'String' ..\lib\models\article.dart 30:18 new Article.fromJson ..\lib\jsonparsing.dart 12:29 parseArticle json_test.dart 17:7 main.<fn>
-
lenz over 3 yearsarticle.dart 30:18 ... meaning in your file article.dart, at line #30, character 18... the error is happening
-
Shahryar Rafique over 3 yearsyes, but i am passing string
-
lenz over 3 yearsMy guess is this... title: json['score'] is where the error is happening right? So title is probably expecting a string, and json['score'] probably returns an int
-
lenz over 3 yearsI updated my answer based on your error code. Please upvote and accept it if it's helpful. Or let me know if it doesn't solve this problem for you
-
lenz over 3 yearsThe new error is referring to this line
kids: json['kids'],
it is expecting aList<int>
but it's gettingList<dynamic>
. You can cast theList<dynamic>
into aList<int>
like this:kids: json['kids'].cast<int>()
-
lenz over 3 yearsGlad I could help. Thanks for accepting my answer
-
-
Jitesh Mohite over 3 years@Shahryar Rafique: Completly disagree with you my answer is correct if I am not wrong as you are using the wrong attribute. Could you justify why it's not accurate?