0

everyone I saved List in shared preference. Since List cannot be saved in shared preference, it is saved in json type. I referenced the post on the stackover. However, when reading the value stored in the preference, null was returned. Please help.

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:real_lotto/lotto_number.dart';

class DisplayNumber extends StatefulWidget {
  @override
  _DisplayNumberState createState() => _DisplayNumberState();
}

class _DisplayNumberState extends State<DisplayNumber> {
  String _number = '';

  //initState called when the widget is mounted
  void initState() {
    super.initState();
    if (_number == '') {
      loadLotto().then((String s) => setState((() {
            _number = s;
            print(s);
          })));
    }
  }

  @override
  Widget build(BuildContext context) {
    print(_number);
    return Scaffold();
  }
}

Future<void> _saveLotto(number) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  prefs.setString('key', json.encode(number));
}

Future<String> loadLotto() async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var number = json.decode(prefs.getString('key'));
  return (number);
}

List<dynamic> myNumber() {
  var number = [];
  number.add((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6));
  number.add((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6));
  number.add((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6));
  number.add((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6));
  number.add((List.generate(45, (index) => ++index)..shuffle()).sublist(0, 6));
  for (var i = 0; i < number.length; i++) {
    number[i].sort();
  }
  _saveLotto(number);
  return number;
}
Alex Hwang
  • 11
  • 1
  • Are you sure the key is assigned in shared prefs, You are trying to load the data but did you assign it somewhere? – Afridi Kayal Dec 27 '20 at 18:06
  • the key is assined at "prefs.setString('key', json.encode(number));" – Alex Hwang Jan 02 '21 at 08:00
  • I don't see you calling save lotto method (directly or indirectly) anywhere before accessing load lotto method – Afridi Kayal Jan 02 '21 at 08:19
  • it's called "List myNumber()" function. I couldn't upload the whole source, so I only uploaded the relevant part. – Alex Hwang Jan 02 '21 at 11:23
  • Instances were created in save and load respectively by calling the instance twice. "SharedPreferences prefs;" is declared as a global variable. I deleted "SharedPreferences prefs = await SharedPreferences.getInstance();" from the load function. – Alex Hwang Jan 03 '21 at 05:01
  • Did you call myNumber? Please share the part of the code where you called myNumber function – Afridi Kayal Jan 03 '21 at 05:12
  • You can try `return number ?? muNumber().toString();` in loadlotto function. It will return the result from myNumber if number is null. Else return the number. Also check the types. Jsondecode returns a map and your function returns a future string – Afridi Kayal Jan 03 '21 at 05:18

0 Answers0