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):
És az alkalmazás képernyőjén is:
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:
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:
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:
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:
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.