Lär dig ett enkelt system för konsekventa laddnings-, fel- och tomtillstånd för webb och mobil, så att AI‑genererat UI förblir sammanhängande och kräver mindre efterpolering.

Laddnings-, fel- och tomtillstånd är skärmar (eller små UI-block) användare ser när appen väntar, något misslyckades eller det helt enkelt inte finns något att visa. De är normala: nätverk är långsamma, behörigheter nekas och nya konton börjar med noll data.
De blir röriga eftersom de ofta läggs till sent och snabbt. Team bygger först happy path, och lappar sedan in en spinner, ett rött meddelande och en “inga objekt”-platshållare där UI:et brister. Gör det över dussintals skärmar och du får en hög av engångslösningar.
Snabb iteration gör det värre. När UI produceras snabbt (inklusive AI-genererat UI) kan huvudlayouten dyka upp på minuter, men dessa tillstånd är lätta att hoppa över. Varje ny skärm får en annan spinnerstil, annan formulering (“Försök igen” vs “Retry”) och olika knappplacering. Farten du fick i början blir poleringsarbete precis före lansering.
Omatchade tillstånd förvirrar användare och kostar team tid. Folk kan inte avgöra om en tom lista betyder “inga träffar”, “inte laddat än” eller “du har inte åtkomst”. QA måste testa en lång svans av små varianter, och buggar smyger igenom eftersom beteendet skiljer sig mellan webb och mobil.
“Rörigt” ser ofta ut så här:
Målet är enkelt: en delad approach för webb och mobil. Om ditt team genererar funktioner snabbt (till exempel med en plattform som Koder.ai) är en gemensam tillståndsmall ännu viktigare eftersom varje ny skärm börjar konsekvent som standard.
De flesta appar upprepar samma tryckpunkter: listor, detaljsidor, formulär, dashboards. Här multipliceras spinners, banners och “inget här”-meddelanden.
Börja med att namnge och standardisera fem tillståndstyper:
Två specialfall förtjänar egna regler eftersom de beter sig annorlunda:
Över skärmar och plattformar, håll strukturen konsekvent: var tillståndet visas, ikonstil, ton och standardåtgärder (Retry, Refresh, Rensa filter, Skapa). Det som kan variera är kontexten: skärmens namn och en mening som använder användarens ord.
Exempel: om du genererar både en webblista och en mobillista för “Projects” ska de dela samma nollresultat-mönster. Åtgärdsetiketten kan fortfarande matcha plattformen (“Rensa filter” vs “Återställ”).
Om varje skärm uppfinner sin egen spinner, felkort och tommeddelande får du ett dussin liknande varianter. Den snabbaste lösningen är ett litet “state kit” som vilken funktion som helst kan använda.
Börja med tre återanvändbara komponenter som fungerar överallt: Loading, Error och Empty. Håll dem avsiktligt tråkiga. De ska vara lätta att känna igen och inte konkurrera med huvud-UI:et.
Gör komponenterna förutsägbara genom att definiera ett litet uppsättning inputs:
Lås sedan utseendet. Bestäm en gång om marginaler, typografi, ikonstorlek och knappstil, och behandla det som en regel. När ikonstorleken och knappstilen är konstant slutar användare lägga märke till tillstånds-UI:t och börjar lita på det.
Håll varianterna begränsade så att kitet inte blir ett andra designsystem. Tre storlekar täcker vanligtvis: small (inline), default (sektion) och full-page (blockerande).
Om du genererar skärmar i Koder.ai kan en enkel instruktion som “use the app StateKit for loading/error/empty with default variant” förhindra drift. Det minskar också städarbetet i slutskedet över React (web) och Flutter (mobil).
Text är en del av systemet, inte dekoration. Även när layouten är konsekvent gör ad hoc-formuleringar att skärmar känns olika.
Välj en gemensam röst: kort, specifik, lugn. Säg vad som hände i klara termer, och berätta sedan för användaren vad de ska göra härnäst. De flesta skärmar behöver bara en tydlig titel, en kort förklaring och en uppenbar åtgärd.
Några meddelandemallar täcker de flesta situationer. Håll dem korta så de får plats på små skärmar:
Undvik vaga texter som “Något gick fel” på egen hand. Om du verkligen inte vet orsaken, säg vad du vet och vad användaren kan göra nu. “Vi kunde inte ladda dina projekt” är bättre än “Fel.”
Sätt en regel: varje fel- och tomtillstånd erbjuder ett nästa steg.
Detta är ännu viktigare med AI-genererat UI, där skärmar dyker upp snabbt. Mallar håller texten konsekvent så du slipper skriva om dussintals enskilda meddelanden i sista stund.
När tillståndsskärmar föreslår olika åtgärder från en sida till en annan tvekar användare. Team slutar då med att justera knappar och text precis före lansering.
Bestäm vilken åtgärd som hör hemma i varje tillstånd och håll placering och etikett konsekvent. De flesta skärmar bör ha en primär åtgärd. Om du lägger till en sekundär ska den stödja huvudvägen, inte konkurrera med den.
Håll tillåtna åtgärder snäva:
Tråkiga knappar är en funktion. De gör UI bekant och hjälper genererade skärmar att förbli sammanhängande.
Visa “Retry” bara när retry realistiskt kan fungera (timeout, fladdrigt nätverk, 5xx). Lägg in en kort debounce så upprepade tryck inte spammar förfrågningar, och byt knappen till ett laddningstillstånd medan den försöker igen.
Efter upprepade fel, behåll samma primära knapp och förbättra sekundär hjälp (till exempel en “Kontrollera anslutningen”-hint eller “Försök igen senare”). Undvik att introducera ny layout bara för att något misslyckades två gånger.
För fel-detaljer, visa en enkel orsak användaren kan agera på (“Din session gick ut. Logga in igen.”). Dölj tekniska detaljer som standard. Om du behöver dem, lägg dem bakom ett konsekvent “Detaljer”-gränssnitt över plattformar.
Exempel: en “Projects”-lista misslyckas med att ladda på mobil. Båda plattformarna visar samma primära “Retry”-åtgärd, inaktiverar den medan den försöker och efter två misslyckanden läggs en liten anslutningshint till istället för att ändra hela knapplayouten.
Behandla tillståndskonsistens som en liten produktförändring, inte en redesign. Gå inkrementellt och gör adoption enkel.
Börja med en snabb inventering av vad ni redan har. Sikta inte på perfektion. Fånga vanliga variationer: spinners vs skeletons, helsidesfel vs banners, “inga träffar”-skärmar med olika ton.
En praktisk rollout-plan:
När komponenterna finns är tidsbesparingen en kort regelsamling som tar bort debatt: när ett tillstånd blockerar hela sidan vs bara ett kort, och vilka åtgärder som måste finnas.
Håll reglerna korta:
Om du använder en AI UI-generator som Koder.ai lönar sig dessa regler snabbt. Du kan prompta för “use the state kit components” och få skärmar som matchar ditt system på både React (web) och Flutter (mobil) med mindre städning.
Poleringsarbete i sista minuten uppstår ofta eftersom tillståndshantering byggts som engångslösningar. En skärm “fungerar”, men upplevelsen känns olika varje gång något tar tid, går fel eller inte har data.
Skeletons hjälper, men att lämna dem för länge gör att folk tror appen hängt sig. Ett vanligt problem är att visa en full skeleton på ett långsamt anrop utan signal om att saker rör sig.
Sätt en tidsbox: efter en kort fördröjning, byt till ett lättare “Fortfarande laddar…”-meddelande eller visa progress när du kan.
Team skriver ofta nya meddelanden varje gång, även när problemet är detsamma. “Something went wrong”, “Unable to fetch” och “Network error” kan beskriva en och samma sak men känns inkonsekventa och gör support svårare.
Välj en etikett per feltyp och återanvänd den på webb och mobil med samma ton och detaljnivå.
Ett annat klassiskt misstag är att visa ett tomt tillstånd innan data är färdigladdad, eller visa “Inga objekt” när det riktiga problemet är ett misslyckat anrop. Användaren gör då fel sak (som att lägga till innehåll när de borde försöka igen).
Gör beslutsordningen explicit: loading först, sedan error om det misslyckades, och bara empty när du vet att förfrågan lyckades.
Ett fel utan återhämtningsåtgärd skapar återvändsgränder. Det motsatta är också vanligt: tre knappar som konkurrerar om uppmärksamheten.
Håll det snävt:
Små skillnader räknas: ikonstil, padding, knappformer. Detta är också där AI-genererat UI kan drifta om prompts varierar per skärm.
Lås marginaler, ikonset och layout för tillståndskomponenter så varje ny skärm ärver samma struktur.
Om du vill ha konsekvent tillståndshantering över webb och mobil, gör de “tråkiga” reglerna explicita. De flesta sista-minuten-justeringar händer eftersom varje skärm uppfinner eget laddningsbeteende, timeouts och etiketter.
För en helsideladdning välj en standard: skeletons för innehållstunga skärmar (listor, kort, dashboards) och spinner bara för korta väntetider där layouten är okänd.
Lägg till en timeout-tröskel så UI inte hänger tyst. Om laddningen tar längre än cirka 8–10 sekunder, byt till ett tydligt meddelande och en synlig åtgärd som “Retry”.
För partiella laddningar, tomma inte skärmen. Behåll befintligt innehåll synligt och visa en liten progressindikator nära sektionen som uppdateras (t.ex. en tunn bar i headern eller en inline-spinner).
För cachead data, föredra “stale but usable.” Visa cacheat innehåll direkt och lägg till en subtil “Refreshing…”-indikator så folk förstår att data kan förändras.
Offline är ett eget tillstånd. Säg det tydligt och säg vad som fortfarande fungerar. Exempel: “Du är offline. Du kan se sparade projekt, men synkningen pausas.” Erbjud en enkel nästa åtgärd som “Försök igen” eller “Öppna sparade objekt.”
Håll dessa konsekventa över plattformar:
Om du genererar UI med ett verktyg som Koder.ai, hjälper det att baka in dessa regler i en delad StateKit så varje ny skärm blir konsekvent som standard.
Föreställ dig ett enkelt CRM med en Kontakter-lista och en Kontakt-detaljsida. Om du behandlar laddnings-, fel- och tomtillstånd som engångslösningar drifter webb och mobil snabbt. Ett litet system håller allt i linje även när UI produceras snabbt.
Förstegångens tomtillstånd (Kontakter): användaren öppnar Kontakter och ser inget än. På både webb och mobil är titeln densamma (“Kontakter”), tommeddelandet förklarar varför (“Inga kontakter ännu”) och ett tydligt nästa steg erbjuds (“Lägg till din första kontakt”). Om setup krävs (som att ansluta en inkorg eller importera en CSV) pekar tomtillståndet på exakt det steget.
Långsamt nätverk vid laddning: användaren öppnar en kontaktdetaljsida. Båda plattformarna visar en förutsägbar skeleton-layout som matchar slutliga sidans struktur (header, nyckelfält, anteckningar). Tillbaka-knappen fungerar fortfarande, sidtiteln är synlig och du undviker slumpmässiga spinners på olika ställen.
Serverfel: detaljförfrågan misslyckas. Samma mönster visas på webb och mobil: kort rubrik, en mening och en primär åtgärd (“Retry”). Om retry misslyckas igen erbjud en andra option som “Gå tillbaka till Kontakter” så användaren inte sitter fast.
Det som förblir konsekvent är enkelt:
En release kan se “klar” ut tills någon hamnar på en långsam uppkoppling, ett nytt konto eller ett ostadigt API. Denna checklista hjälper dig hitta sista-minuten-gap utan att göra QA till en skattjakt.
Börja med listskärmar, eftersom de multipliceras. Välj tre vanliga listor (sökresultat, sparade objekt, senaste aktivitet) och kontrollera att de alla använder samma tomtillståndsstruktur: en tydlig titel, en hjälpsam mening och en primär åtgärd.
Se till att tomma tillstånd aldrig visas medan data fortfarande laddas. Om du flashar “Inget här än” en bråkdel av en sekund och sedan ersätter det med innehåll rasar förtroendet snabbt.
Kontrollera laddningsindikatorer för konsistens: storlek, placering och en rimlig minimal duration så de inte fladdrar. Om webb visar en toppbar-spinner men mobil visar en helskärmsskeleton för samma skärm känns det som två olika produkter.
Fel ska alltid svara på “vad nu?” Varje fel behöver ett nästa steg: retry, refresh, ändra filter, logga in igen eller kontakta support.
En snabb genomgång innan bygget markeras klart:
Om du använder en AI-byggherre som Koder.ai spelar dessa kontroller ännu större roll eftersom skärmar kan genereras snabbt, men konsekvensen fortfarande beror på ett delat kit och delade textregler.
Konsekvens är enklast när det är en del av vardagsarbetet, inte ett engångsfix. Varje ny skärm bör använda samma mönster utan att någon kommer ihåg att “få det att matcha” i slutet.
Gör tillståndsbeteende till en del av definitionen av färdigt. En skärm är inte klar förrän den har ett laddningstillstånd, ett tomtillstånd (om tillämpligt) och ett fel-tillstånd med en tydlig åtgärd.
Håll reglerna lätta, men skriv ner dem. Ett kort dokument med några skärmdumpar och de exakta textmönster du vill ha räcker oftast. Behandla nya varianter som undantag. När någon föreslår en ny design, fråga om det verkligen är ett nytt fall eller om det passar i kitet.
Om du refaktorerar många skärmar, minska risken genom att göra det i kontrollerade steg: uppdatera ett flöde i taget, verifiera det på webb och mobil, och fortsätt sedan. I Koder.ai kan snapshots och rollback göra större ändringar säkrare, och planeringsläge kan hjälpa definiera StateKit så nygenererade skärmar följer dina standarder från dag ett.
Välj ett område den här veckan där tillståndsproblem orsakar sena fixar (ofta sökresultat, onboarding eller en aktivitetsfeed). Gör sedan:
Ett konkret tecken på att det fungerar: färre “små” tickets som “lägg till retry”, “tomtillstånd ser konstigt ut” eller “laddningsspinner blockerar sidan”.
Tilldela en ägare för tillståndsstandarden (en designer, en teknisk ledare eller båda). De behöver inte godkänna allt, men de ska skydda kitet från att långsamt splittras i nya varianter som ser lika ut, beter sig olika och kostar tid senare.
Börja med att ge namn åt en liten uppsättning tillstånd som ni använder överallt: initial laddning, uppdatering/refresh, tomt basläge, nollresultat och fel. Lägg till tydliga regler för offline och långsamt nätverk så att de inte behandlas som godtyckliga fel. När teamet är överens blir UI förutsägbart över skärmar och plattformar.
Bygg en liten StateKit med tre återanvändbara delar: Loading, Error och Empty. Låt varje komponent drivas av samma indata (titel, kort meddelande, en primär åtgärd och eventuella detaljer) så att vilken skärm som helst kan använda dem utan att hitta på ny UI. Gör standardvarianten enklast att använda så teamen slutar skapa engångslösningar.
Använd en enkel beslutsordning: visa loading tills förfrågan är klar, visa error om den misslyckades och visa endast empty efter ett lyckat svar utan data. Det förhindrar det vanliga felet där “Inga objekt” blixtrar förbi innan innehållet laddas fram. Det gör också QA mer förutsägbart.
Välj en standardåtgärd per tillstånd och återanvänd samma etikett och placering över skärmar. Fel får ofta “Retry”, tomma baslägen får “Create” (eller nästa uppsättningssteg) och nollresultat får “Clear filters”. När primära åtgärden är förutsägbar rör sig användare snabbare och team slipper diskutera knapptext.
Skriv text i en delad mall: en kort titel som namnger situationen, en mening på enkelt språk som förklarar den och ett tydligt nästa steg. Föredra specifika meddelanden som “Vi kunde inte ladda dina projekt” framför vaga “Något gick fel”. Håll tonen lugn så att webb och mobil känns som en produkt.
Behandla offline som ett eget tillstånd, inte som ett generiskt fel. Visa cacheat innehåll om ni har det, säg tydligt “Du är offline” och förklara vad som fortfarande fungerar. Erbjud en enda nästa åtgärd som “Försök igen” så användaren inte sitter fast och gissar.
Undvik snabba felblixtrar genom att vänta en kort stund innan UI byter till fel. Om laddningen passerar en tröskel, byt till ett tydligt “Fortfarande laddar…”-meddelande och ge en synlig åtgärd som “Retry”. Det får appen att kännas responsiv även vid dåligt nätverk.
Använd tre storleksvarianter: liten inline (i ett kort eller avsnitt), standardsektion och helsida som blockerar. Definiera när varje variant är tillåten så team inte improviserar för varje skärm. Att hålla samma marginaler, ikonstil och knappstil över varianterna gör upplevelsen konsekvent.
Få in några grundläggande regler: flytta fokus till meddelandet och primära åtgärden när tillståndet visas, annonsera laddning och fel med tydliga etiketter, och se till att knappar är lätta att trycka på. Använd inte bara färg eller animation för att kommunicera status. Om dessa är en del av StateKit är detvärt för varje ny skärm.
Rulla ut per produktområde, börja med trafikerade listor och detaljskärmar. Inventera nuvarande variationer, välj några kanoniska placeringar och ersätt engångstillstånd när ni ändå berör varje skärm. Om ni genererar UI i Koder.ai, lägg en fast instruktion att använda StateKit som standard så nya skärmar inte driver iväg.