type 'int' is not a subtype of type 'String' in flutter widget test in hacker news

404

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
Share:
404
Shahryar Rafique
Author by

Shahryar Rafique

Updated on December 24, 2022

Comments

  • Shahryar Rafique
    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
      Jitesh Mohite over 3 years
      where you are getting an error, the exact line would be helpful
    • julemand101
      julemand101 over 3 years
      Please post the full error message since it will contain useful information about where the problem occur.
    • Shahryar Rafique
      Shahryar Rafique over 3 years
      00:06 +1 -1: C:\Users\Shary\Desktop\Development\practice\hackerapp\test\j‌​son_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
      lenz over 3 years
      article.dart 30:18 ... meaning in your file article.dart, at line #30, character 18... the error is happening
    • Shahryar Rafique
      Shahryar Rafique over 3 years
      yes, but i am passing string
    • lenz
      lenz over 3 years
      My 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
      lenz over 3 years
      I 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
      lenz over 3 years
      The new error is referring to this line kids: json['kids'], it is expecting a List<int> but it's getting List<dynamic>. You can cast the List<dynamic> into a List<int> like this: kids: json['kids'].cast<int>()
    • lenz
      lenz over 3 years
      Glad I could help. Thanks for accepting my answer
  • Jitesh Mohite
    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?