Home > OS >  Flutter loading data from SharedPreference before the page loads
Flutter loading data from SharedPreference before the page loads

Time:09-23

I pull more than one data from ListString and then separate them with a For Loop, make an object and then add it to a list and add this list to another list and DropDownList adds elements in that list. But the problem is when i trying to adding list(object list) to the other list(DropDownList list) I can't add elements.

code:

    late String selectedValue = '';
  List<String> dropDownItemValue = [];
  List<NotePages> notePages = [];
  final List<NotePages> pages = [];

  Future<NotePages?> read() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();

    var keys = prefs.getKeys();

    for (var key in keys) {
      var pageList = prefs.getStringList(key);

      if (pageList?[0] == 'page') {
        NotePages page = new NotePages(
            type: pageList![0],
            pageName: pageList[1],
            createdTime: DateTime.parse(pageList[2]));

        pages.add(page);
        await addInTheList();
      }
    }
  }

  addInTheList() {
    for (var i = 0; i < pages.length; i  ) {
      notePages.add(pages[i]);
      print(pages[i]);
    }
  }

  @override
  void initState() {
    super.initState();

    read();

    for (var i = 0; i < notePages.length; i  ) {
      dropDownItemValue.add(notePages[i].pageName);
    }
    dropDownItemValue.add('');
    dropDownItemValue.add('Add Page');
    print(dropDownItemValue);
    // selected value must be contain at dropDownItemValue
    selectedValue = dropDownItemValue[0];
  }

When i use Then() in the initState the list adding elements to the other list i mean its working (i can see when i print the last list) but i can't open the DropDownList it acts like he has no element. Code like this:

  @override
  void initState() {
    super.initState();

    read().then((_) => {
          for (var i = 0; i < pages.length; i  ) {notePages.add(pages[i])},

          for (var i = 0; i < notePages.length; i  )
            {dropDownItemValue.add(notePages[i].pageName)},
          dropDownItemValue.add(''),
          dropDownItemValue.add('Add Page'),
          print(dropDownItemValue),
          // selected value must be contain at dropDownItemValue
          selectedValue = dropDownItemValue[0],
        });
  }

how can i solve this?

CodePudding user response:

I recommend using GetStorage

https://pub.dev/packages/get_storage

it's realtime so you won't need any async or future builder or anything.

just add this line to your main function:

void main() async {
  await GetStorage.init();
  runApp(MyApp());
}

and then use it like charm...

void setData(String key, dynamic value) => GetStorage().write(key, value);

int? getInt(String key) => GetStorage().read(key);

String? getString(String key) => GetStorage().read(key);

bool? getBool(String key) => GetStorage().read(key);

double? getDouble(String key) => GetStorage().read(key);

dynamic getData(String key) => GetStorage().read(key);

void clearData() async => GetStorage().erase();
  • Related