Skip to content
Kezdőlap » type ‘String’ is not a subtype of type ‘int’ in type cast

type ‘String’ is not a subtype of type ‘int’ in type cast

A type ‘String’ is not a subtype of type ‘int’ in type cast hiba okát és javítását nézzük meg ebben a bejegyzésben.

A hibaüzenetek általában nagyon beszédesek és segíteni tudnak a hiba megértésében, és a javításban is.

A hiba felmerülése

A hiba megjelenik a VSCode-ban, ha be van kapcsolva a Panel (View / Appearance /Panel):

in type cast hiba

És az alkalmazás képernyőjén is:

in type cast hiba a képernyőn

Azt mindenképpen szeretném hozzátenni, hogy az app képernyőjén csak fejlesztési időben látszik a hibaüzenet. Ha már esetleg publikálva van az AppStore-ba vagy a Play Áruházba az alkalmazása, akkor az onnét letöltött, telepített és futtatott app képernyőjén nem fog megjelenni a hiba, noha a funkció hibás. De a felhasználókat nem akarjuk zavarni holmi hibaüzenetekkel. Ők annyit tapasztalnak (és ez nekik bőven elég), hogy az alkalmazás összeomlik.

A hiba vizsgálata

Említettem, hogy a hibaüzenet sokszor beszédes és egyenesen a szánkba rágja mi a hiba. A sokszor az persze nem mindig igaz.

Ilyenkor tudjuk használni a VSCode egyik funkcióját a Debug Console-t, ami a Panel-en belül található. És a Debug Console-on belül sokkal részletesebb leírást kapunk arról a hibáról, ami bekövetkezett.

A fenti képen is látszik, hogy egyrészt le van írva a hiba. Másrészt információ van arról is, hogy melyik widget okozta a hibát (SummaryItem).

Sőt még a fájl neve és a sor száma is látszik:

fájlnév és sorszám

A képen piros nyíllal megjelölt linkre kattintva a VSCode-ban megnyílik a fájl és a hibás sorra ugrik a kurzor:

hibás sor

A stack trace

Ha a VSCode-ban a Debug Console-ban a hiba fölé görgetünk, akkor egy idő után el kell érnünk az ún. stack trace-t, ami a meghívott metódusok hosszú listája:

stack trace

Itt persze nem csak az általunk programozott metódusok hívása jelenik meg, hanem a Flutter belső működéséből fakadó metódus hívások is.

Ennek a stack trace-nek a legtetején még több, számunkra érdekes infó van az adott hibáról. Az is látszik több rikítóbban kijelölt sor is van stack trace-en belül. Nem minden esetben az első ilyen kijelölt sor a célravezető.

Esetünkben viszont igen, és itt látjuk is, hogy a SummaryItem.build metódusa okozta a hibát nagy valószínűséggel. Még az is látszik a sorban jobb oldalt, hogy melyik fájlnak hányadik sora.

Ha ide kattintunk, akkor ismét csak „odadob” minket a VSCode a hiba vélhető helyére és ott fog villogni a kurzor:

hiba helye

A kódból és a hibaüzenetből is azt lehet gyanítani, hogy a hibát a helytelen típus átalakítás okozta, mert „int”-ként akarjuk kezelni azt, aminek „String”-nek kellene lennie.

Esetünkben, ha utánanézünk, hogy honnét származik a lista, akkor látszik, hogy valóban szöveg és nem egész szám az adat típusa:

          'question_index': i,
          'question': questions[i].text,

Ugyanakkor az is látszik, hogy itt mégis csak számot vártunk, mert a questionIndex-et kerestük, az pedig valószínűleg szám lesz. Tehát elírás történt és így a helyes:

uestionIndex: itemData['question_index'] as int,

A hiba azért nem jelentkezett a programozási idő alatt, mert a Map definíciójában Object van, ami megengedi, hogy tetszőleges típust adjunk meg:

final List<Map<String, Object>> summaryData;

És így ez, csak futási időben derült ki.

A hibakezelés lépései

  • Először is induljunk ki a hibaüzenetből, hogy megtudjuk mi a hiba.
  • Nézzük meg mit mutat a Debug Console.
  • Keressük meg a stack trace-ben azt a sort, ami a hibát okozta.
  • Nézzük meg a hibás kódsort az editorban és próbáljuk meg a hibát kijavítani.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük