flutter data_error ai_generated true

FormatException: Invalid radix-10 number (at character 1) while reading SharedPreferences

ID: flutter/shared-preferences-corruption

Also available as: JSON · Markdown · 中文
78%Fix Rate
83%Confidence
1Evidence
2024-04-05First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
Flutter 3.22 active
Dart 3.4 active
Android 13 active
iOS 16 active

Root Cause

A value stored in SharedPreferences (or NSUserDefaults) was expected to be an integer but was corrupted or saved as a non-numeric string, often due to version mismatches or manual editing.

generic

中文

SharedPreferences(或 NSUserDefaults)中存储的值应为整数,但已损坏或保存为非数字字符串,通常是由于版本不匹配或手动编辑所致。

Official Documentation

https://api.flutter.dev/flutter/package-shared_preferences-shared_preferences/SharedPreferences-class.html

Workarounds

  1. 85% success Use a migration function that reads the corrupted value as a string, attempts to parse it, and if it fails, removes the key and sets a default. Example: `final raw = prefs.getString('counter'); int? value; try { value = int.parse(raw!); } catch (e) { await prefs.remove('counter'); value = 0; }`
    Use a migration function that reads the corrupted value as a string, attempts to parse it, and if it fails, removes the key and sets a default. Example: `final raw = prefs.getString('counter'); int? value; try { value = int.parse(raw!); } catch (e) { await prefs.remove('counter'); value = 0; }`
  2. 75% success Implement a versioned SharedPreferences wrapper that validates data types on read and repairs corrupted entries automatically.
    Implement a versioned SharedPreferences wrapper that validates data types on read and repairs corrupted entries automatically.
  3. 80% success For critical data, migrate to a more robust storage solution like Hive or Isar that includes type safety and corruption detection.
    For critical data, migrate to a more robust storage solution like Hive or Isar that includes type safety and corruption detection.

中文步骤

  1. Use a migration function that reads the corrupted value as a string, attempts to parse it, and if it fails, removes the key and sets a default. Example: `final raw = prefs.getString('counter'); int? value; try { value = int.parse(raw!); } catch (e) { await prefs.remove('counter'); value = 0; }`
  2. Implement a versioned SharedPreferences wrapper that validates data types on read and repairs corrupted entries automatically.
  3. For critical data, migrate to a more robust storage solution like Hive or Isar that includes type safety and corruption detection.

Dead Ends

Common approaches that don't work:

  1. 40% fail

    This deletes all user preferences, causing loss of user settings and potentially breaking app functionality; it's a nuclear option that should only be used as a last resort.

  2. 70% fail

    The corruption remains in storage and will cause the same error on every app restart; the default value may not match user expectations.

  3. 95% fail

    Not feasible for production apps; root access is rare and editing XML can cause further corruption or crash the app.