Home > Software design >  Flutter : TypeError: Cannot read properties of null (reading 'setString')
Flutter : TypeError: Cannot read properties of null (reading 'setString')

Time:08-12

I want to make progress tracker like if the user passed level 1 level 1 I will send to the Map level 1 is true (Finished), I don't want to use database so I tried Shared Preferences Package then I faced the Error That in the title ... if you have a better way to do it please write it

class CheckLvl extends StatelessWidget {

   static SharedPreferences sharedPreferences;
   Map<String , String> Check =  {
     '1':'true',
     '2':'false',
     '3':'false',
     '4':'false',
   };
    String encoded ;
    String encodedMap;
    Map<String , String> decoded;
    CheckLvl(){
      encoded = jsonEncode(Check);
      sharedPreferences.setString('State', encoded);
    }
   static init () async
   {
     sharedPreferences = await SharedPreferences.getInstance();
   }
   Future<bool> isComplete (String index) async {
     encodedMap = sharedPreferences.getString('State');
     decoded = jsonDecode(encodedMap);
     print(decoded);
     if (decoded[index]=='true')
      return true;
   }
   void Done(String index)
   {
     encodedMap = sharedPreferences.getString('State');
     decoded = jsonDecode(encodedMap);
     decoded[index]='true';
   }

CodePudding user response:

It is possible to get null data while reading , you can do

   Future<bool> isComplete (String index) async {
     final String? data = sharedPreferences.getString('State');
     return data=='true' ;
   }

Better using FutureBuilder for future method like


class CheckLvl extends StatefulWidget {
  @override
  State<CheckLvl> createState() => _CheckLvlState();
}

class _CheckLvlState extends State<CheckLvl> {
  SharedPreferences? sharedPreferences;
  Map<String, String> Check = {
    '1': 'true',
    '2': 'false',
    '3': 'false',
    '4': 'false',
  };

  Future<void> init() async {
    sharedPreferences = await SharedPreferences.getInstance();
  }

  String? encoded;

  String? encodedMap;

  Map<String, String>? decoded;

  Future<bool> isComplete(String index) async {
    encodedMap = sharedPreferences!.getString('State');
    decoded = jsonDecode(encodedMap!);
    print(decoded);
    if (decoded?[index] == 'true') return true;
    return false;
  }

  void Done(String index) async {
    encodedMap = sharedPreferences!.getString('State');
    decoded = jsonDecode(encodedMap!);
    decoded?[index] = 'true';
  }

  late final prefFuture = init();

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: prefFuture,
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          return Text("got data");
        }
        return CircularProgressIndicator();
      },
    );
  }
}

class CheckLvl extends StatelessWidget {
  static SharedPreferences? sharedPreferences;
  Map<String, String> Check = {
    '1': 'true',
    '2': 'false',
    '3': 'false',
    '4': 'false',
  };
  String? encoded;
  String? encodedMap;
  Map<String, String>? decoded;

  static Future<SharedPreferences> init() async {
    return await SharedPreferences.getInstance();
  }

  Future<bool> isComplete(String index) async {
    sharedPreferences ??= await init();
    encodedMap = sharedPreferences!.getString('State');
    decoded = jsonDecode(encodedMap!);
    print(decoded);
    if (decoded?[index] == 'true') return true;
    return false;
  }

  void Done(String index) async {
    sharedPreferences ??= await init();
    encodedMap = sharedPreferences!.getString('State');
    decoded = jsonDecode(encodedMap!);
    decoded?[index] = 'true';
  }

  @override
  Widget build(BuildContext context) {
    throw UnimplementedError();
  }
}
  • Related